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/type_erasure/binding_of.hpp>
17 #include <boost/mpl/vector.hpp>
18 #include <boost/tuple/tuple.hpp>
19 #include <vector>
20
21 #define BOOST_TEST_MAIN
22 #include <boost/test/unit_test.hpp>
23
24 using namespace boost::type_erasure;
25
26 template<class T = _self>
27 struct common : ::boost::mpl::vector<
28 copy_constructible<T>,
29 typeid_<T>
30 > {};
31
BOOST_AUTO_TEST_CASE(test_implicit)32 BOOST_AUTO_TEST_CASE(test_implicit) {
33 any<common<> > x = 1;
34 BOOST_CHECK_EQUAL(any_cast<int>(x), 1);
35 }
36
func()37 void func() {}
38
BOOST_AUTO_TEST_CASE(test_decay)39 BOOST_AUTO_TEST_CASE(test_decay) {
40 char array[] = "Hello World!";
41 const char carray[] = "Hello World!";
42
43 any<common<> > x1(array);
44 any<common<> > y1(func);
45 any<common<> > z1(carray);
46 BOOST_CHECK_EQUAL(any_cast<char *>(x1), &array[0]);
47 BOOST_CHECK(any_cast<void(*)()>(y1) == &func);
48 BOOST_CHECK_EQUAL(any_cast<const char *>(z1), &carray[0]);
49
50 any<common<> > x2(array, make_binding<boost::mpl::map<boost::mpl::pair<_self, char *> > >());
51 any<common<> > y2(func, make_binding<boost::mpl::map<boost::mpl::pair<_self, void(*)()> > >());
52 any<common<> > z2(carray, make_binding<boost::mpl::map<boost::mpl::pair<_self, const char *> > >());
53 BOOST_CHECK_EQUAL(any_cast<char *>(x2), &array[0]);
54 BOOST_CHECK(any_cast<void(*)()>(y2) == &func);
55 BOOST_CHECK_EQUAL(any_cast<const char *>(z2), &carray[0]);
56
57 static_binding<boost::mpl::map<boost::mpl::pair<_self, char *> > > bx3;
58 static_binding<boost::mpl::map<boost::mpl::pair<_self, void (*)()> > > by3;
59 static_binding<boost::mpl::map<boost::mpl::pair<_self, const char *> > > bz3;
60 any<common<> > x3(array, bx3);
61 any<common<> > y3(func, by3);
62 any<common<> > z3(carray, bz3);
63 BOOST_CHECK_EQUAL(any_cast<char *>(x3), &array[0]);
64 BOOST_CHECK(any_cast<void(*)()>(y3) == &func);
65 BOOST_CHECK_EQUAL(any_cast<const char *>(z3), &carray[0]);
66 }
67
68 enum {
69 lvalue,
70 const_lvalue,
71 rvalue
72 #ifdef BOOST_NO_CXX11_RVALUE_REFERENCES
73 = lvalue
74 #endif
75 };
76
77 template<class T>
78 int make_arg_type();
79
80 template<>
make_arg_type()81 int make_arg_type<int>() { return rvalue; }
82 template<>
make_arg_type()83 int make_arg_type<int&>() { return lvalue; }
84 template<>
make_arg_type()85 int make_arg_type<const int&>() { return const_lvalue; }
86
87 enum { id_int = 4, id_copy = 8 };
88
make_vector()89 std::vector<int> make_vector() { return std::vector<int>(); }
90
91 template<class T>
make_vector(T t0)92 std::vector<T> make_vector(T t0) {
93 std::vector<T> result;
94 result.push_back(t0);
95 return result;
96 }
97 template<class T>
make_vector(T t0,T t1)98 std::vector<T> make_vector(T t0, T t1) {
99 std::vector<T> result;
100 result.push_back(t0);
101 result.push_back(t1);
102 return result;
103 }
104
105 #ifdef BOOST_MSVC
106 #pragma warning(disable:4521) // multiple copy constructors specified
107 #endif
108
109 struct test_class
110 {
111
test_classtest_class112 test_class() {}
113
test_classtest_class114 test_class(const test_class &)
115 : args(make_vector(const_lvalue | id_copy))
116 {}
117
test_classtest_class118 test_class(test_class &)
119 : args(make_vector(lvalue | id_copy))
120 {}
121
122 #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
123
test_classtest_class124 test_class(test_class &&)
125 : args(make_vector(rvalue | id_copy))
126 {}
127
128 template<class T0>
test_classtest_class129 test_class(T0&& t0)
130 : args(make_vector(t0 | make_arg_type<T0>()))
131 {}
132
133 template<class T0, class T1>
test_classtest_class134 test_class(T0&& t0, T1&& t1)
135 : args(make_vector(t0 | make_arg_type<T0>(), t1 | make_arg_type<T1>()))
136 {}
137
138 #else
139
test_classtest_class140 test_class(int& i0)
141 : args(make_vector(i0 | lvalue))
142 {}
test_classtest_class143 test_class(const int& i0)
144 : args(make_vector(i0 | const_lvalue))
145 {}
test_classtest_class146 test_class(int& i0, int& i1)
147 : args(make_vector(i0 | lvalue, i1 | lvalue))
148 {}
test_classtest_class149 test_class(int& i0, const int& i1)
150 : args(make_vector(i0 | lvalue, i1 | const_lvalue))
151 {}
test_classtest_class152 test_class(const int& i0, int& i1)
153 : args(make_vector(i0 | const_lvalue, i1 | lvalue))
154 {}
test_classtest_class155 test_class(const int& i0, const int& i1)
156 : args(make_vector(i0 | const_lvalue, i1 | const_lvalue))
157 {}
158
159 #endif
160 std::vector<int> args;
161 };
162
163 template<class T>
164 struct make_arg_impl;
165
166 template<>
167 struct make_arg_impl<int>
168 {
applymake_arg_impl169 static int apply()
170 {
171 return id_int;
172 }
173 };
174
175 template<class Concept>
176 struct make_arg_impl<binding<Concept> >
177 {
applymake_arg_impl178 static binding<Concept> apply()
179 {
180 return make_binding< ::boost::mpl::map<
181 ::boost::mpl::pair<_a, test_class>,
182 ::boost::mpl::pair<_b, int>
183 > >();
184 }
185 };
186
187 template<class Concept>
188 struct make_arg_impl<any<Concept, _a>&>
189 {
applymake_arg_impl190 static any<Concept, _a>& apply()
191 {
192 static any<Concept, _a> result(
193 test_class(),
194 make_binding< ::boost::mpl::map<
195 ::boost::mpl::pair<_a, test_class>,
196 ::boost::mpl::pair<_b, int>
197 > >());
198 return result;
199 }
200 };
201
202 template<class Concept>
203 struct make_arg_impl<any<Concept, _b>&>
204 {
applymake_arg_impl205 static any<Concept, _b>& apply()
206 {
207 static any<Concept, _b> result(
208 (int)id_int,
209 make_binding< ::boost::mpl::map<
210 ::boost::mpl::pair<_a, test_class>,
211 ::boost::mpl::pair<_b, int>
212 > >());
213 return result;
214 }
215 };
216
217 template<class Concept>
218 struct make_arg_impl<any<Concept, _a> >
219 {
applymake_arg_impl220 static any<Concept, _a> apply()
221 {
222 return make_arg_impl<any<Concept, _a>&>::apply();
223 }
224 };
225
226 template<class Concept>
227 struct make_arg_impl<any<Concept, _b> >
228 {
applymake_arg_impl229 static any<Concept, _b> apply()
230 {
231 return make_arg_impl<any<Concept, _b>&>::apply();
232 }
233 };
234
235 template<class Concept, class T>
236 struct make_arg_impl<any<Concept, T&> >
237 {
applymake_arg_impl238 static any<Concept, T&> apply()
239 {
240 return make_arg_impl<any<Concept, T>&>::apply();
241 }
242 };
243
244 template<class Concept, class T>
245 struct make_arg_impl<any<Concept, const T&> >
246 {
applymake_arg_impl247 static any<Concept, const T&> apply()
248 {
249 return make_arg_impl<any<Concept, T>&>::apply();
250 }
251 };
252
253 #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
254
255 template<class Concept, class T>
256 struct make_arg_impl<any<Concept, T&&> >
257 {
applymake_arg_impl258 static any<Concept, T&&> apply()
259 {
260 return std::move(make_arg_impl<any<Concept, T>&>::apply());
261 }
262 };
263
264 #endif
265
266 template<class T>
267 struct make_arg_impl<const T> : make_arg_impl<T> {};
268
269 template<class T>
270 struct make_arg_impl<T&>
271 {
applymake_arg_impl272 static T& apply()
273 {
274 static T result = make_arg_impl<T>::apply();
275 return result;
276 }
277 };
278 template<class T>
279 struct make_arg_impl<const T&>
280 {
applymake_arg_impl281 static T& apply()
282 {
283 return make_arg_impl<T&>::apply();
284 }
285 };
286
287 #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
288
289 template<class T>
290 struct make_arg_impl<T&&>
291 {
applymake_arg_impl292 static T&& apply()
293 {
294 return std::move(make_arg_impl<T&>::apply());
295 }
296 };
297
298 #endif
299
300 #ifdef BOOST_NO_CXX11_RVALUE_REFERENCES
301
302 template<class T>
make_arg()303 T make_arg()
304 {
305 return make_arg_impl<T>::apply();
306 }
307
308 #else
309
310 template<class T>
make_arg()311 T&& make_arg()
312 {
313 return make_arg_impl<T&&>::apply();
314 }
315
316 #endif
317
get_value(int i)318 int get_value(int i) { return i; }
319 template<class T>
get_value(const T & t)320 int get_value(const T& t) { return any_cast<int>(t); }
321
322 template<class Sig, class Args>
323 struct tester;
324
325 template<class Concept, class T>
326 struct tester<Concept, void(T)>
327 {
applytester328 static std::vector<int> apply()
329 {
330 any<Concept, _a> x(make_arg<T>());
331 const test_class& result = any_cast<const test_class&>(x);
332 return result.args;
333 }
334 };
335
336 template<class Concept, class T0, class T1>
337 struct tester<Concept, void(T0, T1)>
338 {
applytester339 static std::vector<int> apply()
340 {
341 any<Concept, _a> x(make_arg<T0>(), make_arg<T1>());
342 const test_class& result = any_cast<const test_class&>(x);
343 return result.args;
344 }
345 };
346
347 template<class Concept, class T0, class T1, class T2>
348 struct tester<Concept, void(T0, T1, T2)>
349 {
applytester350 static std::vector<int> apply()
351 {
352 any<Concept, _a> x(make_arg<T0>(), make_arg<T1>(), make_arg<T2>());
353 const test_class& result = any_cast<const test_class&>(x);
354 return result.args;
355 }
356 };
357
358 #ifdef BOOST_NO_CXX11_RVALUE_REFERENCES
359 // We need copy_constructible in order to get an rvalue.
360 #define CONSTRUCT_COMMON(p) common<p>
361 #else
362 // Don't include the copy constructor if we don't
363 // need it, as it can hide the non-const copy constructor.
364 #define CONSTRUCT_COMMON(p) destructible<p>, typeid_<p>
365 #endif
366
367 #define TEST_CONSTRUCT(sig, args, expected_) \
368 {\
369 typedef ::boost::mpl::vector<\
370 CONSTRUCT_COMMON(_a), \
371 common<_b>,\
372 constructible<sig>,\
373 extra\
374 > C;\
375 std::vector<int> result = tester<C, void args>::apply();\
376 std::vector<int> expected = make_vector expected_;\
377 BOOST_CHECK_EQUAL_COLLECTIONS(result.begin(), result.end(), \
378 expected.begin(), expected.end());\
379 }
380
381 typedef ::boost::mpl::vector<
382 ::boost::mpl::vector<>,
383 ::boost::type_erasure::relaxed
384 > maybe_relaxed;
385
BOOST_AUTO_TEST_CASE_TEMPLATE(test_default,extra,maybe_relaxed)386 BOOST_AUTO_TEST_CASE_TEMPLATE(test_default, extra, maybe_relaxed)
387 {
388 TEST_CONSTRUCT(_a(), (binding<C>), ());
389 TEST_CONSTRUCT(_a(), (binding<C>&), ());
390 TEST_CONSTRUCT(_a(), (const binding<C>&), ());
391 }
392
393 // test all forms of direct construction that take 1 argument
BOOST_AUTO_TEST_CASE_TEMPLATE(test_construct1,extra,maybe_relaxed)394 BOOST_AUTO_TEST_CASE_TEMPLATE(test_construct1, extra, maybe_relaxed)
395 {
396 // construction from int
397 TEST_CONSTRUCT(_a(int&), (binding<C>, int&), (lvalue | id_int));
398 TEST_CONSTRUCT(_a(int&), (binding<C>&, int&), (lvalue | id_int));
399 TEST_CONSTRUCT(_a(int&), (const binding<C>&, int&), (lvalue | id_int));
400
401 TEST_CONSTRUCT(_a(const int&), (binding<C>, int), (const_lvalue | id_int));
402 TEST_CONSTRUCT(_a(const int&), (binding<C>, int&), (const_lvalue | id_int));
403 TEST_CONSTRUCT(_a(const int&), (binding<C>, const int&), (const_lvalue | id_int));
404 TEST_CONSTRUCT(_a(const int&), (binding<C>&, int), (const_lvalue | id_int));
405 TEST_CONSTRUCT(_a(const int&), (binding<C>&, int&), (const_lvalue | id_int));
406 TEST_CONSTRUCT(_a(const int&), (binding<C>&, const int&), (const_lvalue | id_int));
407 TEST_CONSTRUCT(_a(const int&), (const binding<C>&, int), (const_lvalue | id_int));
408 TEST_CONSTRUCT(_a(const int&), (const binding<C>&, int&), (const_lvalue | id_int));
409 TEST_CONSTRUCT(_a(const int&), (const binding<C>&, const int&), (const_lvalue | id_int));
410
411 TEST_CONSTRUCT(_a(int), (binding<C>, int), (rvalue | id_int));
412 TEST_CONSTRUCT(_a(int), (binding<C>, int&), (rvalue | id_int));
413 TEST_CONSTRUCT(_a(int), (binding<C>, const int&), (rvalue | id_int));
414 TEST_CONSTRUCT(_a(int), (binding<C>&, int), (rvalue | id_int));
415 TEST_CONSTRUCT(_a(int), (binding<C>&, int&), (rvalue | id_int));
416 TEST_CONSTRUCT(_a(int), (binding<C>&, const int&), (rvalue | id_int));
417 TEST_CONSTRUCT(_a(int), (const binding<C>&, int), (rvalue | id_int));
418 TEST_CONSTRUCT(_a(int), (const binding<C>&, int&), (rvalue | id_int));
419 TEST_CONSTRUCT(_a(int), (const binding<C>&, const int&), (rvalue | id_int));
420
421 #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
422 TEST_CONSTRUCT(_a(int&&), (binding<C>, int), (rvalue | id_int));
423 TEST_CONSTRUCT(_a(int&&), (binding<C>&, int), (rvalue | id_int));
424 TEST_CONSTRUCT(_a(int&&), (const binding<C>&, int), (rvalue | id_int));
425 #endif
426
427 // Test same any type
428
429 #ifndef BOOST_NO_CXX11_REF_QUALIFIERS
430 // ambiguous with the copy constructor in C++03
431 TEST_CONSTRUCT(_a(_a&), (any<C, _a>&), (lvalue | id_copy));
432 TEST_CONSTRUCT(_a(_a&), (binding<C>, any<C, _a>&), (lvalue | id_copy));
433 TEST_CONSTRUCT(_a(_a&), (binding<C>&, any<C, _a>&), (lvalue | id_copy));
434 TEST_CONSTRUCT(_a(_a&), (const binding<C>&, any<C, _a>&), (lvalue | id_copy));
435 #endif
436
437 TEST_CONSTRUCT(_a(const _a&), (any<C, _a>), (const_lvalue | id_copy));
438 TEST_CONSTRUCT(_a(const _a&), (any<C, _a>&), (const_lvalue | id_copy));
439 TEST_CONSTRUCT(_a(const _a&), (const any<C, _a>&), (const_lvalue | id_copy));
440 TEST_CONSTRUCT(_a(const _a&), (binding<C>, any<C, _a>), (const_lvalue | id_copy));
441 TEST_CONSTRUCT(_a(const _a&), (binding<C>, any<C, _a>&), (const_lvalue | id_copy));
442 TEST_CONSTRUCT(_a(const _a&), (binding<C>, const any<C, _a>&), (const_lvalue | id_copy));
443 TEST_CONSTRUCT(_a(const _a&), (binding<C>&, any<C, _a>), (const_lvalue | id_copy));
444 TEST_CONSTRUCT(_a(const _a&), (binding<C>&, any<C, _a>&), (const_lvalue | id_copy));
445 TEST_CONSTRUCT(_a(const _a&), (binding<C>&, const any<C, _a>&), (const_lvalue | id_copy));
446 TEST_CONSTRUCT(_a(const _a&), (const binding<C>&, any<C, _a>), (const_lvalue | id_copy));
447 TEST_CONSTRUCT(_a(const _a&), (const binding<C>&, any<C, _a>&), (const_lvalue | id_copy));
448 TEST_CONSTRUCT(_a(const _a&), (const binding<C>&, const any<C, _a>&), (const_lvalue | id_copy));
449
450 #ifndef BOOST_NO_CXX11_REF_QUALIFIERS
451
452 #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
453 TEST_CONSTRUCT(_a(_a&&), (any<C, _a>), (rvalue | id_copy));
454 TEST_CONSTRUCT(_a(_a&&), (binding<C>, any<C, _a>), (rvalue | id_copy));
455 TEST_CONSTRUCT(_a(_a&&), (binding<C>&, any<C, _a>), (rvalue | id_copy));
456 TEST_CONSTRUCT(_a(_a&&), (const binding<C>&, any<C, _a>), (rvalue | id_copy));
457 #endif
458
459 #endif
460
461 // test other any type
462 TEST_CONSTRUCT(_a(_b&), (any<C, _b>&), (lvalue | id_int));
463 TEST_CONSTRUCT(_a(_b&), (binding<C>, any<C, _b>&), (lvalue | id_int));
464 TEST_CONSTRUCT(_a(_b&), (binding<C>&, any<C, _b>&), (lvalue | id_int));
465 TEST_CONSTRUCT(_a(_b&), (const binding<C>&, any<C, _b>&), (lvalue | id_int));
466
467 TEST_CONSTRUCT(_a(const _b&), (any<C, _b>), (const_lvalue | id_int));
468 TEST_CONSTRUCT(_a(const _b&), (any<C, _b>&), (const_lvalue | id_int));
469 TEST_CONSTRUCT(_a(const _b&), (const any<C, _b>&), (const_lvalue | id_int));
470 TEST_CONSTRUCT(_a(const _b&), (binding<C>, any<C, _b>), (const_lvalue | id_int));
471 TEST_CONSTRUCT(_a(const _b&), (binding<C>, any<C, _b>&), (const_lvalue | id_int));
472 TEST_CONSTRUCT(_a(const _b&), (binding<C>, const any<C, _b>&), (const_lvalue | id_int));
473 TEST_CONSTRUCT(_a(const _b&), (binding<C>&, any<C, _b>), (const_lvalue | id_int));
474 TEST_CONSTRUCT(_a(const _b&), (binding<C>&, any<C, _b>&), (const_lvalue | id_int));
475 TEST_CONSTRUCT(_a(const _b&), (binding<C>&, const any<C, _b>&), (const_lvalue | id_int));
476 TEST_CONSTRUCT(_a(const _b&), (const binding<C>&, any<C, _b>), (const_lvalue | id_int));
477 TEST_CONSTRUCT(_a(const _b&), (const binding<C>&, any<C, _b>&), (const_lvalue | id_int));
478 TEST_CONSTRUCT(_a(const _b&), (const binding<C>&, const any<C, _b>&), (const_lvalue | id_int));
479
480 TEST_CONSTRUCT(_a(_b), (any<C, _b>), (rvalue | id_int));
481 TEST_CONSTRUCT(_a(_b), (any<C, _b>&), (rvalue | id_int));
482 TEST_CONSTRUCT(_a(_b), (const any<C, _b>&), (rvalue | id_int));
483 TEST_CONSTRUCT(_a(_b), (binding<C>, any<C, _b>), (rvalue | id_int));
484 TEST_CONSTRUCT(_a(_b), (binding<C>, any<C, _b>&), (rvalue | id_int));
485 TEST_CONSTRUCT(_a(_b), (binding<C>, const any<C, _b>&), (rvalue | id_int));
486 TEST_CONSTRUCT(_a(_b), (binding<C>&, any<C, _b>), (rvalue | id_int));
487 TEST_CONSTRUCT(_a(_b), (binding<C>&, any<C, _b>&), (rvalue | id_int));
488 TEST_CONSTRUCT(_a(_b), (binding<C>&, const any<C, _b>&), (rvalue | id_int));
489 TEST_CONSTRUCT(_a(_b), (const binding<C>&, any<C, _b>), (rvalue | id_int));
490 TEST_CONSTRUCT(_a(_b), (const binding<C>&, any<C, _b>&), (rvalue | id_int));
491 TEST_CONSTRUCT(_a(_b), (const binding<C>&, const any<C, _b>&), (rvalue | id_int));
492
493 #ifndef BOOST_NO_CXX11_REF_QUALIFIERS
494
495 #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
496 TEST_CONSTRUCT(_a(_b&&), (any<C, _b>), (rvalue | id_int));
497 TEST_CONSTRUCT(_a(_b&&), (binding<C>, any<C, _b>), (rvalue | id_int));
498 TEST_CONSTRUCT(_a(_b&&), (binding<C>&, any<C, _b>), (rvalue | id_int));
499 TEST_CONSTRUCT(_a(_b&&), (const binding<C>&, any<C, _b>), (rvalue | id_int));
500 #endif
501
502 #endif
503
504 // test any reference type
505 TEST_CONSTRUCT(_a(_b&), (any<C, _b&>), (lvalue | id_int));
506 TEST_CONSTRUCT(_a(_b&), (any<C, _b&>&), (lvalue | id_int));
507 TEST_CONSTRUCT(_a(_b&), (const any<C, _b&>&), (lvalue | id_int));
508 TEST_CONSTRUCT(_a(_b&), (binding<C>, any<C, _b&>), (lvalue | id_int));
509 TEST_CONSTRUCT(_a(_b&), (binding<C>, any<C, _b&>&), (lvalue | id_int));
510 TEST_CONSTRUCT(_a(_b&), (binding<C>, const any<C, _b&>&), (lvalue | id_int));
511 TEST_CONSTRUCT(_a(_b&), (binding<C>&, any<C, _b&>), (lvalue | id_int));
512 TEST_CONSTRUCT(_a(_b&), (binding<C>&, any<C, _b&>&), (lvalue | id_int));
513 TEST_CONSTRUCT(_a(_b&), (binding<C>&, const any<C, _b&>&), (lvalue | id_int));
514 TEST_CONSTRUCT(_a(_b&), (const binding<C>&, any<C, _b&>), (lvalue | id_int));
515 TEST_CONSTRUCT(_a(_b&), (const binding<C>&, any<C, _b&>&), (lvalue | id_int));
516 TEST_CONSTRUCT(_a(_b&), (const binding<C>&, const any<C, _b&>&), (lvalue | id_int));
517
518 TEST_CONSTRUCT(_a(const _b&), (any<C, _b&>), (const_lvalue | id_int));
519 TEST_CONSTRUCT(_a(const _b&), (any<C, _b&>&), (const_lvalue | id_int));
520 TEST_CONSTRUCT(_a(const _b&), (const any<C, _b&>&), (const_lvalue | id_int));
521 TEST_CONSTRUCT(_a(const _b&), (binding<C>, any<C, _b&>), (const_lvalue | id_int));
522 TEST_CONSTRUCT(_a(const _b&), (binding<C>, any<C, _b&>&), (const_lvalue | id_int));
523 TEST_CONSTRUCT(_a(const _b&), (binding<C>, const any<C, _b&>&), (const_lvalue | id_int));
524 TEST_CONSTRUCT(_a(const _b&), (binding<C>&, any<C, _b&>), (const_lvalue | id_int));
525 TEST_CONSTRUCT(_a(const _b&), (binding<C>&, any<C, _b&>&), (const_lvalue | id_int));
526 TEST_CONSTRUCT(_a(const _b&), (binding<C>&, const any<C, _b&>&), (const_lvalue | id_int));
527 TEST_CONSTRUCT(_a(const _b&), (const binding<C>&, any<C, _b&>), (const_lvalue | id_int));
528 TEST_CONSTRUCT(_a(const _b&), (const binding<C>&, any<C, _b&>&), (const_lvalue | id_int));
529 TEST_CONSTRUCT(_a(const _b&), (const binding<C>&, const any<C, _b&>&), (const_lvalue | id_int));
530
531 TEST_CONSTRUCT(_a(_b), (any<C, _b&>), (rvalue | id_int));
532 TEST_CONSTRUCT(_a(_b), (any<C, _b&>&), (rvalue | id_int));
533 TEST_CONSTRUCT(_a(_b), (const any<C, _b&>&), (rvalue | id_int));
534 TEST_CONSTRUCT(_a(_b), (binding<C>, any<C, _b&>), (rvalue | id_int));
535 TEST_CONSTRUCT(_a(_b), (binding<C>, any<C, _b&>&), (rvalue | id_int));
536 TEST_CONSTRUCT(_a(_b), (binding<C>, const any<C, _b&>&), (rvalue | id_int));
537 TEST_CONSTRUCT(_a(_b), (binding<C>&, any<C, _b&>), (rvalue | id_int));
538 TEST_CONSTRUCT(_a(_b), (binding<C>&, any<C, _b&>&), (rvalue | id_int));
539 TEST_CONSTRUCT(_a(_b), (binding<C>&, const any<C, _b&>&), (rvalue | id_int));
540 TEST_CONSTRUCT(_a(_b), (const binding<C>&, any<C, _b&>), (rvalue | id_int));
541 TEST_CONSTRUCT(_a(_b), (const binding<C>&, any<C, _b&>&), (rvalue | id_int));
542 TEST_CONSTRUCT(_a(_b), (const binding<C>&, const any<C, _b&>&), (rvalue | id_int));
543
544 // test const any reference type
545 TEST_CONSTRUCT(_a(const _b&), (any<C, const _b&>), (const_lvalue | id_int));
546 TEST_CONSTRUCT(_a(const _b&), (any<C, const _b&>&), (const_lvalue | id_int));
547 TEST_CONSTRUCT(_a(const _b&), (const any<C, const _b&>&), (const_lvalue | id_int));
548 TEST_CONSTRUCT(_a(const _b&), (binding<C>, any<C, const _b&>), (const_lvalue | id_int));
549 TEST_CONSTRUCT(_a(const _b&), (binding<C>, any<C, const _b&>&), (const_lvalue | id_int));
550 TEST_CONSTRUCT(_a(const _b&), (binding<C>, const any<C, const _b&>&), (const_lvalue | id_int));
551 TEST_CONSTRUCT(_a(const _b&), (binding<C>&, any<C, const _b&>), (const_lvalue | id_int));
552 TEST_CONSTRUCT(_a(const _b&), (binding<C>&, any<C, const _b&>&), (const_lvalue | id_int));
553 TEST_CONSTRUCT(_a(const _b&), (binding<C>&, const any<C, const _b&>&), (const_lvalue | id_int));
554 TEST_CONSTRUCT(_a(const _b&), (const binding<C>&, any<C, const _b&>), (const_lvalue | id_int));
555 TEST_CONSTRUCT(_a(const _b&), (const binding<C>&, any<C, const _b&>&), (const_lvalue | id_int));
556 TEST_CONSTRUCT(_a(const _b&), (const binding<C>&, const any<C, const _b&>&), (const_lvalue | id_int));
557
558 TEST_CONSTRUCT(_a(_b), (any<C, const _b&>), (rvalue | id_int));
559 TEST_CONSTRUCT(_a(_b), (any<C, const _b&>&), (rvalue | id_int));
560 TEST_CONSTRUCT(_a(_b), (const any<C, const _b&>&), (rvalue | id_int));
561 TEST_CONSTRUCT(_a(_b), (binding<C>, any<C, const _b&>), (rvalue | id_int));
562 TEST_CONSTRUCT(_a(_b), (binding<C>, any<C, const _b&>&), (rvalue | id_int));
563 TEST_CONSTRUCT(_a(_b), (binding<C>, const any<C, const _b&>&), (rvalue | id_int));
564 TEST_CONSTRUCT(_a(_b), (binding<C>&, any<C, const _b&>), (rvalue | id_int));
565 TEST_CONSTRUCT(_a(_b), (binding<C>&, any<C, const _b&>&), (rvalue | id_int));
566 TEST_CONSTRUCT(_a(_b), (binding<C>&, const any<C, const _b&>&), (rvalue | id_int));
567 TEST_CONSTRUCT(_a(_b), (const binding<C>&, any<C, const _b&>), (rvalue | id_int));
568 TEST_CONSTRUCT(_a(_b), (const binding<C>&, any<C, const _b&>&), (rvalue | id_int));
569 TEST_CONSTRUCT(_a(_b), (const binding<C>&, const any<C, const _b&>&), (rvalue | id_int));
570
571 #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
572
573 // test any rvalue reference type
574 TEST_CONSTRUCT(_a(const _b&), (any<C, _b&&>), (const_lvalue | id_int));
575 TEST_CONSTRUCT(_a(const _b&), (any<C, _b&&>&), (const_lvalue | id_int));
576 TEST_CONSTRUCT(_a(const _b&), (const any<C, _b&&>&), (const_lvalue | id_int));
577 TEST_CONSTRUCT(_a(const _b&), (binding<C>, any<C, _b&&>), (const_lvalue | id_int));
578 TEST_CONSTRUCT(_a(const _b&), (binding<C>, any<C, _b&&>&), (const_lvalue | id_int));
579 TEST_CONSTRUCT(_a(const _b&), (binding<C>, const any<C, _b&&>&), (const_lvalue | id_int));
580 TEST_CONSTRUCT(_a(const _b&), (binding<C>&, any<C, _b&&>), (const_lvalue | id_int));
581 TEST_CONSTRUCT(_a(const _b&), (binding<C>&, any<C, _b&&>&), (const_lvalue | id_int));
582 TEST_CONSTRUCT(_a(const _b&), (binding<C>&, const any<C, _b&&>&), (const_lvalue | id_int));
583 TEST_CONSTRUCT(_a(const _b&), (const binding<C>&, any<C, _b&&>), (const_lvalue | id_int));
584 TEST_CONSTRUCT(_a(const _b&), (const binding<C>&, any<C, _b&&>&), (const_lvalue | id_int));
585 TEST_CONSTRUCT(_a(const _b&), (const binding<C>&, const any<C, _b&&>&), (const_lvalue | id_int));
586
587 TEST_CONSTRUCT(_a(_b), (any<C, _b&&>), (rvalue | id_int));
588 TEST_CONSTRUCT(_a(_b), (any<C, _b&&>&), (rvalue | id_int));
589 TEST_CONSTRUCT(_a(_b), (const any<C, _b&&>&), (rvalue | id_int));
590 TEST_CONSTRUCT(_a(_b), (binding<C>, any<C, _b&&>), (rvalue | id_int));
591 TEST_CONSTRUCT(_a(_b), (binding<C>, any<C, _b&&>&), (rvalue | id_int));
592 TEST_CONSTRUCT(_a(_b), (binding<C>, const any<C, _b&&>&), (rvalue | id_int));
593 TEST_CONSTRUCT(_a(_b), (binding<C>&, any<C, _b&&>), (rvalue | id_int));
594 TEST_CONSTRUCT(_a(_b), (binding<C>&, any<C, _b&&>&), (rvalue | id_int));
595 TEST_CONSTRUCT(_a(_b), (binding<C>&, const any<C, _b&&>&), (rvalue | id_int));
596 TEST_CONSTRUCT(_a(_b), (const binding<C>&, any<C, _b&&>), (rvalue | id_int));
597 TEST_CONSTRUCT(_a(_b), (const binding<C>&, any<C, _b&&>&), (rvalue | id_int));
598 TEST_CONSTRUCT(_a(_b), (const binding<C>&, const any<C, _b&&>&), (rvalue | id_int));
599
600 TEST_CONSTRUCT(_a(_b&&), (any<C, _b&&>), (rvalue | id_int));
601 TEST_CONSTRUCT(_a(_b&&), (any<C, _b&&>&), (rvalue | id_int));
602 TEST_CONSTRUCT(_a(_b&&), (const any<C, _b&&>&), (rvalue | id_int));
603 TEST_CONSTRUCT(_a(_b&&), (binding<C>, any<C, _b&&>), (rvalue | id_int));
604 TEST_CONSTRUCT(_a(_b&&), (binding<C>, any<C, _b&&>&), (rvalue | id_int));
605 TEST_CONSTRUCT(_a(_b&&), (binding<C>, const any<C, _b&&>&), (rvalue | id_int));
606 TEST_CONSTRUCT(_a(_b&&), (binding<C>&, any<C, _b&&>), (rvalue | id_int));
607 TEST_CONSTRUCT(_a(_b&&), (binding<C>&, any<C, _b&&>&), (rvalue | id_int));
608 TEST_CONSTRUCT(_a(_b&&), (binding<C>&, const any<C, _b&&>&), (rvalue | id_int));
609 TEST_CONSTRUCT(_a(_b&&), (const binding<C>&, any<C, _b&&>), (rvalue | id_int));
610 TEST_CONSTRUCT(_a(_b&&), (const binding<C>&, any<C, _b&&>&), (rvalue | id_int));
611 TEST_CONSTRUCT(_a(_b&&), (const binding<C>&, const any<C, _b&&>&), (rvalue | id_int));
612
613 #endif
614
615 }
616
617 // test constructors with 2 parameters
BOOST_AUTO_TEST_CASE_TEMPLATE(test_construct2,extra,maybe_relaxed)618 BOOST_AUTO_TEST_CASE_TEMPLATE(test_construct2, extra, maybe_relaxed)
619 {
620 TEST_CONSTRUCT(_a(int, int), (binding<C>, int, int), (rvalue | id_int, rvalue | id_int));
621 TEST_CONSTRUCT(_a(int, int), (binding<C>, int, int&), (rvalue | id_int, rvalue | id_int));
622 TEST_CONSTRUCT(_a(int, int), (binding<C>, int, const int&), (rvalue | id_int, rvalue | id_int));
623 TEST_CONSTRUCT(_a(int, int), (binding<C>, int&, int), (rvalue | id_int, rvalue | id_int));
624 TEST_CONSTRUCT(_a(int, int), (binding<C>, int&, int&), (rvalue | id_int, rvalue | id_int));
625 TEST_CONSTRUCT(_a(int, int), (binding<C>, int&, const int&), (rvalue | id_int, rvalue | id_int));
626 TEST_CONSTRUCT(_a(int, int), (binding<C>, const int&, int), (rvalue | id_int, rvalue | id_int));
627 TEST_CONSTRUCT(_a(int, int), (binding<C>, const int&, int&), (rvalue | id_int, rvalue | id_int));
628 TEST_CONSTRUCT(_a(int, int), (binding<C>, const int&, const int&), (rvalue | id_int, rvalue | id_int));
629 TEST_CONSTRUCT(_a(int, int), (binding<C>&, int, int), (rvalue | id_int, rvalue | id_int));
630 TEST_CONSTRUCT(_a(int, int), (binding<C>&, int, int&), (rvalue | id_int, rvalue | id_int));
631 TEST_CONSTRUCT(_a(int, int), (binding<C>&, int, const int&), (rvalue | id_int, rvalue | id_int));
632 TEST_CONSTRUCT(_a(int, int), (binding<C>&, int&, int), (rvalue | id_int, rvalue | id_int));
633 TEST_CONSTRUCT(_a(int, int), (binding<C>&, int&, int&), (rvalue | id_int, rvalue | id_int));
634 TEST_CONSTRUCT(_a(int, int), (binding<C>&, int&, const int&), (rvalue | id_int, rvalue | id_int));
635 TEST_CONSTRUCT(_a(int, int), (binding<C>&, const int&, int), (rvalue | id_int, rvalue | id_int));
636 TEST_CONSTRUCT(_a(int, int), (binding<C>&, const int&, int&), (rvalue | id_int, rvalue | id_int));
637 TEST_CONSTRUCT(_a(int, int), (binding<C>&, const int&, const int&), (rvalue | id_int, rvalue | id_int));
638 TEST_CONSTRUCT(_a(int, int), (const binding<C>&, int, int), (rvalue | id_int, rvalue | id_int));
639 TEST_CONSTRUCT(_a(int, int), (const binding<C>&, int, int&), (rvalue | id_int, rvalue | id_int));
640 TEST_CONSTRUCT(_a(int, int), (const binding<C>&, int, const int&), (rvalue | id_int, rvalue | id_int));
641 TEST_CONSTRUCT(_a(int, int), (const binding<C>&, int&, int), (rvalue | id_int, rvalue | id_int));
642 TEST_CONSTRUCT(_a(int, int), (const binding<C>&, int&, int&), (rvalue | id_int, rvalue | id_int));
643 TEST_CONSTRUCT(_a(int, int), (const binding<C>&, int&, const int&), (rvalue | id_int, rvalue | id_int));
644 TEST_CONSTRUCT(_a(int, int), (const binding<C>&, const int&, int), (rvalue | id_int, rvalue | id_int));
645 TEST_CONSTRUCT(_a(int, int), (const binding<C>&, const int&, int&), (rvalue | id_int, rvalue | id_int));
646 TEST_CONSTRUCT(_a(int, int), (const binding<C>&, const int&, const int&), (rvalue | id_int, rvalue | id_int));
647 }
648
BOOST_AUTO_TEST_CASE(test_overload)649 BOOST_AUTO_TEST_CASE(test_overload)
650 {
651 typedef ::boost::mpl::vector<
652 common<_a>,
653 common<_b>,
654 constructible<_a(_b)>,
655 constructible<_a(std::size_t)>
656 > test_concept;
657 typedef ::boost::mpl::map<
658 ::boost::mpl::pair<_a, std::vector<int> >,
659 ::boost::mpl::pair<_b, std::size_t>
660 > types;
661 binding<test_concept> table = make_binding<types>();
662 any<test_concept, _b> x(static_cast<std::size_t>(10), make_binding<types>());
663 any<test_concept, _a> y(x);
664 any<test_concept, _a> z(table, 17);
665 std::vector<int> vec1(any_cast<std::vector<int> >(y));
666 BOOST_CHECK_EQUAL(vec1.size(), 10u);
667 std::vector<int> vec2(any_cast<std::vector<int> >(z));
668 BOOST_CHECK_EQUAL(vec2.size(), 17u);
669 }
670
671 template<class T>
as_rvalue(const T & arg)672 T as_rvalue(const T& arg) { return arg; }
673 template<class T>
as_const(const T & arg)674 const T& as_const(const T& arg) { return arg; }
675
BOOST_AUTO_TEST_CASE(test_from_int_with_binding)676 BOOST_AUTO_TEST_CASE(test_from_int_with_binding)
677 {
678 typedef ::boost::mpl::vector<common<> > test_concept;
679 static_binding<boost::mpl::map<boost::mpl::pair<_self, int> > > binding =
680 make_binding<boost::mpl::map<boost::mpl::pair<_self, int> > >();
681 int value = 4;
682
683 any<test_concept> x1(value, binding);
684 BOOST_CHECK_EQUAL(any_cast<int>(x1), 4);
685 any<test_concept> x2(value, as_rvalue(binding));
686 BOOST_CHECK_EQUAL(any_cast<int>(x2), 4);
687 any<test_concept> x3(value, as_const(binding));
688 BOOST_CHECK_EQUAL(any_cast<int>(x3), 4);
689
690 any<test_concept> y1(as_rvalue(value), binding);
691 BOOST_CHECK_EQUAL(any_cast<int>(y1), 4);
692 any<test_concept> y2(as_rvalue(value), as_rvalue(binding));
693 BOOST_CHECK_EQUAL(any_cast<int>(y2), 4);
694 any<test_concept> y3(as_rvalue(value), as_const(binding));
695 BOOST_CHECK_EQUAL(any_cast<int>(y3), 4);
696
697 any<test_concept> z1(as_const(value), binding);
698 BOOST_CHECK_EQUAL(any_cast<int>(z1), 4);
699 any<test_concept> z2(as_const(value), as_rvalue(binding));
700 BOOST_CHECK_EQUAL(any_cast<int>(z2), 4);
701 any<test_concept> z3(as_const(value), as_const(binding));
702 BOOST_CHECK_EQUAL(any_cast<int>(z3), 4);
703 }
704
BOOST_AUTO_TEST_CASE(test_copy)705 BOOST_AUTO_TEST_CASE(test_copy)
706 {
707 typedef ::boost::mpl::vector<common<> > test_concept;
708 any<test_concept> x(4);
709 BOOST_CHECK_EQUAL(any_cast<int>(x), 4);
710 any<test_concept> y(x);
711 BOOST_CHECK_EQUAL(any_cast<int>(y), 4);
712 any<test_concept> z(as_rvalue(x));
713 BOOST_CHECK_EQUAL(any_cast<int>(z), 4);
714 any<test_concept> w(as_const(x));
715 BOOST_CHECK_EQUAL(any_cast<int>(w), 4);
716 }
717
BOOST_AUTO_TEST_CASE(test_copy_implicit)718 BOOST_AUTO_TEST_CASE(test_copy_implicit)
719 {
720 typedef ::boost::mpl::vector<common<>, common<_a> > test_concept;
721 any<test_concept> x(4, make_binding< ::boost::mpl::map< ::boost::mpl::pair<_self, int>, ::boost::mpl::pair<_a, int> > >());
722 BOOST_CHECK_EQUAL(any_cast<int>(x), 4);
723
724 any<test_concept> y = x;
725 BOOST_CHECK_EQUAL(any_cast<int>(y), 4);
726 any<test_concept> z = as_rvalue(x);
727 BOOST_CHECK_EQUAL(any_cast<int>(z), 4);
728 any<test_concept> w = as_const(x);
729 BOOST_CHECK_EQUAL(any_cast<int>(w), 4);
730 }
731
BOOST_AUTO_TEST_CASE(test_convert)732 BOOST_AUTO_TEST_CASE(test_convert)
733 {
734 typedef ::boost::mpl::vector<common<>, incrementable<> > src_concept;
735 typedef ::boost::mpl::vector<common<> > dst_concept;
736 any<src_concept> x(4);
737 BOOST_CHECK_EQUAL(any_cast<int>(x), 4);
738 any<dst_concept> y(x);
739 BOOST_CHECK_EQUAL(any_cast<int>(y), 4);
740 any<dst_concept> z = as_rvalue(x);
741 BOOST_CHECK_EQUAL(any_cast<int>(z), 4);
742 any<dst_concept> w = as_const(x);
743 BOOST_CHECK_EQUAL(any_cast<int>(w), 4);
744 }
745
BOOST_AUTO_TEST_CASE(test_rebind)746 BOOST_AUTO_TEST_CASE(test_rebind)
747 {
748 typedef ::boost::mpl::vector<common<> > src_concept;
749 typedef ::boost::mpl::vector<common<_a> > dst_concept;
750 any<src_concept> x(4);
751 BOOST_CHECK_EQUAL(any_cast<int>(x), 4);
752 any<dst_concept, _a> y = x;
753 BOOST_CHECK_EQUAL(any_cast<int>(y), 4);
754 any<dst_concept, _a> z = as_rvalue(x);
755 BOOST_CHECK_EQUAL(any_cast<int>(z), 4);
756 any<dst_concept, _a> w = as_const(x);
757 BOOST_CHECK_EQUAL(any_cast<int>(w), 4);
758 }
759
BOOST_AUTO_TEST_CASE(test_rebind_and_convert)760 BOOST_AUTO_TEST_CASE(test_rebind_and_convert)
761 {
762 typedef ::boost::mpl::vector<common<>, incrementable<> > src_concept;
763 typedef ::boost::mpl::vector<common<_a> > dst_concept;
764 any<src_concept> x(4);
765 BOOST_CHECK_EQUAL(any_cast<int>(x), 4);
766 any<dst_concept, _a> y(x);
767 BOOST_CHECK_EQUAL(any_cast<int>(y), 4);
768 any<dst_concept, _a> z = as_rvalue(x);
769 BOOST_CHECK_EQUAL(any_cast<int>(z), 4);
770 any<dst_concept, _a> w = as_const(x);
771 BOOST_CHECK_EQUAL(any_cast<int>(w), 4);
772 }
773
BOOST_AUTO_TEST_CASE(test_rebind_and_convert_with_binding)774 BOOST_AUTO_TEST_CASE(test_rebind_and_convert_with_binding)
775 {
776 typedef ::boost::mpl::vector<common<>, incrementable<> > src_concept;
777 typedef ::boost::mpl::vector<common<_a> > dst_concept;
778 typedef ::boost::mpl::map<boost::mpl::pair<_a, _self> > map;
779 typedef ::boost::mpl::map<boost::mpl::pair<_a, int> > types;
780
781 static_binding<map> s_table(make_binding<map>());
782 binding<dst_concept> table(make_binding<types>());
783
784 any<src_concept> x(4);
785 BOOST_CHECK_EQUAL(any_cast<int>(x), 4);
786
787 // lvalues
788 any<dst_concept, _a> y1(x, s_table);
789 BOOST_CHECK_EQUAL(any_cast<int>(y1), 4);
790 any<dst_concept, _a> y2(x, as_rvalue(s_table));
791 BOOST_CHECK_EQUAL(any_cast<int>(y2), 4);
792 any<dst_concept, _a> y3(x, as_const(s_table));
793 BOOST_CHECK_EQUAL(any_cast<int>(y3), 4);
794 any<dst_concept, _a> z1(x, table);
795 BOOST_CHECK_EQUAL(any_cast<int>(z1), 4);
796 any<dst_concept, _a> z2(x, as_rvalue(table));
797 BOOST_CHECK_EQUAL(any_cast<int>(z2), 4);
798 any<dst_concept, _a> z3(x, as_const(table));
799 BOOST_CHECK_EQUAL(any_cast<int>(z3), 4);
800
801 // rvalues
802 any<dst_concept, _a> ry1(as_rvalue(x), s_table);
803 BOOST_CHECK_EQUAL(any_cast<int>(ry1), 4);
804 any<dst_concept, _a> ry2(as_rvalue(x), as_rvalue(s_table));
805 BOOST_CHECK_EQUAL(any_cast<int>(ry2), 4);
806 any<dst_concept, _a> ry3(as_rvalue(x), as_const(s_table));
807 BOOST_CHECK_EQUAL(any_cast<int>(ry3), 4);
808 any<dst_concept, _a> rz1(as_rvalue(x), table);
809 BOOST_CHECK_EQUAL(any_cast<int>(rz1), 4);
810 any<dst_concept, _a> rz2(as_rvalue(x), as_rvalue(table));
811 BOOST_CHECK_EQUAL(any_cast<int>(rz2), 4);
812 any<dst_concept, _a> rz3(as_rvalue(x), as_rvalue(table));
813 BOOST_CHECK_EQUAL(any_cast<int>(rz3), 4);
814
815 // const lvalues
816 any<dst_concept, _a> cy1(as_const(x), s_table);
817 BOOST_CHECK_EQUAL(any_cast<int>(cy1), 4);
818 any<dst_concept, _a> cy2(as_const(x), as_rvalue(s_table));
819 BOOST_CHECK_EQUAL(any_cast<int>(cy2), 4);
820 any<dst_concept, _a> cy3(as_const(x), as_const(s_table));
821 BOOST_CHECK_EQUAL(any_cast<int>(cy3), 4);
822 any<dst_concept, _a> cz1(as_const(x), table);
823 BOOST_CHECK_EQUAL(any_cast<int>(cz1), 4);
824 any<dst_concept, _a> cz2(as_const(x), as_rvalue(table));
825 BOOST_CHECK_EQUAL(any_cast<int>(cz2), 4);
826 any<dst_concept, _a> cz3(as_const(x), as_rvalue(table));
827 BOOST_CHECK_EQUAL(any_cast<int>(cz3), 4);
828 }
829
BOOST_AUTO_TEST_CASE(test_copy_from_ref)830 BOOST_AUTO_TEST_CASE(test_copy_from_ref)
831 {
832 typedef ::boost::mpl::vector<common<> > test_concept;
833 int i = 4;
834 any<test_concept, _self&> x(i);
835 BOOST_CHECK_EQUAL(any_cast<int>(x), 4);
836 any<test_concept> y(x);
837 BOOST_CHECK_EQUAL(any_cast<int>(y), 4);
838 any<test_concept> z = as_rvalue(x);
839 BOOST_CHECK_EQUAL(any_cast<int>(z), 4);
840 any<test_concept> w = as_const(x);
841 BOOST_CHECK_EQUAL(any_cast<int>(w), 4);
842 }
843
BOOST_AUTO_TEST_CASE(test_convert_from_ref)844 BOOST_AUTO_TEST_CASE(test_convert_from_ref)
845 {
846 typedef ::boost::mpl::vector<common<>, incrementable<> > src_concept;
847 typedef ::boost::mpl::vector<common<> > dst_concept;
848 int i = 4;
849 any<src_concept, _self&> x(i);
850 BOOST_CHECK_EQUAL(any_cast<int>(x), 4);
851 any<dst_concept> y(x);
852 BOOST_CHECK_EQUAL(any_cast<int>(y), 4);
853 any<dst_concept> z = as_rvalue(x);
854 BOOST_CHECK_EQUAL(any_cast<int>(z), 4);
855 any<dst_concept> w = as_const(x);
856 BOOST_CHECK_EQUAL(any_cast<int>(w), 4);
857 }
858
BOOST_AUTO_TEST_CASE(test_rebind_from_ref)859 BOOST_AUTO_TEST_CASE(test_rebind_from_ref)
860 {
861 typedef ::boost::mpl::vector<common<> > src_concept;
862 typedef ::boost::mpl::vector<common<_a> > dst_concept;
863 int i = 4;
864 any<src_concept, _self&> x(i);
865 BOOST_CHECK_EQUAL(any_cast<int>(x), 4);
866 any<dst_concept, _a> y(x);
867 BOOST_CHECK_EQUAL(any_cast<int>(y), 4);
868 any<dst_concept, _a> z = as_rvalue(x);
869 BOOST_CHECK_EQUAL(any_cast<int>(z), 4);
870 any<dst_concept, _a> w = as_const(x);
871 BOOST_CHECK_EQUAL(any_cast<int>(w), 4);
872 }
873
BOOST_AUTO_TEST_CASE(test_rebind_and_convert_from_ref)874 BOOST_AUTO_TEST_CASE(test_rebind_and_convert_from_ref)
875 {
876 typedef ::boost::mpl::vector<common<>, incrementable<> > src_concept;
877 typedef ::boost::mpl::vector<common<_a> > dst_concept;
878 int i = 4;
879 any<src_concept, _self&> x(i);
880 BOOST_CHECK_EQUAL(any_cast<int>(x), 4);
881 any<dst_concept, _a> y(x);
882 BOOST_CHECK_EQUAL(any_cast<int>(y), 4);
883 any<dst_concept, _a> z = as_rvalue(x);
884 BOOST_CHECK_EQUAL(any_cast<int>(z), 4);
885 any<dst_concept, _a> w = as_const(x);
886 BOOST_CHECK_EQUAL(any_cast<int>(w), 4);
887 }
888
BOOST_AUTO_TEST_CASE(test_rebind_and_convert_with_binding_from_ref)889 BOOST_AUTO_TEST_CASE(test_rebind_and_convert_with_binding_from_ref)
890 {
891 typedef ::boost::mpl::vector<common<>, incrementable<> > src_concept;
892 typedef ::boost::mpl::vector<common<_a> > dst_concept;
893 typedef ::boost::mpl::map<boost::mpl::pair<_a, _self> > map;
894 typedef ::boost::mpl::map<boost::mpl::pair<_a, int> > types;
895
896 static_binding<map> s_table(make_binding<map>());
897 binding<dst_concept> table(make_binding<types>());
898
899 int i = 4;
900 any<src_concept, _self&> x(i);
901 BOOST_CHECK_EQUAL(any_cast<int>(x), 4);
902
903 // lvalues
904 any<dst_concept, _a> y1(x, s_table);
905 BOOST_CHECK_EQUAL(any_cast<int>(y1), 4);
906 any<dst_concept, _a> y2(x, as_rvalue(s_table));
907 BOOST_CHECK_EQUAL(any_cast<int>(y2), 4);
908 any<dst_concept, _a> y3(x, as_const(s_table));
909 BOOST_CHECK_EQUAL(any_cast<int>(y3), 4);
910 any<dst_concept, _a> z1(x, table);
911 BOOST_CHECK_EQUAL(any_cast<int>(z1), 4);
912 any<dst_concept, _a> z2(x, as_rvalue(table));
913 BOOST_CHECK_EQUAL(any_cast<int>(z2), 4);
914 any<dst_concept, _a> z3(x, as_const(table));
915 BOOST_CHECK_EQUAL(any_cast<int>(z3), 4);
916
917 // rvalues
918 any<dst_concept, _a> ry1(as_rvalue(x), s_table);
919 BOOST_CHECK_EQUAL(any_cast<int>(ry1), 4);
920 any<dst_concept, _a> ry2(as_rvalue(x), as_rvalue(s_table));
921 BOOST_CHECK_EQUAL(any_cast<int>(ry2), 4);
922 any<dst_concept, _a> ry3(as_rvalue(x), as_const(s_table));
923 BOOST_CHECK_EQUAL(any_cast<int>(ry3), 4);
924 any<dst_concept, _a> rz1(as_rvalue(x), table);
925 BOOST_CHECK_EQUAL(any_cast<int>(rz1), 4);
926 any<dst_concept, _a> rz2(as_rvalue(x), as_rvalue(table));
927 BOOST_CHECK_EQUAL(any_cast<int>(rz2), 4);
928 any<dst_concept, _a> rz3(as_rvalue(x), as_rvalue(table));
929 BOOST_CHECK_EQUAL(any_cast<int>(rz3), 4);
930
931 // const lvalues
932 any<dst_concept, _a> cy1(as_const(x), s_table);
933 BOOST_CHECK_EQUAL(any_cast<int>(cy1), 4);
934 any<dst_concept, _a> cy2(as_const(x), as_rvalue(s_table));
935 BOOST_CHECK_EQUAL(any_cast<int>(cy2), 4);
936 any<dst_concept, _a> cy3(as_const(x), as_const(s_table));
937 BOOST_CHECK_EQUAL(any_cast<int>(cy3), 4);
938 any<dst_concept, _a> cz1(as_const(x), table);
939 BOOST_CHECK_EQUAL(any_cast<int>(cz1), 4);
940 any<dst_concept, _a> cz2(as_const(x), as_rvalue(table));
941 BOOST_CHECK_EQUAL(any_cast<int>(cz2), 4);
942 any<dst_concept, _a> cz3(as_const(x), as_rvalue(table));
943 BOOST_CHECK_EQUAL(any_cast<int>(cz3), 4);
944 }
945
BOOST_AUTO_TEST_CASE(test_copy_from_cref)946 BOOST_AUTO_TEST_CASE(test_copy_from_cref)
947 {
948 typedef ::boost::mpl::vector<common<> > test_concept;
949 int i = 4;
950 any<test_concept, const _self&> x(i);
951 BOOST_CHECK_EQUAL(any_cast<int>(x), 4);
952 any<test_concept> y(x);
953 BOOST_CHECK_EQUAL(any_cast<int>(y), 4);
954 any<test_concept> z = as_rvalue(x);
955 BOOST_CHECK_EQUAL(any_cast<int>(z), 4);
956 any<test_concept> w = as_const(x);
957 BOOST_CHECK_EQUAL(any_cast<int>(w), 4);
958 }
959
BOOST_AUTO_TEST_CASE(test_convert_from_cref)960 BOOST_AUTO_TEST_CASE(test_convert_from_cref)
961 {
962 typedef ::boost::mpl::vector<common<>, incrementable<> > src_concept;
963 typedef ::boost::mpl::vector<common<> > dst_concept;
964 int i = 4;
965 any<src_concept, const _self&> x(i);
966 BOOST_CHECK_EQUAL(any_cast<int>(x), 4);
967 any<dst_concept> y(x);
968 BOOST_CHECK_EQUAL(any_cast<int>(y), 4);
969 any<dst_concept> z = as_rvalue(x);
970 BOOST_CHECK_EQUAL(any_cast<int>(z), 4);
971 any<dst_concept> w = as_const(x);
972 BOOST_CHECK_EQUAL(any_cast<int>(w), 4);
973 }
974
BOOST_AUTO_TEST_CASE(test_rebind_from_cref)975 BOOST_AUTO_TEST_CASE(test_rebind_from_cref)
976 {
977 typedef ::boost::mpl::vector<common<> > src_concept;
978 typedef ::boost::mpl::vector<common<_a> > dst_concept;
979 int i = 4;
980 any<src_concept, const _self&> x(i);
981 BOOST_CHECK_EQUAL(any_cast<int>(x), 4);
982 any<dst_concept, _a> y(x);
983 BOOST_CHECK_EQUAL(any_cast<int>(y), 4);
984 any<dst_concept, _a> z = as_rvalue(x);
985 BOOST_CHECK_EQUAL(any_cast<int>(z), 4);
986 any<dst_concept, _a> w = as_const(x);
987 BOOST_CHECK_EQUAL(any_cast<int>(w), 4);
988 }
989
BOOST_AUTO_TEST_CASE(test_rebind_and_convert_from_cref)990 BOOST_AUTO_TEST_CASE(test_rebind_and_convert_from_cref)
991 {
992 typedef ::boost::mpl::vector<common<>, incrementable<> > src_concept;
993 typedef ::boost::mpl::vector<common<_a> > dst_concept;
994 int i = 4;
995 any<src_concept, const _self&> x(i);
996 BOOST_CHECK_EQUAL(any_cast<int>(x), 4);
997 any<dst_concept, _a> y(x);
998 BOOST_CHECK_EQUAL(any_cast<int>(y), 4);
999 any<dst_concept, _a> z = as_rvalue(x);
1000 BOOST_CHECK_EQUAL(any_cast<int>(z), 4);
1001 any<dst_concept, _a> w = as_const(x);
1002 BOOST_CHECK_EQUAL(any_cast<int>(w), 4);
1003 }
1004
BOOST_AUTO_TEST_CASE(test_rebind_and_convert_with_binding_from_cref)1005 BOOST_AUTO_TEST_CASE(test_rebind_and_convert_with_binding_from_cref)
1006 {
1007 typedef ::boost::mpl::vector<common<>, incrementable<> > src_concept;
1008 typedef ::boost::mpl::vector<common<_a> > dst_concept;
1009 typedef ::boost::mpl::map<boost::mpl::pair<_a, _self> > map;
1010 typedef ::boost::mpl::map<boost::mpl::pair<_a, int> > types;
1011
1012 static_binding<map> s_table(make_binding<map>());
1013 binding<dst_concept> table(make_binding<types>());
1014
1015 int i = 4;
1016 any<src_concept, const _self&> x(i);
1017 BOOST_CHECK_EQUAL(any_cast<int>(x), 4);
1018
1019 // lvalues
1020 any<dst_concept, _a> y1(x, s_table);
1021 BOOST_CHECK_EQUAL(any_cast<int>(y1), 4);
1022 any<dst_concept, _a> y2(x, as_rvalue(s_table));
1023 BOOST_CHECK_EQUAL(any_cast<int>(y2), 4);
1024 any<dst_concept, _a> y3(x, as_const(s_table));
1025 BOOST_CHECK_EQUAL(any_cast<int>(y3), 4);
1026 any<dst_concept, _a> z1(x, table);
1027 BOOST_CHECK_EQUAL(any_cast<int>(z1), 4);
1028 any<dst_concept, _a> z2(x, as_rvalue(table));
1029 BOOST_CHECK_EQUAL(any_cast<int>(z2), 4);
1030 any<dst_concept, _a> z3(x, as_const(table));
1031 BOOST_CHECK_EQUAL(any_cast<int>(z3), 4);
1032
1033 // rvalues
1034 any<dst_concept, _a> ry1(as_rvalue(x), s_table);
1035 BOOST_CHECK_EQUAL(any_cast<int>(ry1), 4);
1036 any<dst_concept, _a> ry2(as_rvalue(x), as_rvalue(s_table));
1037 BOOST_CHECK_EQUAL(any_cast<int>(ry2), 4);
1038 any<dst_concept, _a> ry3(as_rvalue(x), as_const(s_table));
1039 BOOST_CHECK_EQUAL(any_cast<int>(ry3), 4);
1040 any<dst_concept, _a> rz1(as_rvalue(x), table);
1041 BOOST_CHECK_EQUAL(any_cast<int>(rz1), 4);
1042 any<dst_concept, _a> rz2(as_rvalue(x), as_rvalue(table));
1043 BOOST_CHECK_EQUAL(any_cast<int>(rz2), 4);
1044 any<dst_concept, _a> rz3(as_rvalue(x), as_rvalue(table));
1045 BOOST_CHECK_EQUAL(any_cast<int>(rz3), 4);
1046
1047 // const lvalues
1048 any<dst_concept, _a> cy1(as_const(x), s_table);
1049 BOOST_CHECK_EQUAL(any_cast<int>(cy1), 4);
1050 any<dst_concept, _a> cy2(as_const(x), as_rvalue(s_table));
1051 BOOST_CHECK_EQUAL(any_cast<int>(cy2), 4);
1052 any<dst_concept, _a> cy3(as_const(x), as_const(s_table));
1053 BOOST_CHECK_EQUAL(any_cast<int>(cy3), 4);
1054 any<dst_concept, _a> cz1(as_const(x), table);
1055 BOOST_CHECK_EQUAL(any_cast<int>(cz1), 4);
1056 any<dst_concept, _a> cz2(as_const(x), as_rvalue(table));
1057 BOOST_CHECK_EQUAL(any_cast<int>(cz2), 4);
1058 any<dst_concept, _a> cz3(as_const(x), as_rvalue(table));
1059 BOOST_CHECK_EQUAL(any_cast<int>(cz3), 4);
1060 }
1061
1062 #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
1063
1064 struct move_only
1065 {
move_onlymove_only1066 explicit move_only(int i) : value(i) {}
move_onlymove_only1067 move_only(move_only&& other) : value(other.value) { other.value = 0; }
1068 int value;
1069 private:
1070 move_only(const move_only&);
1071 };
1072
BOOST_AUTO_TEST_CASE(test_move_only)1073 BOOST_AUTO_TEST_CASE(test_move_only)
1074 {
1075 typedef ::boost::mpl::vector<destructible<>, typeid_<> > test_concept;
1076 move_only source(2);
1077 any<test_concept> x(std::move(source));
1078 BOOST_CHECK_EQUAL(source.value, 0);
1079 BOOST_CHECK_EQUAL(any_cast<move_only&>(x).value, 2);
1080 }
1081
BOOST_AUTO_TEST_CASE(test_copy_from_rref)1082 BOOST_AUTO_TEST_CASE(test_copy_from_rref)
1083 {
1084 typedef ::boost::mpl::vector<common<> > test_concept;
1085 int i = 4;
1086 any<test_concept, _self&&> x(std::move(i));
1087 BOOST_CHECK_EQUAL(any_cast<int>(x), 4);
1088 any<test_concept> y(x);
1089 BOOST_CHECK_EQUAL(any_cast<int>(y), 4);
1090 any<test_concept> z = as_rvalue(x);
1091 BOOST_CHECK_EQUAL(any_cast<int>(z), 4);
1092 any<test_concept> w = as_const(x);
1093 BOOST_CHECK_EQUAL(any_cast<int>(w), 4);
1094 }
1095
BOOST_AUTO_TEST_CASE(test_convert_from_rref)1096 BOOST_AUTO_TEST_CASE(test_convert_from_rref)
1097 {
1098 typedef ::boost::mpl::vector<common<>, incrementable<> > src_concept;
1099 typedef ::boost::mpl::vector<common<> > dst_concept;
1100 int i = 4;
1101 any<src_concept, _self&&> x(std::move(i));
1102 BOOST_CHECK_EQUAL(any_cast<int>(x), 4);
1103 any<dst_concept> y(x);
1104 BOOST_CHECK_EQUAL(any_cast<int>(y), 4);
1105 any<dst_concept> z = as_rvalue(x);
1106 BOOST_CHECK_EQUAL(any_cast<int>(z), 4);
1107 any<dst_concept> w = as_const(x);
1108 BOOST_CHECK_EQUAL(any_cast<int>(w), 4);
1109 }
1110
BOOST_AUTO_TEST_CASE(test_rebind_from_rref)1111 BOOST_AUTO_TEST_CASE(test_rebind_from_rref)
1112 {
1113 typedef ::boost::mpl::vector<common<> > src_concept;
1114 typedef ::boost::mpl::vector<common<_a> > dst_concept;
1115 int i = 4;
1116 any<src_concept, _self&&> x(std::move(i));
1117 BOOST_CHECK_EQUAL(any_cast<int>(x), 4);
1118 any<dst_concept, _a> y(x);
1119 BOOST_CHECK_EQUAL(any_cast<int>(y), 4);
1120 any<dst_concept, _a> z = as_rvalue(x);
1121 BOOST_CHECK_EQUAL(any_cast<int>(z), 4);
1122 any<dst_concept, _a> w = as_const(x);
1123 BOOST_CHECK_EQUAL(any_cast<int>(w), 4);
1124 }
1125
BOOST_AUTO_TEST_CASE(test_rebind_and_convert_from_rref)1126 BOOST_AUTO_TEST_CASE(test_rebind_and_convert_from_rref)
1127 {
1128 typedef ::boost::mpl::vector<common<>, incrementable<> > src_concept;
1129 typedef ::boost::mpl::vector<common<_a> > dst_concept;
1130 int i = 4;
1131 any<src_concept, _self&&> x(std::move(i));
1132 BOOST_CHECK_EQUAL(any_cast<int>(x), 4);
1133 any<dst_concept, _a> y(x);
1134 BOOST_CHECK_EQUAL(any_cast<int>(y), 4);
1135 any<dst_concept, _a> z = as_rvalue(x);
1136 BOOST_CHECK_EQUAL(any_cast<int>(z), 4);
1137 any<dst_concept, _a> w = as_const(x);
1138 BOOST_CHECK_EQUAL(any_cast<int>(w), 4);
1139 }
1140
BOOST_AUTO_TEST_CASE(test_rebind_and_convert_with_binding_from_rref)1141 BOOST_AUTO_TEST_CASE(test_rebind_and_convert_with_binding_from_rref)
1142 {
1143 typedef ::boost::mpl::vector<common<>, incrementable<> > src_concept;
1144 typedef ::boost::mpl::vector<common<_a> > dst_concept;
1145 typedef ::boost::mpl::map<boost::mpl::pair<_a, _self> > map;
1146 typedef ::boost::mpl::map<boost::mpl::pair<_a, int> > types;
1147
1148 static_binding<map> s_table(make_binding<map>());
1149 binding<dst_concept> table(make_binding<types>());
1150
1151 int i = 4;
1152 any<src_concept, _self&&> x(std::move(i));
1153 BOOST_CHECK_EQUAL(any_cast<int>(x), 4);
1154
1155 // lvalues
1156 any<dst_concept, _a> y1(x, s_table);
1157 BOOST_CHECK_EQUAL(any_cast<int>(y1), 4);
1158 any<dst_concept, _a> y2(x, as_rvalue(s_table));
1159 BOOST_CHECK_EQUAL(any_cast<int>(y2), 4);
1160 any<dst_concept, _a> y3(x, as_const(s_table));
1161 BOOST_CHECK_EQUAL(any_cast<int>(y3), 4);
1162 any<dst_concept, _a> z1(x, table);
1163 BOOST_CHECK_EQUAL(any_cast<int>(z1), 4);
1164 any<dst_concept, _a> z2(x, as_rvalue(table));
1165 BOOST_CHECK_EQUAL(any_cast<int>(z2), 4);
1166 any<dst_concept, _a> z3(x, as_const(table));
1167 BOOST_CHECK_EQUAL(any_cast<int>(z3), 4);
1168
1169 // rvalues
1170 any<dst_concept, _a> ry1(as_rvalue(x), s_table);
1171 BOOST_CHECK_EQUAL(any_cast<int>(ry1), 4);
1172 any<dst_concept, _a> ry2(as_rvalue(x), as_rvalue(s_table));
1173 BOOST_CHECK_EQUAL(any_cast<int>(ry2), 4);
1174 any<dst_concept, _a> ry3(as_rvalue(x), as_const(s_table));
1175 BOOST_CHECK_EQUAL(any_cast<int>(ry3), 4);
1176 any<dst_concept, _a> rz1(as_rvalue(x), table);
1177 BOOST_CHECK_EQUAL(any_cast<int>(rz1), 4);
1178 any<dst_concept, _a> rz2(as_rvalue(x), as_rvalue(table));
1179 BOOST_CHECK_EQUAL(any_cast<int>(rz2), 4);
1180 any<dst_concept, _a> rz3(as_rvalue(x), as_rvalue(table));
1181 BOOST_CHECK_EQUAL(any_cast<int>(rz3), 4);
1182
1183 // const lvalues
1184 any<dst_concept, _a> cy1(as_const(x), s_table);
1185 BOOST_CHECK_EQUAL(any_cast<int>(cy1), 4);
1186 any<dst_concept, _a> cy2(as_const(x), as_rvalue(s_table));
1187 BOOST_CHECK_EQUAL(any_cast<int>(cy2), 4);
1188 any<dst_concept, _a> cy3(as_const(x), as_const(s_table));
1189 BOOST_CHECK_EQUAL(any_cast<int>(cy3), 4);
1190 any<dst_concept, _a> cz1(as_const(x), table);
1191 BOOST_CHECK_EQUAL(any_cast<int>(cz1), 4);
1192 any<dst_concept, _a> cz2(as_const(x), as_rvalue(table));
1193 BOOST_CHECK_EQUAL(any_cast<int>(cz2), 4);
1194 any<dst_concept, _a> cz3(as_const(x), as_rvalue(table));
1195 BOOST_CHECK_EQUAL(any_cast<int>(cz3), 4);
1196 }
1197
1198 #endif
1199