// Boost.TypeErasure library // // Copyright 2011 Steven Watanabe // // 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) // // $Id$ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define BOOST_TEST_MAIN #include using namespace boost::type_erasure; template struct common : ::boost::mpl::vector< copy_constructible, typeid_ > {}; BOOST_AUTO_TEST_CASE(test_same) { tuple, _a, _a> t(1, 2); BOOST_CHECK_EQUAL(any_cast(get<0>(t)), 1); BOOST_CHECK_EQUAL(any_cast(get<1>(t)), 2); } BOOST_AUTO_TEST_CASE(test_degenerate) { tuple > t; } template typename T::value_type get_static(T) { return T::value; } BOOST_AUTO_TEST_CASE(test_fusion) { typedef boost::mpl::vector, common<_b>, addable<_a, _b> > test_concept; tuple t(2.0, 1); BOOST_CHECK_EQUAL(any_cast(boost::fusion::at_c<0>(t)), 2.0); BOOST_CHECK_EQUAL(any_cast(boost::fusion::at_c<1>(t)), 1); BOOST_CHECK_EQUAL(any_cast(boost::fusion::front(t)), 2.0); BOOST_CHECK_EQUAL(any_cast(boost::fusion::back(t)), 1); BOOST_CHECK_EQUAL(get_static(boost::fusion::empty(t)), false); BOOST_CHECK_EQUAL(get_static(boost::fusion::size(t)), 2); BOOST_CHECK_EQUAL(get_static(boost::fusion::distance(boost::fusion::begin(t), boost::fusion::end(t))), 2); BOOST_CHECK_EQUAL(get_static(boost::fusion::distance(boost::fusion::next(boost::fusion::begin(t)), boost::fusion::end(t))), 1); BOOST_CHECK_EQUAL(get_static(boost::fusion::distance(boost::fusion::begin(t), boost::fusion::prior(boost::fusion::end(t)))), 1); BOOST_CHECK_EQUAL(get_static(boost::fusion::distance(boost::fusion::advance_c<2>(boost::fusion::begin(t)), boost::fusion::end(t))), 0); BOOST_CHECK_EQUAL(any_cast(boost::fusion::deref(boost::fusion::begin(t))), 2.0); } BOOST_AUTO_TEST_CASE(test_fusion_const) { typedef boost::mpl::vector, common<_b>, addable<_a, _b> > test_concept; const tuple t(2.0, 1); BOOST_CHECK_EQUAL(any_cast(boost::fusion::at_c<0>(t)), 2.0); BOOST_CHECK_EQUAL(any_cast(boost::fusion::at_c<1>(t)), 1); BOOST_CHECK_EQUAL(any_cast(boost::fusion::front(t)), 2.0); BOOST_CHECK_EQUAL(any_cast(boost::fusion::back(t)), 1); BOOST_CHECK_EQUAL(get_static(boost::fusion::empty(t)), false); BOOST_CHECK_EQUAL(get_static(boost::fusion::size(t)), 2); BOOST_CHECK_EQUAL(get_static(boost::fusion::distance(boost::fusion::begin(t), boost::fusion::end(t))), 2); BOOST_CHECK_EQUAL(get_static(boost::fusion::distance(boost::fusion::next(boost::fusion::begin(t)), boost::fusion::end(t))), 1); BOOST_CHECK_EQUAL(get_static(boost::fusion::distance(boost::fusion::begin(t), boost::fusion::prior(boost::fusion::end(t)))), 1); BOOST_CHECK_EQUAL(get_static(boost::fusion::distance(boost::fusion::advance_c<2>(boost::fusion::begin(t)), boost::fusion::end(t))), 0); BOOST_CHECK_EQUAL(any_cast(boost::fusion::deref(boost::fusion::begin(t))), 2.0); }