// 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 #define BOOST_TEST_MAIN #include using namespace boost::type_erasure; template struct common : ::boost::mpl::vector< copy_constructible, typeid_ > {}; BOOST_AUTO_TEST_CASE(test_implicit) { any > x = 1; BOOST_CHECK_EQUAL(any_cast(x), 1); } void func() {} BOOST_AUTO_TEST_CASE(test_decay) { char array[] = "Hello World!"; const char carray[] = "Hello World!"; any > x1(array); any > y1(func); any > z1(carray); BOOST_CHECK_EQUAL(any_cast(x1), &array[0]); BOOST_CHECK(any_cast(y1) == &func); BOOST_CHECK_EQUAL(any_cast(z1), &carray[0]); any > x2(array, make_binding > >()); any > y2(func, make_binding > >()); any > z2(carray, make_binding > >()); BOOST_CHECK_EQUAL(any_cast(x2), &array[0]); BOOST_CHECK(any_cast(y2) == &func); BOOST_CHECK_EQUAL(any_cast(z2), &carray[0]); static_binding > > bx3; static_binding > > by3; static_binding > > bz3; any > x3(array, bx3); any > y3(func, by3); any > z3(carray, bz3); BOOST_CHECK_EQUAL(any_cast(x3), &array[0]); BOOST_CHECK(any_cast(y3) == &func); BOOST_CHECK_EQUAL(any_cast(z3), &carray[0]); } enum { lvalue, const_lvalue, rvalue #ifdef BOOST_NO_CXX11_RVALUE_REFERENCES = lvalue #endif }; template int make_arg_type(); template<> int make_arg_type() { return rvalue; } template<> int make_arg_type() { return lvalue; } template<> int make_arg_type() { return const_lvalue; } enum { id_int = 4, id_copy = 8 }; std::vector make_vector() { return std::vector(); } template std::vector make_vector(T t0) { std::vector result; result.push_back(t0); return result; } template std::vector make_vector(T t0, T t1) { std::vector result; result.push_back(t0); result.push_back(t1); return result; } #ifdef BOOST_MSVC #pragma warning(disable:4521) // multiple copy constructors specified #endif struct test_class { test_class() {} test_class(const test_class &) : args(make_vector(const_lvalue | id_copy)) {} test_class(test_class &) : args(make_vector(lvalue | id_copy)) {} #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES test_class(test_class &&) : args(make_vector(rvalue | id_copy)) {} template test_class(T0&& t0) : args(make_vector(t0 | make_arg_type())) {} template test_class(T0&& t0, T1&& t1) : args(make_vector(t0 | make_arg_type(), t1 | make_arg_type())) {} #else test_class(int& i0) : args(make_vector(i0 | lvalue)) {} test_class(const int& i0) : args(make_vector(i0 | const_lvalue)) {} test_class(int& i0, int& i1) : args(make_vector(i0 | lvalue, i1 | lvalue)) {} test_class(int& i0, const int& i1) : args(make_vector(i0 | lvalue, i1 | const_lvalue)) {} test_class(const int& i0, int& i1) : args(make_vector(i0 | const_lvalue, i1 | lvalue)) {} test_class(const int& i0, const int& i1) : args(make_vector(i0 | const_lvalue, i1 | const_lvalue)) {} #endif std::vector args; }; template struct make_arg_impl; template<> struct make_arg_impl { static int apply() { return id_int; } }; template struct make_arg_impl > { static binding apply() { return make_binding< ::boost::mpl::map< ::boost::mpl::pair<_a, test_class>, ::boost::mpl::pair<_b, int> > >(); } }; template struct make_arg_impl&> { static any& apply() { static any result( test_class(), make_binding< ::boost::mpl::map< ::boost::mpl::pair<_a, test_class>, ::boost::mpl::pair<_b, int> > >()); return result; } }; template struct make_arg_impl&> { static any& apply() { static any result( (int)id_int, make_binding< ::boost::mpl::map< ::boost::mpl::pair<_a, test_class>, ::boost::mpl::pair<_b, int> > >()); return result; } }; template struct make_arg_impl > { static any apply() { return make_arg_impl&>::apply(); } }; template struct make_arg_impl > { static any apply() { return make_arg_impl&>::apply(); } }; template struct make_arg_impl > { static any apply() { return make_arg_impl&>::apply(); } }; template struct make_arg_impl > { static any apply() { return make_arg_impl&>::apply(); } }; #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES template struct make_arg_impl > { static any apply() { return std::move(make_arg_impl&>::apply()); } }; #endif template struct make_arg_impl : make_arg_impl {}; template struct make_arg_impl { static T& apply() { static T result = make_arg_impl::apply(); return result; } }; template struct make_arg_impl { static T& apply() { return make_arg_impl::apply(); } }; #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES template struct make_arg_impl { static T&& apply() { return std::move(make_arg_impl::apply()); } }; #endif #ifdef BOOST_NO_CXX11_RVALUE_REFERENCES template T make_arg() { return make_arg_impl::apply(); } #else template T&& make_arg() { return make_arg_impl::apply(); } #endif int get_value(int i) { return i; } template int get_value(const T& t) { return any_cast(t); } template struct tester; template struct tester { static std::vector apply() { any x(make_arg()); const test_class& result = any_cast(x); return result.args; } }; template struct tester { static std::vector apply() { any x(make_arg(), make_arg()); const test_class& result = any_cast(x); return result.args; } }; template struct tester { static std::vector apply() { any x(make_arg(), make_arg(), make_arg()); const test_class& result = any_cast(x); return result.args; } }; #ifdef BOOST_NO_CXX11_RVALUE_REFERENCES // We need copy_constructible in order to get an rvalue. #define CONSTRUCT_COMMON(p) common

#else // Don't include the copy constructor if we don't // need it, as it can hide the non-const copy constructor. #define CONSTRUCT_COMMON(p) destructible

, typeid_

