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
13BOOST_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
29struct copy_throws
30{
31 copy_throws() {}
32 copy_throws(copy_throws const&) {}
33 copy_throws(copy_throws&&) noexcept {}
34};
35
36BOOST_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
54BOOST_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
71BOOST_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(t: x), std::ref(t: 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
95BOOST_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
101BOOST_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
107BOOST_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
116BOOST_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
128BOOST_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
140BOOST_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
152BOOST_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
164BOOST_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
176BOOST_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
188struct deref
189{
190 int operator()(const std::unique_ptr<int>& i) const
191 {
192 return *i;
193 }
194};
195
196BOOST_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
212struct move_rvalue
213{
214 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
222struct check_rvalue
223{
224 void operator()(std::string&& s) const
225 {
226 BOOST_HOF_TEST_CHECK(s == "abcdef");
227 }
228};
229
230BOOST_HOF_TEST_CASE()
231{
232 auto p = boost::hof::pack_basic(std::string{"abcdef"});
233 p(move_rvalue{});
234 p(check_rvalue{});
235}
236
237BOOST_HOF_TEST_CASE()
238{
239 auto p = boost::hof::pack(std::string{"abcdef"});
240 p(move_rvalue{});
241 p(check_rvalue{});
242}
243
244struct empty1
245{};
246
247struct empty2
248{};
249
250BOOST_HOF_TEST_CASE()
251{
252 static_assert(boost::hof::detail::is_default_constructible<empty1, empty2>::value, "Not default constructible");
253}
254
255BOOST_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
267BOOST_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
278BOOST_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
289BOOST_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
300BOOST_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
311BOOST_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
322struct not_default_constructible
323{
324 int i;
325 constexpr not_default_constructible(int x) : i(x)
326 {}
327};
328
329struct select_i
330{
331 template<class T>
332 constexpr int operator()(T&& x) const
333 {
334 return x.i;
335 }
336
337 template<class T, class U>
338 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>
344 constexpr int operator()(T&& x, U&& y, V&& z) const
345 {
346 return x.i + y.i + z.i;
347 }
348};
349
350BOOST_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
365BOOST_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
380BOOST_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

source code of boost/libs/hof/test/pack.cpp