/*============================================================================= 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 #include #include #include #include #include #include #include #include #if !defined(FUSION_AT) #define FUSION_AT at_c #endif #if !defined(FUSION_MAKE) #define FUSION_MAKE BOOST_PP_CAT(make_, FUSION_SEQUENCE) #endif #if !defined(FUSION_TIE) #define FUSION_TIE BOOST_PP_CAT(FUSION_SEQUENCE, _tie) #endif namespace test_detail { // classes with different kinds of conversions class AA {}; class BB : public AA {}; struct CC { CC() {} CC(const BB&) {} }; struct DD { operator CC() const { return CC(); }; }; } boost::fusion::FUSION_SEQUENCE foo(int i) { return boost::fusion::FUSION_MAKE(i, i+1, i+2, i+3); } void test_mpl() { using namespace boost::fusion; typedef FUSION_SEQUENCE seq; typedef boost::mpl::insert_range< boost::mpl::vector<> , boost::mpl::end< boost::mpl::vector<> >::type , seq >::type sequence; typedef boost::mpl::equal > equal; BOOST_STATIC_ASSERT(equal::value); } void test() { using namespace boost::fusion; using namespace test_detail; FUSION_SEQUENCE t1(4, 'a'); FUSION_SEQUENCE t2(5, 'b'); t2 = t1; BOOST_TEST(FUSION_AT<0>(t1) == FUSION_AT<0>(t2)); BOOST_TEST(FUSION_AT<1>(t1) == FUSION_AT<1>(t2)); FUSION_SEQUENCE t3(2, "a"); t3 = t1; BOOST_TEST((double)FUSION_AT<0>(t1) == FUSION_AT<0>(t3)); BOOST_TEST(FUSION_AT<1>(t1) == FUSION_AT<1>(t3)[0]); // testing copy and assignment with implicit conversions // between elements testing tie FUSION_SEQUENCE t; FUSION_SEQUENCE a(t); a = t; int i; char c; double d; FUSION_TIE(i, c, d) = FUSION_MAKE(1, 'a', 5.5); BOOST_TEST(i==1); BOOST_TEST(c=='a'); BOOST_TEST(d>5.4 && d<5.6); // returning a tuple with conversion foo(2); test_mpl(); }