pack.cpp 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395
  1. /*=============================================================================
  2. Copyright (c) 2017 Paul Fultz II
  3. pack.cpp
  4. Distributed under the Boost Software License, Version 1.0. (See accompanying
  5. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  6. ==============================================================================*/
  7. #include <boost/hof/pack.hpp>
  8. #include <boost/hof/always.hpp>
  9. #include <boost/hof/identity.hpp>
  10. #include <memory>
  11. #include "test.hpp"
  12. BOOST_HOF_TEST_CASE()
  13. {
  14. auto p1 = boost::hof::pack_basic(1, 2);
  15. auto p2 = p1;
  16. BOOST_HOF_TEST_CHECK(p2(binary_class()) == p1(binary_class()));
  17. BOOST_HOF_STATIC_TEST_CHECK(boost::hof::pack_basic(1, 2)(binary_class()) == 3);
  18. BOOST_HOF_TEST_CHECK(boost::hof::pack_basic(1, 2)(binary_class()) == 3 );
  19. BOOST_HOF_STATIC_TEST_CHECK(boost::hof::pack(1, 2)(binary_class()) == 3);
  20. BOOST_HOF_TEST_CHECK(boost::hof::pack(1, 2)(binary_class()) == 3 );
  21. BOOST_HOF_STATIC_TEST_CHECK(boost::hof::pack_forward(1, 2)(binary_class()) == 3);
  22. BOOST_HOF_TEST_CHECK(boost::hof::pack_forward(1, 2)(binary_class()) == 3 );
  23. }
  24. #if BOOST_HOF_HAS_NOEXCEPT_DEDUCTION
  25. struct copy_throws
  26. {
  27. copy_throws() {}
  28. copy_throws(copy_throws const&) {}
  29. copy_throws(copy_throws&&) noexcept {}
  30. };
  31. BOOST_HOF_TEST_CASE()
  32. {
  33. int i = 1;
  34. copy_throws ct{};
  35. static_assert(!noexcept(boost::hof::pack(ct, ct)(boost::hof::always())), "noexcept pack");
  36. static_assert(noexcept(boost::hof::pack(1, 2)(boost::hof::always())), "noexcept pack");
  37. static_assert(noexcept(boost::hof::pack_forward(ct, ct)(boost::hof::always())), "noexcept pack");
  38. static_assert(noexcept(boost::hof::pack_forward(i, i)(boost::hof::always())), "noexcept pack");
  39. static_assert(noexcept(boost::hof::pack_forward(1, 2)(boost::hof::always())), "noexcept pack");
  40. static_assert(noexcept(boost::hof::pack_basic(ct, ct)(boost::hof::always())), "noexcept pack");
  41. static_assert(noexcept(boost::hof::pack_basic(i, i)(boost::hof::always())), "noexcept pack");
  42. static_assert(noexcept(boost::hof::pack_basic(1, 2)(boost::hof::always())), "noexcept pack");
  43. static_assert(noexcept(boost::hof::pack()(boost::hof::always())), "noexcept pack");
  44. static_assert(noexcept(boost::hof::pack_forward()(boost::hof::always())), "noexcept pack");
  45. static_assert(noexcept(boost::hof::pack_basic()(boost::hof::always())), "noexcept pack");
  46. }
  47. BOOST_HOF_TEST_CASE()
  48. {
  49. copy_throws ct{};
  50. static_assert(!noexcept(boost::hof::pack_join(boost::hof::pack(ct), boost::hof::pack(ct))(boost::hof::always())), "noexcept pack");
  51. static_assert(noexcept(boost::hof::pack_join(boost::hof::pack(1), boost::hof::pack(1))(boost::hof::always())), "noexcept pack");
  52. static_assert(noexcept(boost::hof::pack_join(boost::hof::pack(), boost::hof::pack())(boost::hof::always())), "noexcept pack");
  53. auto p = boost::hof::pack(1);
  54. static_assert(noexcept(boost::hof::pack_join(p, boost::hof::pack())(boost::hof::always())), "noexcept pack");
  55. static_assert(noexcept(boost::hof::pack_join(boost::hof::pack(), p)(boost::hof::always())), "noexcept pack");
  56. static_assert(noexcept(boost::hof::pack_join(p, p)(boost::hof::always())), "noexcept pack");
  57. auto pt = boost::hof::pack(ct);
  58. static_assert(!noexcept(boost::hof::pack_join(pt, boost::hof::pack())(boost::hof::always())), "noexcept pack");
  59. static_assert(!noexcept(boost::hof::pack_join(boost::hof::pack(), pt)(boost::hof::always())), "noexcept pack");
  60. static_assert(!noexcept(boost::hof::pack_join(pt, pt)(boost::hof::always())), "noexcept pack");
  61. }
  62. #endif
  63. BOOST_HOF_TEST_CASE()
  64. {
  65. static constexpr int x = 1;
  66. static constexpr int y = 2;
  67. auto p1 = boost::hof::pack_basic(x, y);
  68. static_assert(!boost::hof::detail::is_default_constructible<decltype(p1)>::value, "Pack default constructible");
  69. BOOST_HOF_STATIC_TEST_CHECK(boost::hof::pack_basic(x, y)(binary_class()) == 3);
  70. BOOST_HOF_TEST_CHECK(boost::hof::pack_basic(x, y)(binary_class()) == 3 );
  71. auto p2 = boost::hof::pack(std::ref(x), std::ref(y));
  72. static_assert(!boost::hof::detail::is_default_constructible<decltype(p2)>::value, "Pack default constructible");
  73. BOOST_HOF_STATIC_TEST_CHECK(boost::hof::pack(x, y)(binary_class()) == 3);
  74. BOOST_HOF_TEST_CHECK(boost::hof::pack(std::ref(x), std::ref(y))(binary_class()) == 3 );
  75. auto p3 = boost::hof::pack_forward(x, y);
  76. static_assert(!boost::hof::detail::is_default_constructible<decltype(p3)>::value, "Pack default constructible");
  77. BOOST_HOF_STATIC_TEST_CHECK(boost::hof::pack_forward(x, y)(binary_class()) == 3);
  78. BOOST_HOF_TEST_CHECK(boost::hof::pack_forward(x, y)(binary_class()) == 3 );
  79. }
  80. BOOST_HOF_TEST_CASE()
  81. {
  82. BOOST_HOF_STATIC_TEST_CHECK(boost::hof::pack_basic()(boost::hof::always(3)) == 3);
  83. BOOST_HOF_TEST_CHECK(boost::hof::pack_basic()(boost::hof::always(3)) == 3 );
  84. }
  85. BOOST_HOF_TEST_CASE()
  86. {
  87. BOOST_HOF_STATIC_TEST_CHECK(boost::hof::pack_basic(3)(boost::hof::identity) == 3);
  88. BOOST_HOF_TEST_CHECK(boost::hof::pack_basic(3)(boost::hof::identity) == 3 );
  89. }
  90. BOOST_HOF_TEST_CASE()
  91. {
  92. auto p = boost::hof::pack(1);
  93. BOOST_HOF_TEST_CHECK(boost::hof::pack_join(p, boost::hof::pack(2))(binary_class()) == 3);
  94. BOOST_HOF_TEST_CHECK(boost::hof::pack_join(p, p)(binary_class()) == 2);
  95. BOOST_HOF_TEST_CHECK(boost::hof::pack_join(p, p, boost::hof::pack())(binary_class()) == 2);
  96. }
  97. BOOST_HOF_TEST_CASE()
  98. {
  99. BOOST_HOF_STATIC_TEST_CHECK(boost::hof::pack_join(boost::hof::pack_basic(1), boost::hof::pack_basic(2))(binary_class()) == 3);
  100. BOOST_HOF_TEST_CHECK(boost::hof::pack_join(boost::hof::pack_basic(1), boost::hof::pack_basic(2))(binary_class()) == 3 );
  101. BOOST_HOF_STATIC_TEST_CHECK(boost::hof::pack_join(boost::hof::pack(1), boost::hof::pack(2))(binary_class()) == 3);
  102. BOOST_HOF_TEST_CHECK(boost::hof::pack_join(boost::hof::pack(1), boost::hof::pack(2))(binary_class()) == 3 );
  103. BOOST_HOF_STATIC_TEST_CHECK(boost::hof::pack_join(boost::hof::pack_forward(1), boost::hof::pack_forward(2))(binary_class()) == 3);
  104. BOOST_HOF_TEST_CHECK(boost::hof::pack_join(boost::hof::pack_forward(1), boost::hof::pack_forward(2))(binary_class()) == 3 );
  105. }
  106. BOOST_HOF_TEST_CASE()
  107. {
  108. BOOST_HOF_STATIC_TEST_CHECK(boost::hof::pack_join(boost::hof::pack_basic(), boost::hof::pack_basic(1, 2))(binary_class()) == 3);
  109. BOOST_HOF_TEST_CHECK(boost::hof::pack_join(boost::hof::pack_basic(), boost::hof::pack_basic(1, 2))(binary_class()) == 3 );
  110. BOOST_HOF_STATIC_TEST_CHECK(boost::hof::pack_join(boost::hof::pack(), boost::hof::pack(1, 2))(binary_class()) == 3);
  111. BOOST_HOF_TEST_CHECK(boost::hof::pack_join(boost::hof::pack(), boost::hof::pack(1, 2))(binary_class()) == 3 );
  112. BOOST_HOF_STATIC_TEST_CHECK(boost::hof::pack_join(boost::hof::pack_forward(), boost::hof::pack_forward(1, 2))(binary_class()) == 3);
  113. BOOST_HOF_TEST_CHECK(boost::hof::pack_join(boost::hof::pack_forward(), boost::hof::pack_forward(1, 2))(binary_class()) == 3 );
  114. }
  115. BOOST_HOF_TEST_CASE()
  116. {
  117. BOOST_HOF_STATIC_TEST_CHECK(boost::hof::pack_join(boost::hof::pack_basic(1, 2), boost::hof::pack_basic())(binary_class()) == 3);
  118. BOOST_HOF_TEST_CHECK(boost::hof::pack_join(boost::hof::pack_basic(1, 2), boost::hof::pack_basic())(binary_class()) == 3 );
  119. BOOST_HOF_STATIC_TEST_CHECK(boost::hof::pack_join(boost::hof::pack(1, 2), boost::hof::pack())(binary_class()) == 3);
  120. BOOST_HOF_TEST_CHECK(boost::hof::pack_join(boost::hof::pack(1, 2), boost::hof::pack())(binary_class()) == 3 );
  121. BOOST_HOF_STATIC_TEST_CHECK(boost::hof::pack_join(boost::hof::pack_forward(1, 2), boost::hof::pack_forward())(binary_class()) == 3);
  122. BOOST_HOF_TEST_CHECK(boost::hof::pack_join(boost::hof::pack_forward(1, 2), boost::hof::pack_forward())(binary_class()) == 3 );
  123. }
  124. BOOST_HOF_TEST_CASE()
  125. {
  126. BOOST_HOF_STATIC_TEST_CHECK(boost::hof::pack_join(boost::hof::pack_basic(1), boost::hof::pack_basic(), boost::hof::pack_basic(2))(binary_class()) == 3);
  127. BOOST_HOF_TEST_CHECK(boost::hof::pack_join(boost::hof::pack_basic(1), boost::hof::pack_basic(), boost::hof::pack_basic(2))(binary_class()) == 3 );
  128. BOOST_HOF_STATIC_TEST_CHECK(boost::hof::pack_join(boost::hof::pack(1), boost::hof::pack(), boost::hof::pack(2))(binary_class()) == 3);
  129. BOOST_HOF_TEST_CHECK(boost::hof::pack_join(boost::hof::pack(1), boost::hof::pack(), boost::hof::pack(2))(binary_class()) == 3 );
  130. BOOST_HOF_STATIC_TEST_CHECK(boost::hof::pack_join(boost::hof::pack_forward(1), boost::hof::pack_forward(), boost::hof::pack_forward(2))(binary_class()) == 3);
  131. BOOST_HOF_TEST_CHECK(boost::hof::pack_join(boost::hof::pack_forward(1), boost::hof::pack_forward(), boost::hof::pack_forward(2))(binary_class()) == 3 );
  132. }
  133. BOOST_HOF_TEST_CASE()
  134. {
  135. BOOST_HOF_STATIC_TEST_CHECK(boost::hof::pack_join(boost::hof::pack_basic(), boost::hof::pack_basic(1), boost::hof::pack_basic(), boost::hof::pack_basic(2))(binary_class()) == 3);
  136. BOOST_HOF_TEST_CHECK(boost::hof::pack_join(boost::hof::pack_basic(), boost::hof::pack_basic(1), boost::hof::pack_basic(), boost::hof::pack_basic(2))(binary_class()) == 3 );
  137. BOOST_HOF_STATIC_TEST_CHECK(boost::hof::pack_join(boost::hof::pack(), boost::hof::pack(1), boost::hof::pack(), boost::hof::pack(2))(binary_class()) == 3);
  138. BOOST_HOF_TEST_CHECK(boost::hof::pack_join(boost::hof::pack(), boost::hof::pack(1), boost::hof::pack(), boost::hof::pack(2))(binary_class()) == 3 );
  139. BOOST_HOF_STATIC_TEST_CHECK(boost::hof::pack_join(boost::hof::pack_forward(), boost::hof::pack_forward(1), boost::hof::pack_forward(), boost::hof::pack_forward(2))(binary_class()) == 3);
  140. BOOST_HOF_TEST_CHECK(boost::hof::pack_join(boost::hof::pack_forward(), boost::hof::pack_forward(1), boost::hof::pack_forward(), boost::hof::pack_forward(2))(binary_class()) == 3 );
  141. }
  142. BOOST_HOF_TEST_CASE()
  143. {
  144. BOOST_HOF_STATIC_TEST_CHECK(boost::hof::pack_join(boost::hof::pack_basic(1), boost::hof::pack_basic(), boost::hof::pack_basic(2), boost::hof::pack_basic())(binary_class()) == 3);
  145. BOOST_HOF_TEST_CHECK(boost::hof::pack_join(boost::hof::pack_basic(1), boost::hof::pack_basic(), boost::hof::pack_basic(2), boost::hof::pack_basic())(binary_class()) == 3 );
  146. BOOST_HOF_STATIC_TEST_CHECK(boost::hof::pack_join(boost::hof::pack(1), boost::hof::pack(), boost::hof::pack(2), boost::hof::pack())(binary_class()) == 3);
  147. BOOST_HOF_TEST_CHECK(boost::hof::pack_join(boost::hof::pack(1), boost::hof::pack(), boost::hof::pack(2), boost::hof::pack())(binary_class()) == 3 );
  148. BOOST_HOF_STATIC_TEST_CHECK(boost::hof::pack_join(boost::hof::pack_forward(1), boost::hof::pack_forward(), boost::hof::pack_forward(2), boost::hof::pack_forward())(binary_class()) == 3);
  149. BOOST_HOF_TEST_CHECK(boost::hof::pack_join(boost::hof::pack_forward(1), boost::hof::pack_forward(), boost::hof::pack_forward(2), boost::hof::pack_forward())(binary_class()) == 3 );
  150. }
  151. struct deref
  152. {
  153. int operator()(const std::unique_ptr<int>& i) const
  154. {
  155. return *i;
  156. }
  157. };
  158. BOOST_HOF_TEST_CASE()
  159. {
  160. std::unique_ptr<int> i(new int(3));
  161. BOOST_HOF_TEST_CHECK(boost::hof::pack_basic(i)(deref()) == 3);
  162. BOOST_HOF_TEST_CHECK(boost::hof::pack_basic(std::unique_ptr<int>(new int(3)))(deref()) == 3);
  163. BOOST_HOF_TEST_CHECK(boost::hof::pack_forward(std::unique_ptr<int>(new int(3)))(deref()) == 3);
  164. BOOST_HOF_TEST_CHECK(boost::hof::pack(std::unique_ptr<int>(new int(3)))(deref()) == 3);
  165. auto p = boost::hof::pack_basic(std::unique_ptr<int>(new int(3)));
  166. BOOST_HOF_TEST_CHECK(p(deref()) == 3);
  167. BOOST_HOF_TEST_CHECK(boost::hof::pack_join(boost::hof::pack_basic(), boost::hof::pack_basic(std::unique_ptr<int>(new int(3))))(deref()) == 3);
  168. BOOST_HOF_TEST_CHECK(boost::hof::pack_join(boost::hof::pack_forward(), boost::hof::pack_forward(std::unique_ptr<int>(new int(3))))(deref()) == 3);
  169. BOOST_HOF_TEST_CHECK(boost::hof::pack_join(boost::hof::pack(), boost::hof::pack(std::unique_ptr<int>(new int(3))))(deref()) == 3);
  170. // BOOST_HOF_TEST_CHECK(p(deref()) == 3);
  171. }
  172. struct move_rvalue
  173. {
  174. void operator()(std::string&& s) const
  175. {
  176. std::string ss = std::move(s);
  177. BOOST_HOF_TEST_CHECK(ss == "abcdef");
  178. s = "00000";
  179. }
  180. };
  181. struct check_rvalue
  182. {
  183. void operator()(std::string&& s) const
  184. {
  185. BOOST_HOF_TEST_CHECK(s == "abcdef");
  186. }
  187. };
  188. BOOST_HOF_TEST_CASE()
  189. {
  190. auto p = boost::hof::pack_basic(std::string{"abcdef"});
  191. p(move_rvalue{});
  192. p(check_rvalue{});
  193. }
  194. BOOST_HOF_TEST_CASE()
  195. {
  196. auto p = boost::hof::pack(std::string{"abcdef"});
  197. p(move_rvalue{});
  198. p(check_rvalue{});
  199. }
  200. struct empty1
  201. {};
  202. struct empty2
  203. {};
  204. BOOST_HOF_TEST_CASE()
  205. {
  206. static_assert(boost::hof::detail::is_default_constructible<empty1, empty2>::value, "Not default constructible");
  207. }
  208. BOOST_HOF_TEST_CASE()
  209. {
  210. static constexpr auto p = boost::hof::pack_basic(empty1());
  211. BOOST_HOF_TEST_CHECK(p(boost::hof::always(0)) == 0);
  212. BOOST_HOF_STATIC_TEST_CHECK(p(boost::hof::always(0)) == 0);
  213. #ifndef _MSC_VER
  214. static_assert(std::is_empty<decltype(p)>::value, "Pack not empty");
  215. #endif
  216. static_assert(boost::hof::detail::is_default_constructible<decltype(p)>::value, "Not default constructible");
  217. }
  218. BOOST_HOF_TEST_CASE()
  219. {
  220. static constexpr auto p = boost::hof::pack_basic(empty1(), empty2());
  221. BOOST_HOF_TEST_CHECK(p(boost::hof::always(0)) == 0);
  222. BOOST_HOF_STATIC_TEST_CHECK(p(boost::hof::always(0)) == 0);
  223. #ifndef _MSC_VER
  224. static_assert(std::is_empty<decltype(p)>::value, "Pack not empty");
  225. #endif
  226. static_assert(boost::hof::detail::is_default_constructible<decltype(p)>::value, "Not default constructible");
  227. }
  228. BOOST_HOF_TEST_CASE()
  229. {
  230. static constexpr auto p = boost::hof::pack_basic(boost::hof::pack_basic(), boost::hof::pack_basic());
  231. BOOST_HOF_TEST_CHECK(p(boost::hof::always(0)) == 0);
  232. BOOST_HOF_STATIC_TEST_CHECK(p(boost::hof::always(0)) == 0);
  233. #ifndef _MSC_VER
  234. static_assert(std::is_empty<decltype(p)>::value, "Pack not empty");
  235. #endif
  236. static_assert(boost::hof::detail::is_default_constructible<decltype(p)>::value, "Not default constructible");
  237. }
  238. BOOST_HOF_TEST_CASE()
  239. {
  240. static constexpr auto p = boost::hof::pack_basic(empty1(), empty2(), empty1());
  241. BOOST_HOF_TEST_CHECK(p(boost::hof::always(0)) == 0);
  242. BOOST_HOF_STATIC_TEST_CHECK(p(boost::hof::always(0)) == 0);
  243. #ifndef _MSC_VER
  244. static_assert(std::is_empty<decltype(p)>::value, "Pack not empty");
  245. #endif
  246. static_assert(boost::hof::detail::is_default_constructible<decltype(p)>::value, "Not default constructible");
  247. }
  248. BOOST_HOF_TEST_CASE()
  249. {
  250. static constexpr auto p = boost::hof::pack_basic(empty1(), boost::hof::pack_basic(empty1(), empty2()));
  251. BOOST_HOF_TEST_CHECK(p(boost::hof::always(0)) == 0);
  252. BOOST_HOF_STATIC_TEST_CHECK(p(boost::hof::always(0)) == 0);
  253. #ifndef _MSC_VER
  254. static_assert(std::is_empty<decltype(p)>::value, "Pack not empty");
  255. #endif
  256. static_assert(boost::hof::detail::is_default_constructible<decltype(p)>::value, "Not default constructible");
  257. }
  258. BOOST_HOF_TEST_CASE()
  259. {
  260. static constexpr auto p = boost::hof::pack_basic(boost::hof::pack_basic(), boost::hof::pack_basic(boost::hof::pack_basic()), empty1(), boost::hof::pack_basic(empty1(), empty2()));
  261. BOOST_HOF_TEST_CHECK(p(boost::hof::always(0)) == 0);
  262. BOOST_HOF_STATIC_TEST_CHECK(p(boost::hof::always(0)) == 0);
  263. #ifndef _MSC_VER
  264. static_assert(std::is_empty<decltype(p)>::value, "Pack not empty");
  265. #endif
  266. static_assert(boost::hof::detail::is_default_constructible<decltype(p)>::value, "Not default constructible");
  267. }
  268. struct not_default_constructible
  269. {
  270. int i;
  271. constexpr not_default_constructible(int x) : i(x)
  272. {}
  273. };
  274. struct select_i
  275. {
  276. template<class T>
  277. constexpr int operator()(T&& x) const
  278. {
  279. return x.i;
  280. }
  281. template<class T, class U>
  282. constexpr int operator()(T&& x, U&& y) const
  283. {
  284. return x.i + y.i;
  285. }
  286. template<class T, class U, class V>
  287. constexpr int operator()(T&& x, U&& y, V&& z) const
  288. {
  289. return x.i + y.i + z.i;
  290. }
  291. };
  292. BOOST_HOF_TEST_CASE()
  293. {
  294. static_assert(!boost::hof::detail::is_default_constructible<not_default_constructible>::value, "Default constructible");
  295. auto p = boost::hof::pack_basic(not_default_constructible(3));
  296. static_assert(!boost::hof::detail::is_default_constructible<decltype(p)>::value, "Pack default constructible");
  297. auto p1 = boost::hof::pack_forward(p);
  298. static_assert(!boost::hof::detail::is_default_constructible<decltype(p1)>::value, "Packs default constructible");
  299. auto p2 = boost::hof::pack_forward(p, p);
  300. static_assert(!boost::hof::detail::is_default_constructible<decltype(p2)>::value, "Packs default constructible");
  301. auto p3 = boost::hof::pack_forward(p, p, p);
  302. static_assert(!boost::hof::detail::is_default_constructible<decltype(p3)>::value, "Packs default constructible");
  303. BOOST_HOF_TEST_CHECK(p(select_i()) == 3);
  304. BOOST_HOF_STATIC_TEST_CHECK(boost::hof::pack_basic(not_default_constructible(3))(select_i()) == 3);
  305. }
  306. BOOST_HOF_TEST_CASE()
  307. {
  308. static_assert(!boost::hof::detail::is_default_constructible<not_default_constructible>::value, "Default constructible");
  309. auto p = boost::hof::pack_basic(not_default_constructible(1), not_default_constructible(2));
  310. static_assert(!boost::hof::detail::is_default_constructible<decltype(p)>::value, "Pack default constructible");
  311. auto p1 = boost::hof::pack_forward(p);
  312. static_assert(!boost::hof::detail::is_default_constructible<decltype(p1)>::value, "Packs default constructible");
  313. auto p2 = boost::hof::pack_forward(p, p);
  314. static_assert(!boost::hof::detail::is_default_constructible<decltype(p2)>::value, "Packs default constructible");
  315. auto p3 = boost::hof::pack_forward(p, p, p);
  316. static_assert(!boost::hof::detail::is_default_constructible<decltype(p3)>::value, "Packs default constructible");
  317. BOOST_HOF_TEST_CHECK(p(select_i()) == 3);
  318. BOOST_HOF_STATIC_TEST_CHECK(boost::hof::pack_basic(not_default_constructible(1), not_default_constructible(2))(select_i()) == 3);
  319. }
  320. BOOST_HOF_TEST_CASE()
  321. {
  322. static_assert(!boost::hof::detail::is_default_constructible<not_default_constructible>::value, "Default constructible");
  323. auto p = boost::hof::pack_basic(not_default_constructible(1), not_default_constructible(1), not_default_constructible(1));
  324. static_assert(!boost::hof::detail::is_default_constructible<decltype(p)>::value, "Pack default constructible");
  325. auto p1 = boost::hof::pack_forward(p);
  326. static_assert(!boost::hof::detail::is_default_constructible<decltype(p1)>::value, "Packs default constructible");
  327. auto p2 = boost::hof::pack_forward(p, p);
  328. static_assert(!boost::hof::detail::is_default_constructible<decltype(p2)>::value, "Packs default constructible");
  329. auto p3 = boost::hof::pack_forward(p, p, p);
  330. static_assert(!boost::hof::detail::is_default_constructible<decltype(p3)>::value, "Packs default constructible");
  331. BOOST_HOF_TEST_CHECK(p(select_i()) == 3);
  332. BOOST_HOF_STATIC_TEST_CHECK(boost::hof::pack_basic(not_default_constructible(1), not_default_constructible(1), not_default_constructible(1))(select_i()) == 3);
  333. }