// 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 #define BOOST_TEST_MAIN #include using namespace boost::type_erasure; template struct common : ::boost::mpl::vector< copy_constructible, typeid_ > {}; BOOST_AUTO_TEST_CASE(test_value_to_value) { typedef ::boost::mpl::vector > test_concept; any x(2); BOOST_CHECK_EQUAL(any_cast(x), 2); BOOST_CHECK_THROW(any_cast(x), bad_any_cast); const any y(x); BOOST_CHECK_EQUAL(any_cast(y), 2); BOOST_CHECK_THROW(any_cast(y), bad_any_cast); } BOOST_AUTO_TEST_CASE(test_value_to_ref) { typedef ::boost::mpl::vector > test_concept; any x(2); BOOST_CHECK_EQUAL(any_cast(x), 2); BOOST_CHECK_EQUAL(any_cast(x), 2); BOOST_CHECK_THROW(any_cast(x), bad_any_cast); BOOST_CHECK_THROW(any_cast(x), bad_any_cast); const any y(x); // BOOST_CHECK_EQUAL(any_cast(y), 2); BOOST_CHECK_EQUAL(any_cast(y), 2); // BOOST_CHECK_THROW(any_cast(y), bad_any_cast); BOOST_CHECK_THROW(any_cast(y), bad_any_cast); } BOOST_AUTO_TEST_CASE(test_value_to_pointer) { typedef ::boost::mpl::vector > test_concept; any x(2); BOOST_CHECK_EQUAL(*any_cast(&x), 2); BOOST_CHECK_EQUAL(*any_cast(&x), 2); BOOST_CHECK_EQUAL(any_cast(&x), any_cast(&x)); BOOST_CHECK_EQUAL(any_cast(&x), any_cast(&x)); BOOST_CHECK_EQUAL(any_cast(&x), (double*)0); BOOST_CHECK_EQUAL(any_cast(&x), (double*)0); const any y(x); // BOOST_CHECK_EQUAL(*any_cast(&y), 2); BOOST_CHECK_EQUAL(*any_cast(&y), 2); // BOOST_CHECK_EQUAL(any_cast(&y), any_cast(&y)); BOOST_CHECK_EQUAL(any_cast(&y), any_cast(&y)); // BOOST_CHECK_EQUAL(any_cast(&y), (double*)0); BOOST_CHECK_EQUAL(any_cast(&y), (double*)0); } BOOST_AUTO_TEST_CASE(test_ref_to_value) { typedef ::boost::mpl::vector > test_concept; int i = 2; any x(i); BOOST_CHECK_EQUAL(any_cast(x), 2); BOOST_CHECK_THROW(any_cast(x), bad_any_cast); const any y(x); BOOST_CHECK_EQUAL(any_cast(y), 2); BOOST_CHECK_THROW(any_cast(y), bad_any_cast); } BOOST_AUTO_TEST_CASE(test_ref_to_ref) { typedef ::boost::mpl::vector > test_concept; int i = 2; any x(i); BOOST_CHECK_EQUAL(any_cast(x), 2); BOOST_CHECK_EQUAL(any_cast(x), 2); BOOST_CHECK_THROW(any_cast(x), bad_any_cast); BOOST_CHECK_THROW(any_cast(x), bad_any_cast); const any y(x); BOOST_CHECK_EQUAL(any_cast(y), 2); BOOST_CHECK_EQUAL(any_cast(y), 2); BOOST_CHECK_THROW(any_cast(y), bad_any_cast); BOOST_CHECK_THROW(any_cast(y), bad_any_cast); } BOOST_AUTO_TEST_CASE(test_ref_to_pointer) { typedef ::boost::mpl::vector > test_concept; int i = 2; any x(i); BOOST_CHECK_EQUAL(*any_cast(&x), 2); BOOST_CHECK_EQUAL(*any_cast(&x), 2); BOOST_CHECK_EQUAL(any_cast(&x), any_cast(&x)); BOOST_CHECK_EQUAL(any_cast(&x), any_cast(&x)); BOOST_CHECK_EQUAL(any_cast(&x), (double*)0); BOOST_CHECK_EQUAL(any_cast(&x), (double*)0); const any y(x); BOOST_CHECK_EQUAL(*any_cast(&y), 2); BOOST_CHECK_EQUAL(*any_cast(&y), 2); BOOST_CHECK_EQUAL(any_cast(&y), any_cast(&y)); BOOST_CHECK_EQUAL(any_cast(&y), any_cast(&y)); BOOST_CHECK_EQUAL(any_cast(&y), (double*)0); BOOST_CHECK_EQUAL(any_cast(&y), (double*)0); } BOOST_AUTO_TEST_CASE(test_cref_to_value) { typedef ::boost::mpl::vector > test_concept; int i = 2; any x(i); BOOST_CHECK_EQUAL(any_cast(x), 2); BOOST_CHECK_THROW(any_cast(x), bad_any_cast); const any y(x); BOOST_CHECK_EQUAL(any_cast(y), 2); BOOST_CHECK_THROW(any_cast(y), bad_any_cast); } BOOST_AUTO_TEST_CASE(test_cref_to_ref) { typedef ::boost::mpl::vector > test_concept; int i = 2; any x(i); // BOOST_CHECK_EQUAL(any_cast(x), 2); BOOST_CHECK_EQUAL(any_cast(x), 2); // BOOST_CHECK_THROW(any_cast(x), bad_any_cast); BOOST_CHECK_THROW(any_cast(x), bad_any_cast); const any y(x); // BOOST_CHECK_EQUAL(any_cast(y), 2); BOOST_CHECK_EQUAL(any_cast(y), 2); // BOOST_CHECK_THROW(any_cast(y), bad_any_cast); BOOST_CHECK_THROW(any_cast(y), bad_any_cast); } BOOST_AUTO_TEST_CASE(test_cref_to_pointer) { typedef ::boost::mpl::vector > test_concept; int i = 2; any x(i); // BOOST_CHECK_EQUAL(*any_cast(&x), 2); BOOST_CHECK_EQUAL(*any_cast(&x), 2); // BOOST_CHECK_EQUAL(any_cast(&x), any_cast(&x)); BOOST_CHECK_EQUAL(any_cast(&x), any_cast(&x)); // BOOST_CHECK_EQUAL(any_cast(&x), (double*)0); BOOST_CHECK_EQUAL(any_cast(&x), (double*)0); const any y(x); // BOOST_CHECK_EQUAL(*any_cast(&y), 2); BOOST_CHECK_EQUAL(*any_cast(&y), 2); // BOOST_CHECK_EQUAL(any_cast(&y), any_cast(&y)); BOOST_CHECK_EQUAL(any_cast(&y), any_cast(&y)); // BOOST_CHECK_EQUAL(any_cast(&y), (double*)0); BOOST_CHECK_EQUAL(any_cast(&y), (double*)0); }