1 | // Boost.TypeErasure library |
2 | // |
3 | // Copyright 2011 Steven Watanabe |
4 | // |
5 | // Distributed under the Boost Software License Version 1.0. (See |
6 | // accompanying file LICENSE_1_0.txt or copy at |
7 | // http://www.boost.org/LICENSE_1_0.txt) |
8 | // |
9 | // $Id$ |
10 | |
11 | #include <boost/type_erasure/any.hpp> |
12 | #include <boost/type_erasure/tuple.hpp> |
13 | #include <boost/type_erasure/builtin.hpp> |
14 | #include <boost/type_erasure/operators.hpp> |
15 | #include <boost/type_erasure/any_cast.hpp> |
16 | #include <boost/mpl/vector.hpp> |
17 | #include <boost/fusion/include/at_c.hpp> |
18 | #include <boost/fusion/include/front.hpp> |
19 | #include <boost/fusion/include/back.hpp> |
20 | #include <boost/fusion/include/size.hpp> |
21 | #include <boost/fusion/include/empty.hpp> |
22 | #include <boost/fusion/include/begin.hpp> |
23 | #include <boost/fusion/include/end.hpp> |
24 | #include <boost/fusion/include/distance.hpp> |
25 | #include <boost/fusion/include/next.hpp> |
26 | #include <boost/fusion/include/prior.hpp> |
27 | #include <boost/fusion/include/equal_to.hpp> |
28 | #include <boost/fusion/include/advance.hpp> |
29 | #include <boost/fusion/include/deref.hpp> |
30 | #include <boost/fusion/include/value_of.hpp> |
31 | |
32 | #define BOOST_TEST_MAIN |
33 | #include <boost/test/unit_test.hpp> |
34 | |
35 | using namespace boost::type_erasure; |
36 | |
37 | template<class T = _self> |
38 | struct common : ::boost::mpl::vector< |
39 | copy_constructible<T>, |
40 | typeid_<T> |
41 | > {}; |
42 | |
43 | BOOST_AUTO_TEST_CASE(test_same) |
44 | { |
45 | tuple<common<_a>, _a, _a> t(1, 2); |
46 | BOOST_CHECK_EQUAL(any_cast<int&>(get<0>(t)), 1); |
47 | BOOST_CHECK_EQUAL(any_cast<int&>(get<1>(t)), 2); |
48 | } |
49 | |
50 | BOOST_AUTO_TEST_CASE(test_degenerate) |
51 | { |
52 | tuple<boost::mpl::vector<> > t; |
53 | } |
54 | |
55 | template<class T> |
56 | typename T::value_type get_static(T) { return T::value; } |
57 | |
58 | BOOST_AUTO_TEST_CASE(test_fusion) |
59 | { |
60 | typedef boost::mpl::vector<common<_a>, common<_b>, addable<_a, _b> > test_concept; |
61 | tuple<test_concept, _a, _b> t(2.0, 1); |
62 | BOOST_CHECK_EQUAL(any_cast<double&>(boost::fusion::at_c<0>(t)), 2.0); |
63 | BOOST_CHECK_EQUAL(any_cast<int&>(boost::fusion::at_c<1>(t)), 1); |
64 | BOOST_CHECK_EQUAL(any_cast<double&>(boost::fusion::front(t)), 2.0); |
65 | BOOST_CHECK_EQUAL(any_cast<int&>(boost::fusion::back(t)), 1); |
66 | BOOST_CHECK_EQUAL(get_static(boost::fusion::empty(t)), false); |
67 | BOOST_CHECK_EQUAL(get_static(boost::fusion::size(t)), 2); |
68 | BOOST_CHECK_EQUAL(get_static(boost::fusion::distance(boost::fusion::begin(t), boost::fusion::end(t))), 2); |
69 | BOOST_CHECK_EQUAL(get_static(boost::fusion::distance(boost::fusion::next(boost::fusion::begin(t)), boost::fusion::end(t))), 1); |
70 | BOOST_CHECK_EQUAL(get_static(boost::fusion::distance(boost::fusion::begin(t), boost::fusion::prior(boost::fusion::end(t)))), 1); |
71 | |
72 | BOOST_CHECK_EQUAL(get_static(boost::fusion::distance(boost::fusion::advance_c<2>(boost::fusion::begin(t)), boost::fusion::end(t))), 0); |
73 | BOOST_CHECK_EQUAL(any_cast<double&>(boost::fusion::deref(boost::fusion::begin(t))), 2.0); |
74 | } |
75 | |
76 | BOOST_AUTO_TEST_CASE(test_fusion_const) |
77 | { |
78 | typedef boost::mpl::vector<common<_a>, common<_b>, addable<_a, _b> > test_concept; |
79 | const tuple<test_concept, _a, _b> t(2.0, 1); |
80 | BOOST_CHECK_EQUAL(any_cast<const double&>(boost::fusion::at_c<0>(t)), 2.0); |
81 | BOOST_CHECK_EQUAL(any_cast<const int&>(boost::fusion::at_c<1>(t)), 1); |
82 | BOOST_CHECK_EQUAL(any_cast<const double&>(boost::fusion::front(t)), 2.0); |
83 | BOOST_CHECK_EQUAL(any_cast<const int&>(boost::fusion::back(t)), 1); |
84 | BOOST_CHECK_EQUAL(get_static(boost::fusion::empty(t)), false); |
85 | BOOST_CHECK_EQUAL(get_static(boost::fusion::size(t)), 2); |
86 | BOOST_CHECK_EQUAL(get_static(boost::fusion::distance(boost::fusion::begin(t), boost::fusion::end(t))), 2); |
87 | BOOST_CHECK_EQUAL(get_static(boost::fusion::distance(boost::fusion::next(boost::fusion::begin(t)), boost::fusion::end(t))), 1); |
88 | BOOST_CHECK_EQUAL(get_static(boost::fusion::distance(boost::fusion::begin(t), boost::fusion::prior(boost::fusion::end(t)))), 1); |
89 | |
90 | BOOST_CHECK_EQUAL(get_static(boost::fusion::distance(boost::fusion::advance_c<2>(boost::fusion::begin(t)), boost::fusion::end(t))), 0); |
91 | BOOST_CHECK_EQUAL(any_cast<const double&>(boost::fusion::deref(boost::fusion::begin(t))), 2.0); |
92 | } |
93 | |