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 BOOST_HOF_TEST_CASE()
14 {
15 auto p1 = boost::hof::pack_basic(1, 2);
16 auto p2 = p1;
17 BOOST_HOF_TEST_CHECK(p2(binary_class()) == p1(binary_class()));
18
19 BOOST_HOF_STATIC_TEST_CHECK(boost::hof::pack_basic(1, 2)(binary_class()) == 3);
20 BOOST_HOF_TEST_CHECK(boost::hof::pack_basic(1, 2)(binary_class()) == 3 );
21
22 BOOST_HOF_STATIC_TEST_CHECK(boost::hof::pack(1, 2)(binary_class()) == 3);
23 BOOST_HOF_TEST_CHECK(boost::hof::pack(1, 2)(binary_class()) == 3 );
24
25 BOOST_HOF_STATIC_TEST_CHECK(boost::hof::pack_forward(1, 2)(binary_class()) == 3);
26 BOOST_HOF_TEST_CHECK(boost::hof::pack_forward(1, 2)(binary_class()) == 3 );
27 }
28 #if BOOST_HOF_HAS_NOEXCEPT_DEDUCTION
29 struct copy_throws
30 {
copy_throwscopy_throws31 copy_throws() {}
copy_throwscopy_throws32 copy_throws(copy_throws const&) {}
copy_throwscopy_throws33 copy_throws(copy_throws&&) noexcept {}
34 };
35
BOOST_HOF_TEST_CASE()36 BOOST_HOF_TEST_CASE()
37 {
38 int i = 1;
39 copy_throws ct{};
40 static_assert(!noexcept(boost::hof::pack(ct, ct)(boost::hof::always())), "noexcept pack");
41 static_assert(noexcept(boost::hof::pack(1, 2)(boost::hof::always())), "noexcept pack");
42 static_assert(noexcept(boost::hof::pack_forward(ct, ct)(boost::hof::always())), "noexcept pack");
43 static_assert(noexcept(boost::hof::pack_forward(i, i)(boost::hof::always())), "noexcept pack");
44 static_assert(noexcept(boost::hof::pack_forward(1, 2)(boost::hof::always())), "noexcept pack");
45 static_assert(noexcept(boost::hof::pack_basic(ct, ct)(boost::hof::always())), "noexcept pack");
46 static_assert(noexcept(boost::hof::pack_basic(i, i)(boost::hof::always())), "noexcept pack");
47 static_assert(noexcept(boost::hof::pack_basic(1, 2)(boost::hof::always())), "noexcept pack");
48
49 static_assert(noexcept(boost::hof::pack()(boost::hof::always())), "noexcept pack");
50 static_assert(noexcept(boost::hof::pack_forward()(boost::hof::always())), "noexcept pack");
51 static_assert(noexcept(boost::hof::pack_basic()(boost::hof::always())), "noexcept pack");
52 }
53
BOOST_HOF_TEST_CASE()54 BOOST_HOF_TEST_CASE()
55 {
56 copy_throws ct{};
57 static_assert(!noexcept(boost::hof::pack_join(boost::hof::pack(ct), boost::hof::pack(ct))(boost::hof::always())), "noexcept pack");
58 static_assert(noexcept(boost::hof::pack_join(boost::hof::pack(1), boost::hof::pack(1))(boost::hof::always())), "noexcept pack");
59 static_assert(noexcept(boost::hof::pack_join(boost::hof::pack(), boost::hof::pack())(boost::hof::always())), "noexcept pack");
60 auto p = boost::hof::pack(1);
61 static_assert(noexcept(boost::hof::pack_join(p, boost::hof::pack())(boost::hof::always())), "noexcept pack");
62 static_assert(noexcept(boost::hof::pack_join(boost::hof::pack(), p)(boost::hof::always())), "noexcept pack");
63 static_assert(noexcept(boost::hof::pack_join(p, p)(boost::hof::always())), "noexcept pack");
64 auto pt = boost::hof::pack(ct);
65 static_assert(!noexcept(boost::hof::pack_join(pt, boost::hof::pack())(boost::hof::always())), "noexcept pack");
66 static_assert(!noexcept(boost::hof::pack_join(boost::hof::pack(), pt)(boost::hof::always())), "noexcept pack");
67 static_assert(!noexcept(boost::hof::pack_join(pt, pt)(boost::hof::always())), "noexcept pack");
68
69 }
70 #endif
BOOST_HOF_TEST_CASE()71 BOOST_HOF_TEST_CASE()
72 {
73 static constexpr int x = 1;
74 static constexpr int y = 2;
75
76 auto p1 = boost::hof::pack_basic(x, y);
77 static_assert(!boost::hof::detail::is_default_constructible<decltype(p1)>::value, "Pack default constructible");
78
79 BOOST_HOF_STATIC_TEST_CHECK(boost::hof::pack_basic(x, y)(binary_class()) == 3);
80 BOOST_HOF_TEST_CHECK(boost::hof::pack_basic(x, y)(binary_class()) == 3 );
81
82 auto p2 = boost::hof::pack(std::ref(x), std::ref(y));
83 static_assert(!boost::hof::detail::is_default_constructible<decltype(p2)>::value, "Pack default constructible");
84
85 BOOST_HOF_STATIC_TEST_CHECK(boost::hof::pack(x, y)(binary_class()) == 3);
86 BOOST_HOF_TEST_CHECK(boost::hof::pack(std::ref(x), std::ref(y))(binary_class()) == 3 );
87
88 auto p3 = boost::hof::pack_forward(x, y);
89 static_assert(!boost::hof::detail::is_default_constructible<decltype(p3)>::value, "Pack default constructible");
90
91 BOOST_HOF_STATIC_TEST_CHECK(boost::hof::pack_forward(x, y)(binary_class()) == 3);
92 BOOST_HOF_TEST_CHECK(boost::hof::pack_forward(x, y)(binary_class()) == 3 );
93 }
94
BOOST_HOF_TEST_CASE()95 BOOST_HOF_TEST_CASE()
96 {
97 BOOST_HOF_STATIC_TEST_CHECK(boost::hof::pack_basic()(boost::hof::always(3)) == 3);
98 BOOST_HOF_TEST_CHECK(boost::hof::pack_basic()(boost::hof::always(3)) == 3 );
99 }
100
BOOST_HOF_TEST_CASE()101 BOOST_HOF_TEST_CASE()
102 {
103 BOOST_HOF_STATIC_TEST_CHECK(boost::hof::pack_basic(3)(boost::hof::identity) == 3);
104 BOOST_HOF_TEST_CHECK(boost::hof::pack_basic(3)(boost::hof::identity) == 3 );
105 }
106
BOOST_HOF_TEST_CASE()107 BOOST_HOF_TEST_CASE()
108 {
109 auto p = boost::hof::pack(1);
110 BOOST_HOF_TEST_CHECK(boost::hof::pack_join(p, boost::hof::pack(2))(binary_class()) == 3);
111 BOOST_HOF_TEST_CHECK(boost::hof::pack_join(p, p)(binary_class()) == 2);
112 BOOST_HOF_TEST_CHECK(boost::hof::pack_join(p, p, boost::hof::pack())(binary_class()) == 2);
113
114 }
115
BOOST_HOF_TEST_CASE()116 BOOST_HOF_TEST_CASE()
117 {
118 BOOST_HOF_STATIC_TEST_CHECK(boost::hof::pack_join(boost::hof::pack_basic(1), boost::hof::pack_basic(2))(binary_class()) == 3);
119 BOOST_HOF_TEST_CHECK(boost::hof::pack_join(boost::hof::pack_basic(1), boost::hof::pack_basic(2))(binary_class()) == 3 );
120
121 BOOST_HOF_STATIC_TEST_CHECK(boost::hof::pack_join(boost::hof::pack(1), boost::hof::pack(2))(binary_class()) == 3);
122 BOOST_HOF_TEST_CHECK(boost::hof::pack_join(boost::hof::pack(1), boost::hof::pack(2))(binary_class()) == 3 );
123
124 BOOST_HOF_STATIC_TEST_CHECK(boost::hof::pack_join(boost::hof::pack_forward(1), boost::hof::pack_forward(2))(binary_class()) == 3);
125 BOOST_HOF_TEST_CHECK(boost::hof::pack_join(boost::hof::pack_forward(1), boost::hof::pack_forward(2))(binary_class()) == 3 );
126 }
127
BOOST_HOF_TEST_CASE()128 BOOST_HOF_TEST_CASE()
129 {
130 BOOST_HOF_STATIC_TEST_CHECK(boost::hof::pack_join(boost::hof::pack_basic(), boost::hof::pack_basic(1, 2))(binary_class()) == 3);
131 BOOST_HOF_TEST_CHECK(boost::hof::pack_join(boost::hof::pack_basic(), boost::hof::pack_basic(1, 2))(binary_class()) == 3 );
132
133 BOOST_HOF_STATIC_TEST_CHECK(boost::hof::pack_join(boost::hof::pack(), boost::hof::pack(1, 2))(binary_class()) == 3);
134 BOOST_HOF_TEST_CHECK(boost::hof::pack_join(boost::hof::pack(), boost::hof::pack(1, 2))(binary_class()) == 3 );
135
136 BOOST_HOF_STATIC_TEST_CHECK(boost::hof::pack_join(boost::hof::pack_forward(), boost::hof::pack_forward(1, 2))(binary_class()) == 3);
137 BOOST_HOF_TEST_CHECK(boost::hof::pack_join(boost::hof::pack_forward(), boost::hof::pack_forward(1, 2))(binary_class()) == 3 );
138 }
139
BOOST_HOF_TEST_CASE()140 BOOST_HOF_TEST_CASE()
141 {
142 BOOST_HOF_STATIC_TEST_CHECK(boost::hof::pack_join(boost::hof::pack_basic(1, 2), boost::hof::pack_basic())(binary_class()) == 3);
143 BOOST_HOF_TEST_CHECK(boost::hof::pack_join(boost::hof::pack_basic(1, 2), boost::hof::pack_basic())(binary_class()) == 3 );
144
145 BOOST_HOF_STATIC_TEST_CHECK(boost::hof::pack_join(boost::hof::pack(1, 2), boost::hof::pack())(binary_class()) == 3);
146 BOOST_HOF_TEST_CHECK(boost::hof::pack_join(boost::hof::pack(1, 2), boost::hof::pack())(binary_class()) == 3 );
147
148 BOOST_HOF_STATIC_TEST_CHECK(boost::hof::pack_join(boost::hof::pack_forward(1, 2), boost::hof::pack_forward())(binary_class()) == 3);
149 BOOST_HOF_TEST_CHECK(boost::hof::pack_join(boost::hof::pack_forward(1, 2), boost::hof::pack_forward())(binary_class()) == 3 );
150 }
151
BOOST_HOF_TEST_CASE()152 BOOST_HOF_TEST_CASE()
153 {
154 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);
155 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 );
156
157 BOOST_HOF_STATIC_TEST_CHECK(boost::hof::pack_join(boost::hof::pack(1), boost::hof::pack(), boost::hof::pack(2))(binary_class()) == 3);
158 BOOST_HOF_TEST_CHECK(boost::hof::pack_join(boost::hof::pack(1), boost::hof::pack(), boost::hof::pack(2))(binary_class()) == 3 );
159
160 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);
161 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 );
162 }
163
BOOST_HOF_TEST_CASE()164 BOOST_HOF_TEST_CASE()
165 {
166 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);
167 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 );
168
169 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);
170 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 );
171
172 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);
173 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 );
174 }
175
BOOST_HOF_TEST_CASE()176 BOOST_HOF_TEST_CASE()
177 {
178 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);
179 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 );
180
181 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);
182 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 );
183
184 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);
185 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 );
186 }
187
188 struct deref
189 {
operator ()deref190 int operator()(const std::unique_ptr<int>& i) const
191 {
192 return *i;
193 }
194 };
195
BOOST_HOF_TEST_CASE()196 BOOST_HOF_TEST_CASE()
197 {
198 std::unique_ptr<int> i(new int(3));
199 BOOST_HOF_TEST_CHECK(boost::hof::pack_basic(i)(deref()) == 3);
200 BOOST_HOF_TEST_CHECK(boost::hof::pack_basic(std::unique_ptr<int>(new int(3)))(deref()) == 3);
201 BOOST_HOF_TEST_CHECK(boost::hof::pack_forward(std::unique_ptr<int>(new int(3)))(deref()) == 3);
202 BOOST_HOF_TEST_CHECK(boost::hof::pack(std::unique_ptr<int>(new int(3)))(deref()) == 3);
203 auto p = boost::hof::pack_basic(std::unique_ptr<int>(new int(3)));
204 BOOST_HOF_TEST_CHECK(p(deref()) == 3);
205
206 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);
207 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);
208 BOOST_HOF_TEST_CHECK(boost::hof::pack_join(boost::hof::pack(), boost::hof::pack(std::unique_ptr<int>(new int(3))))(deref()) == 3);
209 // BOOST_HOF_TEST_CHECK(p(deref()) == 3);
210 }
211
212 struct move_rvalue
213 {
operator ()move_rvalue214 void operator()(std::string&& s) const
215 {
216 std::string ss = std::move(s);
217 BOOST_HOF_TEST_CHECK(ss == "abcdef");
218 s = "00000";
219 }
220 };
221
222 struct check_rvalue
223 {
operator ()check_rvalue224 void operator()(std::string&& s) const
225 {
226 BOOST_HOF_TEST_CHECK(s == "abcdef");
227 }
228 };
229
BOOST_HOF_TEST_CASE()230 BOOST_HOF_TEST_CASE()
231 {
232 auto p = boost::hof::pack_basic(std::string{"abcdef"});
233 p(move_rvalue{});
234 p(check_rvalue{});
235 }
236
BOOST_HOF_TEST_CASE()237 BOOST_HOF_TEST_CASE()
238 {
239 auto p = boost::hof::pack(std::string{"abcdef"});
240 p(move_rvalue{});
241 p(check_rvalue{});
242 }
243
244 struct empty1
245 {};
246
247 struct empty2
248 {};
249
BOOST_HOF_TEST_CASE()250 BOOST_HOF_TEST_CASE()
251 {
252 static_assert(boost::hof::detail::is_default_constructible<empty1, empty2>::value, "Not default constructible");
253 }
254
BOOST_HOF_TEST_CASE()255 BOOST_HOF_TEST_CASE()
256 {
257 static constexpr auto p = boost::hof::pack_basic(empty1());
258 BOOST_HOF_TEST_CHECK(p(boost::hof::always(0)) == 0);
259 BOOST_HOF_STATIC_TEST_CHECK(p(boost::hof::always(0)) == 0);
260 #ifndef _MSC_VER
261 static_assert(std::is_empty<decltype(p)>::value, "Pack not empty");
262 #endif
263 static_assert(boost::hof::detail::is_default_constructible<decltype(p)>::value, "Not default constructible");
264
265 }
266
BOOST_HOF_TEST_CASE()267 BOOST_HOF_TEST_CASE()
268 {
269 static constexpr auto p = boost::hof::pack_basic(empty1(), empty2());
270 BOOST_HOF_TEST_CHECK(p(boost::hof::always(0)) == 0);
271 BOOST_HOF_STATIC_TEST_CHECK(p(boost::hof::always(0)) == 0);
272 #ifndef _MSC_VER
273 static_assert(std::is_empty<decltype(p)>::value, "Pack not empty");
274 #endif
275 static_assert(boost::hof::detail::is_default_constructible<decltype(p)>::value, "Not default constructible");
276 }
277
BOOST_HOF_TEST_CASE()278 BOOST_HOF_TEST_CASE()
279 {
280 static constexpr auto p = boost::hof::pack_basic(boost::hof::pack_basic(), boost::hof::pack_basic());
281 BOOST_HOF_TEST_CHECK(p(boost::hof::always(0)) == 0);
282 BOOST_HOF_STATIC_TEST_CHECK(p(boost::hof::always(0)) == 0);
283 #ifndef _MSC_VER
284 static_assert(std::is_empty<decltype(p)>::value, "Pack not empty");
285 #endif
286 static_assert(boost::hof::detail::is_default_constructible<decltype(p)>::value, "Not default constructible");
287 }
288
BOOST_HOF_TEST_CASE()289 BOOST_HOF_TEST_CASE()
290 {
291 static constexpr auto p = boost::hof::pack_basic(empty1(), empty2(), empty1());
292 BOOST_HOF_TEST_CHECK(p(boost::hof::always(0)) == 0);
293 BOOST_HOF_STATIC_TEST_CHECK(p(boost::hof::always(0)) == 0);
294 #ifndef _MSC_VER
295 static_assert(std::is_empty<decltype(p)>::value, "Pack not empty");
296 #endif
297 static_assert(boost::hof::detail::is_default_constructible<decltype(p)>::value, "Not default constructible");
298 }
299
BOOST_HOF_TEST_CASE()300 BOOST_HOF_TEST_CASE()
301 {
302 static constexpr auto p = boost::hof::pack_basic(empty1(), boost::hof::pack_basic(empty1(), empty2()));
303 BOOST_HOF_TEST_CHECK(p(boost::hof::always(0)) == 0);
304 BOOST_HOF_STATIC_TEST_CHECK(p(boost::hof::always(0)) == 0);
305 #ifndef _MSC_VER
306 static_assert(std::is_empty<decltype(p)>::value, "Pack not empty");
307 #endif
308 static_assert(boost::hof::detail::is_default_constructible<decltype(p)>::value, "Not default constructible");
309 }
310
BOOST_HOF_TEST_CASE()311 BOOST_HOF_TEST_CASE()
312 {
313 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()));
314 BOOST_HOF_TEST_CHECK(p(boost::hof::always(0)) == 0);
315 BOOST_HOF_STATIC_TEST_CHECK(p(boost::hof::always(0)) == 0);
316 #ifndef _MSC_VER
317 static_assert(std::is_empty<decltype(p)>::value, "Pack not empty");
318 #endif
319 static_assert(boost::hof::detail::is_default_constructible<decltype(p)>::value, "Not default constructible");
320 }
321
322 struct not_default_constructible
323 {
324 int i;
not_default_constructiblenot_default_constructible325 constexpr not_default_constructible(int x) : i(x)
326 {}
327 };
328
329 struct select_i
330 {
331 template<class T>
operator ()select_i332 constexpr int operator()(T&& x) const
333 {
334 return x.i;
335 }
336
337 template<class T, class U>
operator ()select_i338 constexpr int operator()(T&& x, U&& y) const
339 {
340 return x.i + y.i;
341 }
342
343 template<class T, class U, class V>
operator ()select_i344 constexpr int operator()(T&& x, U&& y, V&& z) const
345 {
346 return x.i + y.i + z.i;
347 }
348 };
349
BOOST_HOF_TEST_CASE()350 BOOST_HOF_TEST_CASE()
351 {
352 static_assert(!boost::hof::detail::is_default_constructible<not_default_constructible>::value, "Default constructible");
353 auto p = boost::hof::pack_basic(not_default_constructible(3));
354 static_assert(!boost::hof::detail::is_default_constructible<decltype(p)>::value, "Pack default constructible");
355 auto p1 = boost::hof::pack_forward(p);
356 static_assert(!boost::hof::detail::is_default_constructible<decltype(p1)>::value, "Packs default constructible");
357 auto p2 = boost::hof::pack_forward(p, p);
358 static_assert(!boost::hof::detail::is_default_constructible<decltype(p2)>::value, "Packs default constructible");
359 auto p3 = boost::hof::pack_forward(p, p, p);
360 static_assert(!boost::hof::detail::is_default_constructible<decltype(p3)>::value, "Packs default constructible");
361 BOOST_HOF_TEST_CHECK(p(select_i()) == 3);
362 BOOST_HOF_STATIC_TEST_CHECK(boost::hof::pack_basic(not_default_constructible(3))(select_i()) == 3);
363 }
364
BOOST_HOF_TEST_CASE()365 BOOST_HOF_TEST_CASE()
366 {
367 static_assert(!boost::hof::detail::is_default_constructible<not_default_constructible>::value, "Default constructible");
368 auto p = boost::hof::pack_basic(not_default_constructible(1), not_default_constructible(2));
369 static_assert(!boost::hof::detail::is_default_constructible<decltype(p)>::value, "Pack default constructible");
370 auto p1 = boost::hof::pack_forward(p);
371 static_assert(!boost::hof::detail::is_default_constructible<decltype(p1)>::value, "Packs default constructible");
372 auto p2 = boost::hof::pack_forward(p, p);
373 static_assert(!boost::hof::detail::is_default_constructible<decltype(p2)>::value, "Packs default constructible");
374 auto p3 = boost::hof::pack_forward(p, p, p);
375 static_assert(!boost::hof::detail::is_default_constructible<decltype(p3)>::value, "Packs default constructible");
376 BOOST_HOF_TEST_CHECK(p(select_i()) == 3);
377 BOOST_HOF_STATIC_TEST_CHECK(boost::hof::pack_basic(not_default_constructible(1), not_default_constructible(2))(select_i()) == 3);
378 }
379
BOOST_HOF_TEST_CASE()380 BOOST_HOF_TEST_CASE()
381 {
382 static_assert(!boost::hof::detail::is_default_constructible<not_default_constructible>::value, "Default constructible");
383 auto p = boost::hof::pack_basic(not_default_constructible(1), not_default_constructible(1), not_default_constructible(1));
384 static_assert(!boost::hof::detail::is_default_constructible<decltype(p)>::value, "Pack default constructible");
385 auto p1 = boost::hof::pack_forward(p);
386 static_assert(!boost::hof::detail::is_default_constructible<decltype(p1)>::value, "Packs default constructible");
387 auto p2 = boost::hof::pack_forward(p, p);
388 static_assert(!boost::hof::detail::is_default_constructible<decltype(p2)>::value, "Packs default constructible");
389 auto p3 = boost::hof::pack_forward(p, p, p);
390 static_assert(!boost::hof::detail::is_default_constructible<decltype(p3)>::value, "Packs default constructible");
391 BOOST_HOF_TEST_CHECK(p(select_i()) == 3);
392 BOOST_HOF_STATIC_TEST_CHECK(boost::hof::pack_basic(not_default_constructible(1), not_default_constructible(1), not_default_constructible(1))(select_i()) == 3);
393 }
394
395
396