• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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