]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/type_erasure/test/test_add_assign.cpp
add subtree-ish sources for 12.0.3
[ceph.git] / ceph / src / boost / libs / type_erasure / test / test_add_assign.cpp
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
18 #define BOOST_TEST_MAIN
19 #include <boost/test/unit_test.hpp>
20
21 using namespace boost::type_erasure;
22
23 template<class T = _self>
24 struct common : ::boost::mpl::vector<
25 destructible<T>,
26 copy_constructible<T>,
27 typeid_<T>
28 > {};
29
30 BOOST_AUTO_TEST_CASE(test_same)
31 {
32 typedef ::boost::mpl::vector<common<>, add_assignable<> > test_concept;
33 any<test_concept> x(1);
34 any<test_concept> y(2);
35 any<test_concept>& z(x += y);
36 BOOST_CHECK_EQUAL(any_cast<int>(x), 3);
37 BOOST_CHECK_EQUAL(&x, &z);
38 }
39
40 BOOST_AUTO_TEST_CASE(test_int1)
41 {
42 typedef ::boost::mpl::vector<common<>, add_assignable<_self, int> > test_concept;
43 any<test_concept> x(1);
44 any<test_concept>& z(x += 2);
45 BOOST_CHECK_EQUAL(any_cast<int>(x), 3);
46 BOOST_CHECK_EQUAL(&x, &z);
47 }
48
49 BOOST_AUTO_TEST_CASE(test_int2)
50 {
51 typedef ::boost::mpl::vector<common<>, add_assignable<int, _self> > test_concept;
52 int x = 1;
53 any<test_concept> y(2);
54 int& z(x += y);
55 BOOST_CHECK_EQUAL(x, 3);
56 BOOST_CHECK_EQUAL(&x, &z);
57 }
58
59 BOOST_AUTO_TEST_CASE(test_mixed)
60 {
61 typedef ::boost::mpl::vector<common<_a>, common<_b>, add_assignable<_a, _b> > test_concept;
62 tuple<test_concept, _a, _b> t(1.0, 2);
63 any<test_concept, _a> x(get<0>(t));
64 any<test_concept, _b> y(get<1>(t));
65 any<test_concept, _a>& z(x += y);
66 BOOST_CHECK_EQUAL(any_cast<double>(x), 3.0);
67 BOOST_CHECK_EQUAL(&x, &z);
68 }
69
70 BOOST_AUTO_TEST_CASE(test_overload)
71 {
72 typedef ::boost::mpl::vector<
73 common<_a>,
74 common<_b>,
75 add_assignable<_a>,
76 add_assignable<_a, int>,
77 add_assignable<double, _a>,
78 add_assignable<_b>,
79 add_assignable<_b, int>,
80 add_assignable<double, _b>,
81 add_assignable<_a, _b>
82 > test_concept;
83 tuple<test_concept, _a, _b> t(1.0, 2);
84
85 {
86 any<test_concept, _a> x(get<0>(t));
87 any<test_concept, _a> y(get<0>(t));
88 any<test_concept, _a>& z(x += y);
89 BOOST_CHECK_EQUAL(any_cast<double>(x), 2.0);
90 BOOST_CHECK_EQUAL(&x, &z);
91 }
92
93 {
94 any<test_concept, _a> x(get<0>(t));
95 int y = 5;
96 any<test_concept, _a>& z(x += y);
97 BOOST_CHECK_EQUAL(any_cast<double>(x), 6.0);
98 BOOST_CHECK_EQUAL(&x, &z);
99 }
100
101 {
102 double x = 11;
103 any<test_concept, _a> y(get<0>(t));
104 double& z(x += y);
105 BOOST_CHECK_EQUAL(x, 12);
106 BOOST_CHECK_EQUAL(&x, &z);
107 }
108
109 {
110 any<test_concept, _b> x(get<1>(t));
111 any<test_concept, _b> y(get<1>(t));
112 any<test_concept, _b>& z(x += y);
113 BOOST_CHECK_EQUAL(any_cast<int>(x), 4);
114 BOOST_CHECK_EQUAL(&x, &z);
115 }
116
117 {
118 any<test_concept, _b> x(get<1>(t));
119 int y = 5;
120 any<test_concept, _b>& z(x += y);
121 BOOST_CHECK_EQUAL(any_cast<int>(x), 7);
122 BOOST_CHECK_EQUAL(&x, &z);
123 }
124
125 {
126 double x = 11;
127 any<test_concept, _b> y(get<1>(t));
128 double& z(x += y);
129 BOOST_CHECK_EQUAL(x, 13);
130 BOOST_CHECK_EQUAL(&x, &z);
131 }
132
133 {
134 any<test_concept, _a> x(get<0>(t));
135 any<test_concept, _b> y(get<1>(t));
136 any<test_concept, _a>& z(x += y);
137 BOOST_CHECK_EQUAL(any_cast<double>(x), 3.0);
138 BOOST_CHECK_EQUAL(&x, &z);
139 }
140 }