#endif #define TEST_CONSTRUCT(sig, args, expected_) \ {\ typedef ::boost::mpl::vector<\ CONSTRUCT_COMMON(_a), \ common<_b>,\ constructible,\ extra\ > C;\ std::vector result = tester::apply();\ std::vector expected = make_vector expected_;\ BOOST_CHECK_EQUAL_COLLECTIONS(result.begin(), result.end(), \ expected.begin(), expected.end());\ } typedef ::boost::mpl::vector< ::boost::mpl::vector<>, ::boost::type_erasure::relaxed > maybe_relaxed; BOOST_AUTO_TEST_CASE_TEMPLATE(test_default, extra, maybe_relaxed) { TEST_CONSTRUCT(_a(), (binding), ()); TEST_CONSTRUCT(_a(), (binding&), ()); TEST_CONSTRUCT(_a(), (const binding&), ()); } // test all forms of direct construction that take 1 argument BOOST_AUTO_TEST_CASE_TEMPLATE(test_construct1, extra, maybe_relaxed) { // construction from int TEST_CONSTRUCT(_a(int&), (binding, int&), (lvalue | id_int)); TEST_CONSTRUCT(_a(int&), (binding&, int&), (lvalue | id_int)); TEST_CONSTRUCT(_a(int&), (const binding&, int&), (lvalue | id_int)); TEST_CONSTRUCT(_a(const int&), (binding, int), (const_lvalue | id_int)); TEST_CONSTRUCT(_a(const int&), (binding, int&), (const_lvalue | id_int)); TEST_CONSTRUCT(_a(const int&), (binding, const int&), (const_lvalue | id_int)); TEST_CONSTRUCT(_a(const int&), (binding&, int), (const_lvalue | id_int)); TEST_CONSTRUCT(_a(const int&), (binding&, int&), (const_lvalue | id_int)); TEST_CONSTRUCT(_a(const int&), (binding&, const int&), (const_lvalue | id_int)); TEST_CONSTRUCT(_a(const int&), (const binding&, int), (const_lvalue | id_int)); TEST_CONSTRUCT(_a(const int&), (const binding&, int&), (const_lvalue | id_int)); TEST_CONSTRUCT(_a(const int&), (const binding&, const int&), (const_lvalue | id_int)); TEST_CONSTRUCT(_a(int), (binding, int), (rvalue | id_int)); TEST_CONSTRUCT(_a(int), (binding, int&), (rvalue | id_int)); TEST_CONSTRUCT(_a(int), (binding, const int&), (rvalue | id_int)); TEST_CONSTRUCT(_a(int), (binding&, int), (rvalue | id_int)); TEST_CONSTRUCT(_a(int), (binding&, int&), (rvalue | id_int)); TEST_CONSTRUCT(_a(int), (binding&, const int&), (rvalue | id_int)); TEST_CONSTRUCT(_a(int), (const binding&, int), (rvalue | id_int)); TEST_CONSTRUCT(_a(int), (const binding&, int&), (rvalue | id_int)); TEST_CONSTRUCT(_a(int), (const binding&, const int&), (rvalue | id_int)); #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES TEST_CONSTRUCT(_a(int&&), (binding, int), (rvalue | id_int)); TEST_CONSTRUCT(_a(int&&), (binding&, int), (rvalue | id_int)); TEST_CONSTRUCT(_a(int&&), (const binding&, int), (rvalue | id_int)); #endif // Test same any type #ifndef BOOST_NO_CXX11_REF_QUALIFIERS // ambiguous with the copy constructor in C++03 TEST_CONSTRUCT(_a(_a&), (any&), (lvalue | id_copy)); TEST_CONSTRUCT(_a(_a&), (binding, any&), (lvalue | id_copy)); TEST_CONSTRUCT(_a(_a&), (binding&, any&), (lvalue | id_copy)); TEST_CONSTRUCT(_a(_a&), (const binding&, any&), (lvalue | id_copy)); #endif TEST_CONSTRUCT(_a(const _a&), (any), (const_lvalue | id_copy)); TEST_CONSTRUCT(_a(const _a&), (any&), (const_lvalue | id_copy)); TEST_CONSTRUCT(_a(const _a&), (const any&), (const_lvalue | id_copy)); TEST_CONSTRUCT(_a(const _a&), (binding, any), (const_lvalue | id_copy)); TEST_CONSTRUCT(_a(const _a&), (binding, any&), (const_lvalue | id_copy)); TEST_CONSTRUCT(_a(const _a&), (binding, const any&), (const_lvalue | id_copy)); TEST_CONSTRUCT(_a(const _a&), (binding&, any), (const_lvalue | id_copy)); TEST_CONSTRUCT(_a(const _a&), (binding&, any&), (const_lvalue | id_copy)); TEST_CONSTRUCT(_a(const _a&), (binding&, const any&), (const_lvalue | id_copy)); TEST_CONSTRUCT(_a(const _a&), (const binding&, any), (const_lvalue | id_copy)); TEST_CONSTRUCT(_a(const _a&), (const binding&, any&), (const_lvalue | id_copy)); TEST_CONSTRUCT(_a(const _a&), (const binding&, const any&), (const_lvalue | id_copy)); #ifndef BOOST_NO_CXX11_REF_QUALIFIERS #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES TEST_CONSTRUCT(_a(_a&&), (any), (rvalue | id_copy)); TEST_CONSTRUCT(_a(_a&&), (binding, any), (rvalue | id_copy)); TEST_CONSTRUCT(_a(_a&&), (binding&, any), (rvalue | id_copy)); TEST_CONSTRUCT(_a(_a&&), (const binding&, any), (rvalue | id_copy)); #endif #endif // test other any type TEST_CONSTRUCT(_a(_b&), (any&), (lvalue | id_int)); TEST_CONSTRUCT(_a(_b&), (binding, any&), (lvalue | id_int)); TEST_CONSTRUCT(_a(_b&), (binding&, any&), (lvalue | id_int)); TEST_CONSTRUCT(_a(_b&), (const binding&, any&), (lvalue | id_int)); TEST_CONSTRUCT(_a(const _b&), (any), (const_lvalue | id_int)); TEST_CONSTRUCT(_a(const _b&), (any&), (const_lvalue | id_int)); TEST_CONSTRUCT(_a(const _b&), (const any&), (const_lvalue | id_int)); TEST_CONSTRUCT(_a(const _b&), (binding, any), (const_lvalue | id_int)); TEST_CONSTRUCT(_a(const _b&), (binding, any&), (const_lvalue | id_int)); TEST_CONSTRUCT(_a(const _b&), (binding, const any&), (const_lvalue | id_int)); TEST_CONSTRUCT(_a(const _b&), (binding&, any), (const_lvalue | id_int)); TEST_CONSTRUCT(_a(const _b&), (binding&, any&), (const_lvalue | id_int)); TEST_CONSTRUCT(_a(const _b&), (binding&, const any&), (const_lvalue | id_int)); TEST_CONSTRUCT(_a(const _b&), (const binding&, any), (const_lvalue | id_int)); TEST_CONSTRUCT(_a(const _b&), (const binding&, any&), (const_lvalue | id_int)); TEST_CONSTRUCT(_a(const _b&), (const binding&, const any&), (const_lvalue | id_int)); TEST_CONSTRUCT(_a(_b), (any), (rvalue | id_int)); TEST_CONSTRUCT(_a(_b), (any&), (rvalue | id_int)); TEST_CONSTRUCT(_a(_b), (const any&), (rvalue | id_int)); TEST_CONSTRUCT(_a(_b), (binding, any), (rvalue | id_int)); TEST_CONSTRUCT(_a(_b), (binding, any&), (rvalue | id_int)); TEST_CONSTRUCT(_a(_b), (binding, const any&), (rvalue | id_int)); TEST_CONSTRUCT(_a(_b), (binding&, any), (rvalue | id_int)); TEST_CONSTRUCT(_a(_b), (binding&, any&), (rvalue | id_int)); TEST_CONSTRUCT(_a(_b), (binding&, const any&), (rvalue | id_int)); TEST_CONSTRUCT(_a(_b), (const binding&, any), (rvalue | id_int)); TEST_CONSTRUCT(_a(_b), (const binding&, any&), (rvalue | id_int)); TEST_CONSTRUCT(_a(_b), (const binding&, const any&), (rvalue | id_int)); #ifndef BOOST_NO_CXX11_REF_QUALIFIERS #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES TEST_CONSTRUCT(_a(_b&&), (any), (rvalue | id_int)); TEST_CONSTRUCT(_a(_b&&), (binding, any), (rvalue | id_int)); TEST_CONSTRUCT(_a(_b&&), (binding&, any), (rvalue | id_int)); TEST_CONSTRUCT(_a(_b&&), (const binding&, any), (rvalue | id_int)); #endif #endif // test any reference type TEST_CONSTRUCT(_a(_b&), (any), (lvalue | id_int)); TEST_CONSTRUCT(_a(_b&), (any&), (lvalue | id_int)); TEST_CONSTRUCT(_a(_b&), (const any&), (lvalue | id_int)); TEST_CONSTRUCT(_a(_b&), (binding, any), (lvalue | id_int)); TEST_CONSTRUCT(_a(_b&), (binding, any&), (lvalue | id_int)); TEST_CONSTRUCT(_a(_b&), (binding, const any&), (lvalue | id_int)); TEST_CONSTRUCT(_a(_b&), (binding&, any), (lvalue | id_int)); TEST_CONSTRUCT(_a(_b&), (binding&, any&), (lvalue | id_int)); TEST_CONSTRUCT(_a(_b&), (binding&, const any&), (lvalue | id_int)); TEST_CONSTRUCT(_a(_b&), (const binding&, any), (lvalue | id_int)); TEST_CONSTRUCT(_a(_b&), (const binding&, any&), (lvalue | id_int)); TEST_CONSTRUCT(_a(_b&), (const binding&, const any&), (lvalue | id_int)); TEST_CONSTRUCT(_a(const _b&), (any), (const_lvalue | id_int)); TEST_CONSTRUCT(_a(const _b&), (any&), (const_lvalue | id_int)); TEST_CONSTRUCT(_a(const _b&), (const any&), (const_lvalue | id_int)); TEST_CONSTRUCT(_a(const _b&), (binding, any), (const_lvalue | id_int)); TEST_CONSTRUCT(_a(const _b&), (binding, any&), (const_lvalue | id_int)); TEST_CONSTRUCT(_a(const _b&), (binding, const any&), (const_lvalue | id_int)); TEST_CONSTRUCT(_a(const _b&), (binding&, any), (const_lvalue | id_int)); TEST_CONSTRUCT(_a(const _b&), (binding&, any&), (const_lvalue | id_int)); TEST_CONSTRUCT(_a(const _b&), (binding&, const any&), (const_lvalue | id_int)); TEST_CONSTRUCT(_a(const _b&), (const binding&, any), (const_lvalue | id_int)); TEST_CONSTRUCT(_a(const _b&), (const binding&, any&), (const_lvalue | id_int)); TEST_CONSTRUCT(_a(const _b&), (const binding&, const any&), (const_lvalue | id_int)); TEST_CONSTRUCT(_a(_b), (any), (rvalue | id_int)); TEST_CONSTRUCT(_a(_b), (any&), (rvalue | id_int)); TEST_CONSTRUCT(_a(_b), (const any&), (rvalue | id_int)); TEST_CONSTRUCT(_a(_b), (binding, any), (rvalue | id_int)); TEST_CONSTRUCT(_a(_b), (binding, any&), (rvalue | id_int)); TEST_CONSTRUCT(_a(_b), (binding, const any&), (rvalue | id_int)); TEST_CONSTRUCT(_a(_b), (binding&, any), (rvalue | id_int)); TEST_CONSTRUCT(_a(_b), (binding&, any&), (rvalue | id_int)); TEST_CONSTRUCT(_a(_b), (binding&, const any&), (rvalue | id_int)); TEST_CONSTRUCT(_a(_b), (const binding&, any), (rvalue | id_int)); TEST_CONSTRUCT(_a(_b), (const binding&, any&), (rvalue | id_int)); TEST_CONSTRUCT(_a(_b), (const binding&, const any&), (rvalue | id_int)); // test const any reference type TEST_CONSTRUCT(_a(const _b&), (any), (const_lvalue | id_int)); TEST_CONSTRUCT(_a(const _b&), (any&), (const_lvalue | id_int)); TEST_CONSTRUCT(_a(const _b&), (const any&), (const_lvalue | id_int)); TEST_CONSTRUCT(_a(const _b&), (binding, any), (const_lvalue | id_int)); TEST_CONSTRUCT(_a(const _b&), (binding, any&), (const_lvalue | id_int)); TEST_CONSTRUCT(_a(const _b&), (binding, const any&), (const_lvalue | id_int)); TEST_CONSTRUCT(_a(const _b&), (binding&, any), (const_lvalue | id_int)); TEST_CONSTRUCT(_a(const _b&), (binding&, any&), (const_lvalue | id_int)); TEST_CONSTRUCT(_a(const _b&), (binding&, const any&), (const_lvalue | id_int)); TEST_CONSTRUCT(_a(const _b&), (const binding&, any), (const_lvalue | id_int)); TEST_CONSTRUCT(_a(const _b&), (const binding&, any&), (const_lvalue | id_int)); TEST_CONSTRUCT(_a(const _b&), (const binding&, const any&), (const_lvalue | id_int)); TEST_CONSTRUCT(_a(_b), (any), (rvalue | id_int)); TEST_CONSTRUCT(_a(_b), (any&), (rvalue | id_int)); TEST_CONSTRUCT(_a(_b), (const any&), (rvalue | id_int)); TEST_CONSTRUCT(_a(_b), (binding, any), (rvalue | id_int)); TEST_CONSTRUCT(_a(_b), (binding, any&), (rvalue | id_int)); TEST_CONSTRUCT(_a(_b), (binding, const any&), (rvalue | id_int)); TEST_CONSTRUCT(_a(_b), (binding&, any), (rvalue | id_int)); TEST_CONSTRUCT(_a(_b), (binding&, any&), (rvalue | id_int)); TEST_CONSTRUCT(_a(_b), (binding&, const any&), (rvalue | id_int)); TEST_CONSTRUCT(_a(_b), (const binding&, any), (rvalue | id_int)); TEST_CONSTRUCT(_a(_b), (const binding&, any&), (rvalue | id_int)); TEST_CONSTRUCT(_a(_b), (const binding&, const any&), (rvalue | id_int)); #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES // test any rvalue reference type TEST_CONSTRUCT(_a(const _b&), (any), (const_lvalue | id_int)); TEST_CONSTRUCT(_a(const _b&), (any&), (const_lvalue | id_int)); TEST_CONSTRUCT(_a(const _b&), (const any&), (const_lvalue | id_int)); TEST_CONSTRUCT(_a(const _b&), (binding, any), (const_lvalue | id_int)); TEST_CONSTRUCT(_a(const _b&), (binding, any&), (const_lvalue | id_int)); TEST_CONSTRUCT(_a(const _b&), (binding, const any&), (const_lvalue | id_int)); TEST_CONSTRUCT(_a(const _b&), (binding&, any), (const_lvalue | id_int)); TEST_CONSTRUCT(_a(const _b&), (binding&, any&), (const_lvalue | id_int)); TEST_CONSTRUCT(_a(const _b&), (binding&, const any&), (const_lvalue | id_int)); TEST_CONSTRUCT(_a(const _b&), (const binding&, any), (const_lvalue | id_int)); TEST_CONSTRUCT(_a(const _b&), (const binding&, any&), (const_lvalue | id_int)); TEST_CONSTRUCT(_a(const _b&), (const binding&, const any&), (const_lvalue | id_int)); TEST_CONSTRUCT(_a(_b), (any), (rvalue | id_int)); TEST_CONSTRUCT(_a(_b), (any&), (rvalue | id_int)); TEST_CONSTRUCT(_a(_b), (const any&), (rvalue | id_int)); TEST_CONSTRUCT(_a(_b), (binding, any), (rvalue | id_int)); TEST_CONSTRUCT(_a(_b), (binding, any&), (rvalue | id_int)); TEST_CONSTRUCT(_a(_b), (binding, const any&), (rvalue | id_int)); TEST_CONSTRUCT(_a(_b), (binding&, any), (rvalue | id_int)); TEST_CONSTRUCT(_a(_b), (binding&, any&), (rvalue | id_int)); TEST_CONSTRUCT(_a(_b), (binding&, const any&), (rvalue | id_int)); TEST_CONSTRUCT(_a(_b), (const binding&, any), (rvalue | id_int)); TEST_CONSTRUCT(_a(_b), (const binding&, any&), (rvalue | id_int)); TEST_CONSTRUCT(_a(_b), (const binding&, const any&), (rvalue | id_int)); TEST_CONSTRUCT(_a(_b&&), (any), (rvalue | id_int)); TEST_CONSTRUCT(_a(_b&&), (any&), (rvalue | id_int)); TEST_CONSTRUCT(_a(_b&&), (const any&), (rvalue | id_int)); TEST_CONSTRUCT(_a(_b&&), (binding, any), (rvalue | id_int)); TEST_CONSTRUCT(_a(_b&&), (binding, any&), (rvalue | id_int)); TEST_CONSTRUCT(_a(_b&&), (binding, const any&), (rvalue | id_int)); TEST_CONSTRUCT(_a(_b&&), (binding&, any), (rvalue | id_int)); TEST_CONSTRUCT(_a(_b&&), (binding&, any&), (rvalue | id_int)); TEST_CONSTRUCT(_a(_b&&), (binding&, const any&), (rvalue | id_int)); TEST_CONSTRUCT(_a(_b&&), (const binding&, any), (rvalue | id_int)); TEST_CONSTRUCT(_a(_b&&), (const binding&, any&), (rvalue | id_int)); TEST_CONSTRUCT(_a(_b&&), (const binding&, const any&), (rvalue | id_int)); #endif } // test constructors with 2 parameters BOOST_AUTO_TEST_CASE_TEMPLATE(test_construct2, extra, maybe_relaxed) { TEST_CONSTRUCT(_a(int, int), (binding, int, int), (rvalue | id_int, rvalue | id_int)); TEST_CONSTRUCT(_a(int, int), (binding, int, int&), (rvalue | id_int, rvalue | id_int)); TEST_CONSTRUCT(_a(int, int), (binding, int, const int&), (rvalue | id_int, rvalue | id_int)); TEST_CONSTRUCT(_a(int, int), (binding, int&, int), (rvalue | id_int, rvalue | id_int)); TEST_CONSTRUCT(_a(int, int), (binding, int&, int&), (rvalue | id_int, rvalue | id_int)); TEST_CONSTRUCT(_a(int, int), (binding, int&, const int&), (rvalue | id_int, rvalue | id_int)); TEST_CONSTRUCT(_a(int, int), (binding, const int&, int), (rvalue | id_int, rvalue | id_int)); TEST_CONSTRUCT(_a(int, int), (binding, const int&, int&), (rvalue | id_int, rvalue | id_int)); TEST_CONSTRUCT(_a(int, int), (binding, const int&, const int&), (rvalue | id_int, rvalue | id_int)); TEST_CONSTRUCT(_a(int, int), (binding&, int, int), (rvalue | id_int, rvalue | id_int)); TEST_CONSTRUCT(_a(int, int), (binding&, int, int&), (rvalue | id_int, rvalue | id_int)); TEST_CONSTRUCT(_a(int, int), (binding&, int, const int&), (rvalue | id_int, rvalue | id_int)); TEST_CONSTRUCT(_a(int, int), (binding&, int&, int), (rvalue | id_int, rvalue | id_int)); TEST_CONSTRUCT(_a(int, int), (binding&, int&, int&), (rvalue | id_int, rvalue | id_int)); TEST_CONSTRUCT(_a(int, int), (binding&, int&, const int&), (rvalue | id_int, rvalue | id_int)); TEST_CONSTRUCT(_a(int, int), (binding&, const int&, int), (rvalue | id_int, rvalue | id_int)); TEST_CONSTRUCT(_a(int, int), (binding&, const int&, int&), (rvalue | id_int, rvalue | id_int)); TEST_CONSTRUCT(_a(int, int), (binding&, const int&, const int&), (rvalue | id_int, rvalue | id_int)); TEST_CONSTRUCT(_a(int, int), (const binding&, int, int), (rvalue | id_int, rvalue | id_int)); TEST_CONSTRUCT(_a(int, int), (const binding&, int, int&), (rvalue | id_int, rvalue | id_int)); TEST_CONSTRUCT(_a(int, int), (const binding&, int, const int&), (rvalue | id_int, rvalue | id_int)); TEST_CONSTRUCT(_a(int, int), (const binding&, int&, int), (rvalue | id_int, rvalue | id_int)); TEST_CONSTRUCT(_a(int, int), (const binding&, int&, int&), (rvalue | id_int, rvalue | id_int)); TEST_CONSTRUCT(_a(int, int), (const binding&, int&, const int&), (rvalue | id_int, rvalue | id_int)); TEST_CONSTRUCT(_a(int, int), (const binding&, const int&, int), (rvalue | id_int, rvalue | id_int)); TEST_CONSTRUCT(_a(int, int), (const binding&, const int&, int&), (rvalue | id_int, rvalue | id_int)); TEST_CONSTRUCT(_a(int, int), (const binding&, const int&, const int&), (rvalue | id_int, rvalue | id_int)); } BOOST_AUTO_TEST_CASE(test_overload) { typedef ::boost::mpl::vector< common<_a>, common<_b>, constructible<_a(_b)>, constructible<_a(std::size_t)> > test_concept; typedef ::boost::mpl::map< ::boost::mpl::pair<_a, std::vector >, ::boost::mpl::pair<_b, std::size_t> > types; binding table = make_binding(); any x(static_cast(10), make_binding()); any y(x); any z(table, 17); std::vector vec1(any_cast >(y)); BOOST_CHECK_EQUAL(vec1.size(), 10u); std::vector vec2(any_cast >(z)); BOOST_CHECK_EQUAL(vec2.size(), 17u); } template T as_rvalue(const T& arg) { return arg; } template const T& as_const(const T& arg) { return arg; } BOOST_AUTO_TEST_CASE(test_from_int_with_binding) { typedef ::boost::mpl::vector > test_concept; static_binding > > binding = make_binding > >(); int value = 4; any x1(value, binding); BOOST_CHECK_EQUAL(any_cast(x1), 4); any x2(value, as_rvalue(binding)); BOOST_CHECK_EQUAL(any_cast(x2), 4); any x3(value, as_const(binding)); BOOST_CHECK_EQUAL(any_cast(x3), 4); any y1(as_rvalue(value), binding); BOOST_CHECK_EQUAL(any_cast(y1), 4); any y2(as_rvalue(value), as_rvalue(binding)); BOOST_CHECK_EQUAL(any_cast(y2), 4); any y3(as_rvalue(value), as_const(binding)); BOOST_CHECK_EQUAL(any_cast(y3), 4); any z1(as_const(value), binding); BOOST_CHECK_EQUAL(any_cast(z1), 4); any z2(as_const(value), as_rvalue(binding)); BOOST_CHECK_EQUAL(any_cast(z2), 4); any z3(as_const(value), as_const(binding)); BOOST_CHECK_EQUAL(any_cast(z3), 4); } BOOST_AUTO_TEST_CASE(test_copy) { typedef ::boost::mpl::vector > test_concept; any x(4); BOOST_CHECK_EQUAL(any_cast(x), 4); any y(x); BOOST_CHECK_EQUAL(any_cast(y), 4); any z(as_rvalue(x)); BOOST_CHECK_EQUAL(any_cast(z), 4); any w(as_const(x)); BOOST_CHECK_EQUAL(any_cast(w), 4); } BOOST_AUTO_TEST_CASE(test_copy_implicit) { typedef ::boost::mpl::vector, common<_a> > test_concept; any x(4, make_binding< ::boost::mpl::map< ::boost::mpl::pair<_self, int>, ::boost::mpl::pair<_a, int> > >()); BOOST_CHECK_EQUAL(any_cast(x), 4); any y = x; BOOST_CHECK_EQUAL(any_cast(y), 4); any z = as_rvalue(x); BOOST_CHECK_EQUAL(any_cast(z), 4); any w = as_const(x); BOOST_CHECK_EQUAL(any_cast(w), 4); } BOOST_AUTO_TEST_CASE(test_convert) { typedef ::boost::mpl::vector, incrementable<> > src_concept; typedef ::boost::mpl::vector > dst_concept; any x(4); BOOST_CHECK_EQUAL(any_cast(x), 4); any y(x); BOOST_CHECK_EQUAL(any_cast(y), 4); any z = as_rvalue(x); BOOST_CHECK_EQUAL(any_cast(z), 4); any w = as_const(x); BOOST_CHECK_EQUAL(any_cast(w), 4); } BOOST_AUTO_TEST_CASE(test_rebind) { typedef ::boost::mpl::vector > src_concept; typedef ::boost::mpl::vector > dst_concept; any x(4); BOOST_CHECK_EQUAL(any_cast(x), 4); any y = x; BOOST_CHECK_EQUAL(any_cast(y), 4); any z = as_rvalue(x); BOOST_CHECK_EQUAL(any_cast(z), 4); any w = as_const(x); BOOST_CHECK_EQUAL(any_cast(w), 4); } BOOST_AUTO_TEST_CASE(test_rebind_and_convert) { typedef ::boost::mpl::vector, incrementable<> > src_concept; typedef ::boost::mpl::vector > dst_concept; any x(4); BOOST_CHECK_EQUAL(any_cast(x), 4); any y(x); BOOST_CHECK_EQUAL(any_cast(y), 4); any z = as_rvalue(x); BOOST_CHECK_EQUAL(any_cast(z), 4); any w = as_const(x); BOOST_CHECK_EQUAL(any_cast(w), 4); } BOOST_AUTO_TEST_CASE(test_rebind_and_convert_with_binding) { typedef ::boost::mpl::vector, incrementable<> > src_concept; typedef ::boost::mpl::vector > dst_concept; typedef ::boost::mpl::map > map; typedef ::boost::mpl::map > types; static_binding s_table(make_binding()); binding table(make_binding()); any x(4); BOOST_CHECK_EQUAL(any_cast(x), 4); // lvalues any y1(x, s_table); BOOST_CHECK_EQUAL(any_cast(y1), 4); any y2(x, as_rvalue(s_table)); BOOST_CHECK_EQUAL(any_cast(y2), 4); any y3(x, as_const(s_table)); BOOST_CHECK_EQUAL(any_cast(y3), 4); any z1(x, table); BOOST_CHECK_EQUAL(any_cast(z1), 4); any z2(x, as_rvalue(table)); BOOST_CHECK_EQUAL(any_cast(z2), 4); any z3(x, as_const(table)); BOOST_CHECK_EQUAL(any_cast(z3), 4); // rvalues any ry1(as_rvalue(x), s_table); BOOST_CHECK_EQUAL(any_cast(ry1), 4); any ry2(as_rvalue(x), as_rvalue(s_table)); BOOST_CHECK_EQUAL(any_cast(ry2), 4); any ry3(as_rvalue(x), as_const(s_table)); BOOST_CHECK_EQUAL(any_cast(ry3), 4); any rz1(as_rvalue(x), table); BOOST_CHECK_EQUAL(any_cast(rz1), 4); any rz2(as_rvalue(x), as_rvalue(table)); BOOST_CHECK_EQUAL(any_cast(rz2), 4); any rz3(as_rvalue(x), as_rvalue(table)); BOOST_CHECK_EQUAL(any_cast(rz3), 4); // const lvalues any cy1(as_const(x), s_table); BOOST_CHECK_EQUAL(any_cast(cy1), 4); any cy2(as_const(x), as_rvalue(s_table)); BOOST_CHECK_EQUAL(any_cast(cy2), 4); any cy3(as_const(x), as_const(s_table)); BOOST_CHECK_EQUAL(any_cast(cy3), 4); any cz1(as_const(x), table); BOOST_CHECK_EQUAL(any_cast(cz1), 4); any cz2(as_const(x), as_rvalue(table)); BOOST_CHECK_EQUAL(any_cast(cz2), 4); any cz3(as_const(x), as_rvalue(table)); BOOST_CHECK_EQUAL(any_cast(cz3), 4); } BOOST_AUTO_TEST_CASE(test_copy_from_ref) { typedef ::boost::mpl::vector > test_concept; int i = 4; any x(i); BOOST_CHECK_EQUAL(any_cast(x), 4); any y(x); BOOST_CHECK_EQUAL(any_cast(y), 4); any z = as_rvalue(x); BOOST_CHECK_EQUAL(any_cast(z), 4); any w = as_const(x); BOOST_CHECK_EQUAL(any_cast(w), 4); } BOOST_AUTO_TEST_CASE(test_convert_from_ref) { typedef ::boost::mpl::vector, incrementable<> > src_concept; typedef ::boost::mpl::vector > dst_concept; int i = 4; any x(i); BOOST_CHECK_EQUAL(any_cast(x), 4); any y(x); BOOST_CHECK_EQUAL(any_cast(y), 4); any z = as_rvalue(x); BOOST_CHECK_EQUAL(any_cast(z), 4); any w = as_const(x); BOOST_CHECK_EQUAL(any_cast(w), 4); } BOOST_AUTO_TEST_CASE(test_rebind_from_ref) { typedef ::boost::mpl::vector > src_concept; typedef ::boost::mpl::vector > dst_concept; int i = 4; any x(i); BOOST_CHECK_EQUAL(any_cast(x), 4); any y(x); BOOST_CHECK_EQUAL(any_cast(y), 4); any z = as_rvalue(x); BOOST_CHECK_EQUAL(any_cast(z), 4); any w = as_const(x); BOOST_CHECK_EQUAL(any_cast(w), 4); } BOOST_AUTO_TEST_CASE(test_rebind_and_convert_from_ref) { typedef ::boost::mpl::vector, incrementable<> > src_concept; typedef ::boost::mpl::vector > dst_concept; int i = 4; any x(i); BOOST_CHECK_EQUAL(any_cast(x), 4); any y(x); BOOST_CHECK_EQUAL(any_cast(y), 4); any z = as_rvalue(x); BOOST_CHECK_EQUAL(any_cast(z), 4); any w = as_const(x); BOOST_CHECK_EQUAL(any_cast(w), 4); } BOOST_AUTO_TEST_CASE(test_rebind_and_convert_with_binding_from_ref) { typedef ::boost::mpl::vector, incrementable<> > src_concept; typedef ::boost::mpl::vector > dst_concept; typedef ::boost::mpl::map > map; typedef ::boost::mpl::map > types; static_binding s_table(make_binding()); binding table(make_binding()); int i = 4; any x(i); BOOST_CHECK_EQUAL(any_cast(x), 4); // lvalues any y1(x, s_table); BOOST_CHECK_EQUAL(any_cast(y1), 4); any y2(x, as_rvalue(s_table)); BOOST_CHECK_EQUAL(any_cast(y2), 4); any y3(x, as_const(s_table)); BOOST_CHECK_EQUAL(any_cast(y3), 4); any z1(x, table); BOOST_CHECK_EQUAL(any_cast(z1), 4); any z2(x, as_rvalue(table)); BOOST_CHECK_EQUAL(any_cast(z2), 4); any z3(x, as_const(table)); BOOST_CHECK_EQUAL(any_cast(z3), 4); // rvalues any ry1(as_rvalue(x), s_table); BOOST_CHECK_EQUAL(any_cast(ry1), 4); any ry2(as_rvalue(x), as_rvalue(s_table)); BOOST_CHECK_EQUAL(any_cast(ry2), 4); any ry3(as_rvalue(x), as_const(s_table)); BOOST_CHECK_EQUAL(any_cast(ry3), 4); any rz1(as_rvalue(x), table); BOOST_CHECK_EQUAL(any_cast(rz1), 4); any rz2(as_rvalue(x), as_rvalue(table)); BOOST_CHECK_EQUAL(any_cast(rz2), 4); any rz3(as_rvalue(x), as_rvalue(table)); BOOST_CHECK_EQUAL(any_cast(rz3), 4); // const lvalues any cy1(as_const(x), s_table); BOOST_CHECK_EQUAL(any_cast(cy1), 4); any cy2(as_const(x), as_rvalue(s_table)); BOOST_CHECK_EQUAL(any_cast(cy2), 4); any cy3(as_const(x), as_const(s_table)); BOOST_CHECK_EQUAL(any_cast(cy3), 4); any cz1(as_const(x), table); BOOST_CHECK_EQUAL(any_cast(cz1), 4); any cz2(as_const(x), as_rvalue(table)); BOOST_CHECK_EQUAL(any_cast(cz2), 4); any cz3(as_const(x), as_rvalue(table)); BOOST_CHECK_EQUAL(any_cast(cz3), 4); } BOOST_AUTO_TEST_CASE(test_copy_from_cref) { typedef ::boost::mpl::vector > test_concept; int i = 4; any x(i); BOOST_CHECK_EQUAL(any_cast(x), 4); any y(x); BOOST_CHECK_EQUAL(any_cast(y), 4); any z = as_rvalue(x); BOOST_CHECK_EQUAL(any_cast(z), 4); any w = as_const(x); BOOST_CHECK_EQUAL(any_cast(w), 4); } BOOST_AUTO_TEST_CASE(test_convert_from_cref) { typedef ::boost::mpl::vector, incrementable<> > src_concept; typedef ::boost::mpl::vector > dst_concept; int i = 4; any x(i); BOOST_CHECK_EQUAL(any_cast(x), 4); any y(x); BOOST_CHECK_EQUAL(any_cast(y), 4); any z = as_rvalue(x); BOOST_CHECK_EQUAL(any_cast(z), 4); any w = as_const(x); BOOST_CHECK_EQUAL(any_cast(w), 4); } BOOST_AUTO_TEST_CASE(test_rebind_from_cref) { typedef ::boost::mpl::vector > src_concept; typedef ::boost::mpl::vector > dst_concept; int i = 4; any x(i); BOOST_CHECK_EQUAL(any_cast(x), 4); any y(x); BOOST_CHECK_EQUAL(any_cast(y), 4); any z = as_rvalue(x); BOOST_CHECK_EQUAL(any_cast(z), 4); any w = as_const(x); BOOST_CHECK_EQUAL(any_cast(w), 4); } BOOST_AUTO_TEST_CASE(test_rebind_and_convert_from_cref) { typedef ::boost::mpl::vector, incrementable<> > src_concept; typedef ::boost::mpl::vector > dst_concept; int i = 4; any x(i); BOOST_CHECK_EQUAL(any_cast(x), 4); any y(x); BOOST_CHECK_EQUAL(any_cast(y), 4); any z = as_rvalue(x); BOOST_CHECK_EQUAL(any_cast(z), 4); any w = as_const(x); BOOST_CHECK_EQUAL(any_cast(w), 4); } BOOST_AUTO_TEST_CASE(test_rebind_and_convert_with_binding_from_cref) { typedef ::boost::mpl::vector, incrementable<> > src_concept; typedef ::boost::mpl::vector > dst_concept; typedef ::boost::mpl::map > map; typedef ::boost::mpl::map > types; static_binding s_table(make_binding()); binding table(make_binding()); int i = 4; any x(i); BOOST_CHECK_EQUAL(any_cast(x), 4); // lvalues any y1(x, s_table); BOOST_CHECK_EQUAL(any_cast(y1), 4); any y2(x, as_rvalue(s_table)); BOOST_CHECK_EQUAL(any_cast(y2), 4); any y3(x, as_const(s_table)); BOOST_CHECK_EQUAL(any_cast(y3), 4); any z1(x, table); BOOST_CHECK_EQUAL(any_cast(z1), 4); any z2(x, as_rvalue(table)); BOOST_CHECK_EQUAL(any_cast(z2), 4); any z3(x, as_const(table)); BOOST_CHECK_EQUAL(any_cast(z3), 4); // rvalues any ry1(as_rvalue(x), s_table); BOOST_CHECK_EQUAL(any_cast(ry1), 4); any ry2(as_rvalue(x), as_rvalue(s_table)); BOOST_CHECK_EQUAL(any_cast(ry2), 4); any ry3(as_rvalue(x), as_const(s_table)); BOOST_CHECK_EQUAL(any_cast(ry3), 4); any rz1(as_rvalue(x), table); BOOST_CHECK_EQUAL(any_cast(rz1), 4); any rz2(as_rvalue(x), as_rvalue(table)); BOOST_CHECK_EQUAL(any_cast(rz2), 4); any rz3(as_rvalue(x), as_rvalue(table)); BOOST_CHECK_EQUAL(any_cast(rz3), 4); // const lvalues any cy1(as_const(x), s_table); BOOST_CHECK_EQUAL(any_cast(cy1), 4); any cy2(as_const(x), as_rvalue(s_table)); BOOST_CHECK_EQUAL(any_cast(cy2), 4); any cy3(as_const(x), as_const(s_table)); BOOST_CHECK_EQUAL(any_cast(cy3), 4); any cz1(as_const(x), table); BOOST_CHECK_EQUAL(any_cast(cz1), 4); any cz2(as_const(x), as_rvalue(table)); BOOST_CHECK_EQUAL(any_cast(cz2), 4); any cz3(as_const(x), as_rvalue(table)); BOOST_CHECK_EQUAL(any_cast(cz3), 4); } #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES struct move_only { explicit move_only(int i) : value(i) {} move_only(move_only&& other) : value(other.value) { other.value = 0; } int value; private: move_only(const move_only&); }; BOOST_AUTO_TEST_CASE(test_move_only) { typedef ::boost::mpl::vector, typeid_<> > test_concept; move_only source(2); any x(std::move(source)); BOOST_CHECK_EQUAL(source.value, 0); BOOST_CHECK_EQUAL(any_cast(x).value, 2); } BOOST_AUTO_TEST_CASE(test_copy_from_rref) { typedef ::boost::mpl::vector > test_concept; int i = 4; any x(std::move(i)); BOOST_CHECK_EQUAL(any_cast(x), 4); any y(x); BOOST_CHECK_EQUAL(any_cast(y), 4); any z = as_rvalue(x); BOOST_CHECK_EQUAL(any_cast(z), 4); any w = as_const(x); BOOST_CHECK_EQUAL(any_cast(w), 4); } BOOST_AUTO_TEST_CASE(test_convert_from_rref) { typedef ::boost::mpl::vector, incrementable<> > src_concept; typedef ::boost::mpl::vector > dst_concept; int i = 4; any x(std::move(i)); BOOST_CHECK_EQUAL(any_cast(x), 4); any y(x); BOOST_CHECK_EQUAL(any_cast(y), 4); any z = as_rvalue(x); BOOST_CHECK_EQUAL(any_cast(z), 4); any w = as_const(x); BOOST_CHECK_EQUAL(any_cast(w), 4); } BOOST_AUTO_TEST_CASE(test_rebind_from_rref) { typedef ::boost::mpl::vector > src_concept; typedef ::boost::mpl::vector > dst_concept; int i = 4; any x(std::move(i)); BOOST_CHECK_EQUAL(any_cast(x), 4); any y(x); BOOST_CHECK_EQUAL(any_cast(y), 4); any z = as_rvalue(x); BOOST_CHECK_EQUAL(any_cast(z), 4); any w = as_const(x); BOOST_CHECK_EQUAL(any_cast(w), 4); } BOOST_AUTO_TEST_CASE(test_rebind_and_convert_from_rref) { typedef ::boost::mpl::vector, incrementable<> > src_concept; typedef ::boost::mpl::vector > dst_concept; int i = 4; any x(std::move(i)); BOOST_CHECK_EQUAL(any_cast(x), 4); any y(x); BOOST_CHECK_EQUAL(any_cast(y), 4); any z = as_rvalue(x); BOOST_CHECK_EQUAL(any_cast(z), 4); any w = as_const(x); BOOST_CHECK_EQUAL(any_cast(w), 4); } BOOST_AUTO_TEST_CASE(test_rebind_and_convert_with_binding_from_rref) { typedef ::boost::mpl::vector, incrementable<> > src_concept; typedef ::boost::mpl::vector > dst_concept; typedef ::boost::mpl::map > map; typedef ::boost::mpl::map > types; static_binding s_table(make_binding()); binding table(make_binding()); int i = 4; any x(std::move(i)); BOOST_CHECK_EQUAL(any_cast(x), 4); // lvalues any y1(x, s_table); BOOST_CHECK_EQUAL(any_cast(y1), 4); any y2(x, as_rvalue(s_table)); BOOST_CHECK_EQUAL(any_cast(y2), 4); any y3(x, as_const(s_table)); BOOST_CHECK_EQUAL(any_cast(y3), 4); any z1(x, table); BOOST_CHECK_EQUAL(any_cast(z1), 4); any z2(x, as_rvalue(table)); BOOST_CHECK_EQUAL(any_cast(z2), 4); any z3(x, as_const(table)); BOOST_CHECK_EQUAL(any_cast(z3), 4); // rvalues any ry1(as_rvalue(x), s_table); BOOST_CHECK_EQUAL(any_cast(ry1), 4); any ry2(as_rvalue(x), as_rvalue(s_table)); BOOST_CHECK_EQUAL(any_cast(ry2), 4); any ry3(as_rvalue(x), as_const(s_table)); BOOST_CHECK_EQUAL(any_cast(ry3), 4); any rz1(as_rvalue(x), table); BOOST_CHECK_EQUAL(any_cast(rz1), 4); any rz2(as_rvalue(x), as_rvalue(table)); BOOST_CHECK_EQUAL(any_cast(rz2), 4); any rz3(as_rvalue(x), as_rvalue(table)); BOOST_CHECK_EQUAL(any_cast(rz3), 4); // const lvalues any cy1(as_const(x), s_table); BOOST_CHECK_EQUAL(any_cast(cy1), 4); any cy2(as_const(x), as_rvalue(s_table)); BOOST_CHECK_EQUAL(any_cast(cy2), 4); any cy3(as_const(x), as_const(s_table)); BOOST_CHECK_EQUAL(any_cast(cy3), 4); any cz1(as_const(x), table); BOOST_CHECK_EQUAL(any_cast(cz1), 4); any cz2(as_const(x), as_rvalue(table)); BOOST_CHECK_EQUAL(any_cast(cz2), 4); any cz3(as_const(x), as_rvalue(table)); BOOST_CHECK_EQUAL(any_cast(cz3), 4); } #endif