test_construct.cpp 46 KB

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