test_param.cpp 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. // Boost.TypeErasure library
  2. //
  3. // Copyright 2012 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/param.hpp>
  12. #include <boost/type_erasure/builtin.hpp>
  13. using namespace boost::type_erasure;
  14. template<int N>
  15. struct size { typedef char (&type)[N]; };
  16. // lvalues
  17. extern any<copy_constructible<>, _self> a1;
  18. extern const any<copy_constructible<>, _self> a2;
  19. extern any<copy_constructible<>, _self&> a3;
  20. extern const any<copy_constructible<>, _self&> a4;
  21. extern any<copy_constructible<>, const _self&> a5;
  22. extern const any<copy_constructible<>, const _self&> a6;
  23. // rvalues
  24. any<copy_constructible<>, _self> a7();
  25. const any<copy_constructible<>, _self> a8();
  26. any<copy_constructible<>, _self&> a9();
  27. const any<copy_constructible<>, _self&> a10();
  28. any<copy_constructible<>, const _self&> a11();
  29. const any<copy_constructible<>, const _self&> a12();
  30. extern int i;
  31. size<1>::type f1(param<copy_constructible<>, _self&>);
  32. size<2>::type f1(...);
  33. void test_ref() {
  34. BOOST_STATIC_ASSERT(sizeof(f1(a1)) == 1);
  35. BOOST_STATIC_ASSERT(sizeof(f1(a2)) == 2);
  36. BOOST_STATIC_ASSERT(sizeof(f1(a3)) == 1);
  37. BOOST_STATIC_ASSERT(sizeof(f1(a4)) == 1);
  38. BOOST_STATIC_ASSERT(sizeof(f1(a5)) == 2);
  39. BOOST_STATIC_ASSERT(sizeof(f1(a6)) == 2);
  40. BOOST_STATIC_ASSERT(sizeof(f1(a7())) == 2);
  41. BOOST_STATIC_ASSERT(sizeof(f1(a8())) == 2);
  42. BOOST_STATIC_ASSERT(sizeof(f1(a9())) == 1);
  43. BOOST_STATIC_ASSERT(sizeof(f1(a10())) == 1);
  44. BOOST_STATIC_ASSERT(sizeof(f1(a11())) == 2);
  45. BOOST_STATIC_ASSERT(sizeof(f1(a12())) == 2);
  46. BOOST_STATIC_ASSERT(sizeof(f1(i)) == 2);
  47. BOOST_STATIC_ASSERT(sizeof(f1(1)) == 2);
  48. // Make sure that the constructors are actually instantiated
  49. param<copy_constructible<>, _self&> c1 = a1;
  50. // param<copy_constructible<>, _self&> c2 = a2;
  51. param<copy_constructible<>, _self&> c3 = a3;
  52. param<copy_constructible<>, _self&> c4 = a4;
  53. // param<copy_constructible<>, _self&> c5 = a5;
  54. // param<copy_constructible<>, _self&> c6 = a6;
  55. // param<copy_constructible<>, _self&> c7 = a7();
  56. // param<copy_constructible<>, _self&> c8 = a8();
  57. param<copy_constructible<>, _self&> c9 = a9();
  58. param<copy_constructible<>, _self&> c10 = a10();
  59. // param<copy_constructible<>, _self&> c11 = a11();
  60. // param<copy_constructible<>, _self&> c12 = a12();
  61. }
  62. size<1>::type f2(param<copy_constructible<>, const _self&>);
  63. size<2>::type f2(...);
  64. void test_cref() {
  65. BOOST_STATIC_ASSERT(sizeof(f2(a1)) == 1);
  66. BOOST_STATIC_ASSERT(sizeof(f2(a2)) == 1);
  67. BOOST_STATIC_ASSERT(sizeof(f2(a3)) == 1);
  68. BOOST_STATIC_ASSERT(sizeof(f2(a4)) == 1);
  69. BOOST_STATIC_ASSERT(sizeof(f2(a5)) == 1);
  70. BOOST_STATIC_ASSERT(sizeof(f2(a6)) == 1);
  71. BOOST_STATIC_ASSERT(sizeof(f2(a7())) == 1);
  72. BOOST_STATIC_ASSERT(sizeof(f2(a8())) == 1);
  73. BOOST_STATIC_ASSERT(sizeof(f2(a9())) == 1);
  74. BOOST_STATIC_ASSERT(sizeof(f2(a10())) == 1);
  75. BOOST_STATIC_ASSERT(sizeof(f2(a11())) == 1);
  76. BOOST_STATIC_ASSERT(sizeof(f2(a12())) == 1);
  77. BOOST_STATIC_ASSERT(sizeof(f2(i)) == 2);
  78. BOOST_STATIC_ASSERT(sizeof(f2(1)) == 2);
  79. // Make sure that the constructors are actually instantiated
  80. param<copy_constructible<>, const _self&> c1 = a1;
  81. param<copy_constructible<>, const _self&> c2 = a2;
  82. param<copy_constructible<>, const _self&> c3 = a3;
  83. param<copy_constructible<>, const _self&> c4 = a4;
  84. param<copy_constructible<>, const _self&> c5 = a5;
  85. param<copy_constructible<>, const _self&> c6 = a6;
  86. param<copy_constructible<>, const _self&> c7 = a7();
  87. param<copy_constructible<>, const _self&> c8 = a8();
  88. param<copy_constructible<>, const _self&> c9 = a9();
  89. param<copy_constructible<>, const _self&> c10 = a10();
  90. param<copy_constructible<>, const _self&> c11 = a11();
  91. param<copy_constructible<>, const _self&> c12 = a12();
  92. }
  93. size<1>::type f3(param<copy_constructible<>, _self>);
  94. size<2>::type f3(...);
  95. void test_val() {
  96. BOOST_STATIC_ASSERT(sizeof(f3(a1)) == 1);
  97. BOOST_STATIC_ASSERT(sizeof(f3(a2)) == 1);
  98. BOOST_STATIC_ASSERT(sizeof(f3(a3)) == 1);
  99. BOOST_STATIC_ASSERT(sizeof(f3(a4)) == 1);
  100. BOOST_STATIC_ASSERT(sizeof(f3(a5)) == 1);
  101. BOOST_STATIC_ASSERT(sizeof(f3(a6)) == 1);
  102. BOOST_STATIC_ASSERT(sizeof(f3(a7())) == 1);
  103. BOOST_STATIC_ASSERT(sizeof(f3(a8())) == 1);
  104. BOOST_STATIC_ASSERT(sizeof(f3(a9())) == 1);
  105. BOOST_STATIC_ASSERT(sizeof(f3(a10())) == 1);
  106. BOOST_STATIC_ASSERT(sizeof(f3(a11())) == 1);
  107. BOOST_STATIC_ASSERT(sizeof(f3(a12())) == 1);
  108. BOOST_STATIC_ASSERT(sizeof(f3(i)) == 2);
  109. BOOST_STATIC_ASSERT(sizeof(f3(1)) == 2);
  110. // Make sure that the constructors are actually instantiated
  111. param<copy_constructible<>, _self> c1 = a1;
  112. param<copy_constructible<>, _self> c2 = a2;
  113. param<copy_constructible<>, _self> c3 = a3;
  114. param<copy_constructible<>, _self> c4 = a4;
  115. param<copy_constructible<>, _self> c5 = a5;
  116. param<copy_constructible<>, _self> c6 = a6;
  117. param<copy_constructible<>, _self> c7 = a7();
  118. param<copy_constructible<>, _self> c8 = a8();
  119. param<copy_constructible<>, _self> c9 = a9();
  120. param<copy_constructible<>, _self> c10 = a10();
  121. param<copy_constructible<>, _self> c11 = a11();
  122. param<copy_constructible<>, _self> c12 = a12();
  123. }
  124. #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
  125. size<1>::type f4(param<copy_constructible<>, _self&&>);
  126. size<2>::type f4(...);
  127. void test_rref() {
  128. BOOST_STATIC_ASSERT(sizeof(f4(a1)) == 2);
  129. BOOST_STATIC_ASSERT(sizeof(f4(a2)) == 2);
  130. BOOST_STATIC_ASSERT(sizeof(f4(a3)) == 2);
  131. BOOST_STATIC_ASSERT(sizeof(f4(a4)) == 2);
  132. BOOST_STATIC_ASSERT(sizeof(f4(a5)) == 2);
  133. BOOST_STATIC_ASSERT(sizeof(f4(a6)) == 2);
  134. BOOST_STATIC_ASSERT(sizeof(f4(a7())) == 1);
  135. BOOST_STATIC_ASSERT(sizeof(f4(a8())) == 2);
  136. BOOST_STATIC_ASSERT(sizeof(f4(a9())) == 2);
  137. BOOST_STATIC_ASSERT(sizeof(f4(a10())) == 2);
  138. BOOST_STATIC_ASSERT(sizeof(f4(a11())) == 2);
  139. BOOST_STATIC_ASSERT(sizeof(f4(a12())) == 2);
  140. BOOST_STATIC_ASSERT(sizeof(f4(i)) == 2);
  141. BOOST_STATIC_ASSERT(sizeof(f4(1)) == 2);
  142. // Make sure that the constructors are actually instantiated
  143. // param<copy_constructible<>, _self&&> c1 = a1;
  144. // param<copy_constructible<>, _self&&> c2 = a2;
  145. // param<copy_constructible<>, _self&&> c3 = a3;
  146. // param<copy_constructible<>, _self&&> c4 = a4;
  147. // param<copy_constructible<>, _self&&> c5 = a5;
  148. // param<copy_constructible<>, _self&&> c6 = a6;
  149. param<copy_constructible<>, _self&&> c7 = a7();
  150. // param<copy_constructible<>, _self&&> c8 = a8();
  151. // param<copy_constructible<>, _self&&> c9 = a9();
  152. // param<copy_constructible<>, _self&&> c10 = a10();
  153. // param<copy_constructible<>, _self&&> c11 = a11();
  154. // param<copy_constructible<>, _self&&> c12 = a12();
  155. }
  156. #endif
  157. #ifndef BOOST_NO_CXX11_REF_QUALIFIERS
  158. // Test conversion sequence rank
  159. size<1>::type f5(param<copy_constructible<>, _self&>);
  160. size<2>::type f5(param<copy_constructible<>, const _self&>);
  161. void test_ref_cref() {
  162. BOOST_STATIC_ASSERT(sizeof(f5(a1)) == 1);
  163. BOOST_STATIC_ASSERT(sizeof(f5(a2)) == 2);
  164. BOOST_STATIC_ASSERT(sizeof(f5(a3)) == 1);
  165. BOOST_STATIC_ASSERT(sizeof(f5(a4)) == 1);
  166. BOOST_STATIC_ASSERT(sizeof(f5(a5)) == 2);
  167. BOOST_STATIC_ASSERT(sizeof(f5(a6)) == 2);
  168. BOOST_STATIC_ASSERT(sizeof(f5(a7())) == 2);
  169. BOOST_STATIC_ASSERT(sizeof(f5(a8())) == 2);
  170. BOOST_STATIC_ASSERT(sizeof(f5(a9())) == 1);
  171. BOOST_STATIC_ASSERT(sizeof(f5(a10())) == 1);
  172. BOOST_STATIC_ASSERT(sizeof(f5(a11())) == 2);
  173. BOOST_STATIC_ASSERT(sizeof(f5(a12())) == 2);
  174. }
  175. size<1>::type f6(param<copy_constructible<>, _self&>);
  176. size<2>::type f6(param<copy_constructible<>, _self&&>);
  177. void test_ref_rref() {
  178. BOOST_STATIC_ASSERT(sizeof(f6(a1)) == 1);
  179. // BOOST_STATIC_ASSERT(sizeof(f6(a2)) == 2);
  180. BOOST_STATIC_ASSERT(sizeof(f6(a3)) == 1);
  181. BOOST_STATIC_ASSERT(sizeof(f6(a4)) == 1);
  182. // BOOST_STATIC_ASSERT(sizeof(f6(a5)) == 2);
  183. // BOOST_STATIC_ASSERT(sizeof(f6(a6)) == 2);
  184. BOOST_STATIC_ASSERT(sizeof(f6(a7())) == 2);
  185. // BOOST_STATIC_ASSERT(sizeof(f6(a8())) == 2);
  186. BOOST_STATIC_ASSERT(sizeof(f6(a9())) == 1);
  187. BOOST_STATIC_ASSERT(sizeof(f6(a10())) == 1);
  188. // BOOST_STATIC_ASSERT(sizeof(f6(a11())) == 2);
  189. // BOOST_STATIC_ASSERT(sizeof(f6(a12())) == 2);
  190. }
  191. size<1>::type f7(param<copy_constructible<>, const _self&>);
  192. size<2>::type f7(param<copy_constructible<>, _self&&>);
  193. void test_cref_rref() {
  194. BOOST_STATIC_ASSERT(sizeof(f7(a1)) == 1);
  195. BOOST_STATIC_ASSERT(sizeof(f7(a2)) == 1);
  196. BOOST_STATIC_ASSERT(sizeof(f7(a3)) == 1);
  197. BOOST_STATIC_ASSERT(sizeof(f7(a4)) == 1);
  198. BOOST_STATIC_ASSERT(sizeof(f7(a5)) == 1);
  199. BOOST_STATIC_ASSERT(sizeof(f7(a6)) == 1);
  200. BOOST_STATIC_ASSERT(sizeof(f7(a7())) == 2);
  201. BOOST_STATIC_ASSERT(sizeof(f7(a8())) == 1);
  202. BOOST_STATIC_ASSERT(sizeof(f7(a9())) == 1);
  203. BOOST_STATIC_ASSERT(sizeof(f7(a10())) == 1);
  204. BOOST_STATIC_ASSERT(sizeof(f7(a11())) == 1);
  205. BOOST_STATIC_ASSERT(sizeof(f7(a12())) == 1);
  206. }
  207. #endif