/*============================================================================= Copyright (c) 2001-2011 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 #include #include #include #include #include #include #include #include #include #include #include struct copy_all { copy_all() {} copy_all(copy_all const&) {} template copy_all(T const& x) { foo(x); // should fail! } }; struct abstract { virtual void foo() = 0; }; int main() { using namespace boost::fusion; using namespace boost; namespace fusion = boost::fusion; using boost::fusion::pair; using boost::fusion::make_pair; std::cout << tuple_open('['); std::cout << tuple_close(']'); std::cout << tuple_delimiter(", "); { typedef map< pair , pair , pair > map_type; BOOST_MPL_ASSERT((traits::is_associative)); BOOST_MPL_ASSERT((traits::is_random_access)); map_type m( make_pair('X') , make_pair("Men") , make_pair(2)); std::cout << at_key(m) << std::endl; std::cout << at_key(m) << std::endl; std::cout << at_key(m) << std::endl; BOOST_TEST(at_key(m) == 'X'); BOOST_TEST(at_key(m) == "Men"); BOOST_TEST(at_key(m) == 2); BOOST_STATIC_ASSERT(( boost::is_same::type, char>::value)); BOOST_STATIC_ASSERT(( boost::is_same::type, std::string>::value)); BOOST_STATIC_ASSERT(( boost::is_same::type, int>::value)); std::cout << m << std::endl; BOOST_STATIC_ASSERT((boost::fusion::result_of::has_key::value)); BOOST_STATIC_ASSERT((boost::fusion::result_of::has_key::value)); BOOST_STATIC_ASSERT((boost::fusion::result_of::has_key::value)); BOOST_STATIC_ASSERT((!boost::fusion::result_of::has_key::value)); std::cout << deref_data(begin(m)) << std::endl; std::cout << deref_data(fusion::next(begin(m))) << std::endl; BOOST_TEST(deref_data(begin(m)) == 'X'); BOOST_TEST(deref_data(fusion::next(begin(m))) == "Men"); BOOST_TEST(deref_data(fusion::next(next(begin(m)))) == 2); BOOST_STATIC_ASSERT((boost::is_same::type>::type, int>::value)); BOOST_STATIC_ASSERT((boost::is_same::type>::type>::type, double>::value)); BOOST_STATIC_ASSERT((boost::is_same::type>::type>::type>::type, abstract>::value)); BOOST_STATIC_ASSERT((boost::is_same::type>::type, char>::value)); BOOST_STATIC_ASSERT((boost::is_same::type>::type>::type, std::string>::value)); BOOST_STATIC_ASSERT((boost::is_same::type>::type>::type>::type, int>::value)); // Test random access interface. pair a = at_c<0>(m); (void) a; pair b = at_c<1>(m); pair c = at_c<2>(m); (void)c; } // iterators & random access interface. { typedef pair, std::string> pair0; typedef pair, std::string> pair1; typedef pair, std::string> pair2; typedef pair, std::string> pair3; typedef pair, std::string> pair4; typedef map< pair0, pair1, pair2, pair3, pair4 > map_type; map_type m( pair0("zero"), pair1("one"), pair2("two"), pair3("three"), pair4("four") ); BOOST_AUTO( it0, begin(m) ); BOOST_TEST((deref(it0) == pair0("zero"))); BOOST_AUTO( it1, fusion::next(it0) ); BOOST_TEST((deref(it1) == pair1("one"))); BOOST_AUTO( it2, fusion::next(it1) ); BOOST_TEST((deref(it2) == pair2("two"))); BOOST_AUTO( it3, fusion::next(it2) ); BOOST_TEST((deref(it3) == pair3("three"))); BOOST_AUTO( it4, fusion::next(it3) ); BOOST_TEST((deref(it4) == pair4("four"))); BOOST_TEST((deref(fusion::advance_c<4>(it0)) == deref(it4))); // Bi-directional BOOST_TEST((deref(fusion::prior(it4)) == deref(it3) )); BOOST_TEST((deref(fusion::prior(it3)) == deref(it2) )); BOOST_TEST((deref(fusion::prior(it2)) == deref(it1) )); BOOST_TEST((deref(fusion::prior(it1)) == deref(it0) )); } { std::cout << make_map('X', 123) << std::endl; BOOST_TEST(at_key(make_map('X', 123)) == 'X'); BOOST_TEST(at_key(make_map('X', 123)) == 123); } { // test for copy construction of fusion pairs // make sure that the correct constructor is called pair p1; pair p2 = p1; (void)p2; } { // compile test only // make sure result_of::deref_data returns a reference typedef map > map_type; typedef boost::fusion::result_of::begin::type i_type; typedef boost::fusion::result_of::deref_data::type r_type; BOOST_STATIC_ASSERT((boost::is_same::value)); } { // compile test only // make sure result_of::deref_data is const correct typedef map > const map_type; typedef boost::fusion::result_of::begin::type i_type; typedef boost::fusion::result_of::deref_data::type r_type; BOOST_STATIC_ASSERT((boost::is_same::value)); } return boost::report_errors(); }