| /*============================================================================= |
| Copyright (c) 1999-2003 Jaakko Jarvi |
| Copyright (c) 2001-2006 Joel de Guzman |
| |
| Distributed under the Boost Software License, Version 1.0. (See accompanying |
| file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) |
| ==============================================================================*/ |
| #include <boost/detail/lightweight_test.hpp> |
| #include <boost/fusion/sequence/intrinsic/at.hpp> |
| #include <boost/fusion/sequence/comparison/equal_to.hpp> |
| #include <string> |
| |
| #if !defined(FUSION_AT) |
| #define FUSION_AT at_c |
| #endif |
| |
| #if !defined(FUSION_MAKE) |
| #define FUSION_MAKE BOOST_PP_CAT(make_, FUSION_SEQUENCE) |
| #endif |
| |
| namespace test_detail |
| { |
| // something to prevent warnings for unused variables |
| template<class T> void dummy(const T&) {} |
| |
| class A {}; |
| class B {}; |
| } |
| |
| void make_tuple_test() {} |
| |
| void |
| test() |
| { |
| using namespace boost::fusion; |
| using namespace test_detail; |
| |
| { |
| FUSION_SEQUENCE<int, char> t1 = FUSION_MAKE(5, 'a'); |
| BOOST_TEST(FUSION_AT<0>(t1) == 5); |
| BOOST_TEST(FUSION_AT<1>(t1) == 'a'); |
| |
| FUSION_SEQUENCE<int, std::string> t2; |
| t2 = FUSION_MAKE((short int)2, std::string("Hi")); |
| BOOST_TEST(FUSION_AT<0>(t2) == 2); |
| BOOST_TEST(FUSION_AT<1>(t2) == "Hi"); |
| } |
| |
| { // This test was previously disallowed for non-PTS compilers. |
| A a = A(); B b; |
| const A ca = a; |
| FUSION_MAKE(boost::cref(a), b); |
| FUSION_MAKE(boost::ref(a), b); |
| FUSION_MAKE(boost::ref(a), boost::cref(b)); |
| FUSION_MAKE(boost::ref(ca)); |
| } |
| |
| { // the result of make_xxx is assignable: |
| BOOST_TEST(FUSION_MAKE(2, 4, 6) == |
| (FUSION_MAKE(1, 2, 3) = FUSION_MAKE(2, 4, 6))); |
| } |
| |
| { // This test was previously disallowed for non-PTS compilers. |
| FUSION_MAKE("Donald", "Daisy"); // should work; |
| // std::make_pair("Doesn't","Work"); // fails |
| } |
| |
| { |
| // You can store a reference to a function in a sequence |
| FUSION_SEQUENCE<void(&)()> adf(make_tuple_test); |
| dummy(adf); // avoid warning for unused variable |
| } |
| |
| #if defined(FUSION_TEST_FAIL) |
| { |
| // But make_xxx doesn't work |
| // with function references, since it creates a const |
| // qualified function type |
| |
| FUSION_MAKE(make_tuple_test); |
| } |
| #endif |
| |
| { |
| // With function pointers, make_xxx works just fine |
| FUSION_MAKE(&make_tuple_test); |
| } |
| } |