1 // Copyright Louis Dionne 2013-2017
2 // Distributed under the Boost Software License, Version 1.0.
3 // (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
4 
5 #ifndef BOOST_HANA_TEST_AUTO_ZIPS_HPP
6 #define BOOST_HANA_TEST_AUTO_ZIPS_HPP
7 
8 #include <boost/hana/assert.hpp>
9 #include <boost/hana/equal.hpp>
10 #include <boost/hana/zip.hpp>
11 #include <boost/hana/zip_shortest.hpp>
12 #include <boost/hana/zip_shortest_with.hpp>
13 #include <boost/hana/zip_with.hpp>
14 
15 #include <laws/base.hpp>
16 #include "test_case.hpp"
17 
18 
__anoncca9caea0102null19 TestCase test_zip_shortest_with{[]{
20     namespace hana = boost::hana;
21     using hana::test::ct_eq;
22 
23     hana::test::_injection<0> f{};
24     auto zip = hana::zip_shortest_with;
25     struct undefined { };
26 
27     // zip 1
28     BOOST_HANA_CONSTANT_CHECK(hana::equal(
29         zip(undefined{}, MAKE_TUPLE()),
30         MAKE_TUPLE()
31     ));
32     BOOST_HANA_CONSTANT_CHECK(hana::equal(
33         zip(f, MAKE_TUPLE(ct_eq<0>{})),
34         MAKE_TUPLE(f(ct_eq<0>{}))
35     ));
36     BOOST_HANA_CONSTANT_CHECK(hana::equal(
37         zip(f, MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{})),
38         MAKE_TUPLE(f(ct_eq<0>{}), f(ct_eq<1>{}))
39     ));
40     BOOST_HANA_CONSTANT_CHECK(hana::equal(
41         zip(f, MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{})),
42         MAKE_TUPLE(f(ct_eq<0>{}), f(ct_eq<1>{}), f(ct_eq<2>{}))
43     ));
44 
45     // zip 2
46     BOOST_HANA_CONSTANT_CHECK(hana::equal(
47         zip(undefined{}, MAKE_TUPLE(), MAKE_TUPLE()),
48         MAKE_TUPLE()
49     ));
50     BOOST_HANA_CONSTANT_CHECK(hana::equal(
51         zip(undefined{}, MAKE_TUPLE(undefined{}), MAKE_TUPLE()),
52         MAKE_TUPLE()
53     ));
54     BOOST_HANA_CONSTANT_CHECK(hana::equal(
55         zip(undefined{}, MAKE_TUPLE(), MAKE_TUPLE(undefined{})),
56         MAKE_TUPLE()
57     ));
58     BOOST_HANA_CONSTANT_CHECK(hana::equal(
59         zip(f, MAKE_TUPLE(ct_eq<1>{}), MAKE_TUPLE(ct_eq<-1>{})),
60         MAKE_TUPLE(f(ct_eq<1>{}, ct_eq<-1>{}))
61     ));
62     BOOST_HANA_CONSTANT_CHECK(hana::equal(
63         zip(f, MAKE_TUPLE(ct_eq<1>{}, ct_eq<2>{}), MAKE_TUPLE(ct_eq<-1>{})),
64         MAKE_TUPLE(f(ct_eq<1>{}, ct_eq<-1>{}))
65     ));
66     BOOST_HANA_CONSTANT_CHECK(hana::equal(
67         zip(f, MAKE_TUPLE(ct_eq<1>{}), MAKE_TUPLE(ct_eq<-1>{}, ct_eq<-2>{})),
68         MAKE_TUPLE(f(ct_eq<1>{}, ct_eq<-1>{}))
69     ));
70     BOOST_HANA_CONSTANT_CHECK(hana::equal(
71         zip(f, MAKE_TUPLE(ct_eq<1>{}, ct_eq<2>{}), MAKE_TUPLE(ct_eq<-1>{}, ct_eq<-2>{})),
72         MAKE_TUPLE(f(ct_eq<1>{}, ct_eq<-1>{}), f(ct_eq<2>{}, ct_eq<-2>{}))
73     ));
74     BOOST_HANA_CONSTANT_CHECK(hana::equal(
75         zip(f, MAKE_TUPLE(ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{}, ct_eq<4>{}),
76                MAKE_TUPLE(ct_eq<-1>{}, ct_eq<-2>{}, ct_eq<-3>{})),
77         MAKE_TUPLE(f(ct_eq<1>{}, ct_eq<-1>{}),
78              f(ct_eq<2>{}, ct_eq<-2>{}),
79              f(ct_eq<3>{}, ct_eq<-3>{}))
80     ));
81 
82     // zip 3
83     BOOST_HANA_CONSTANT_CHECK(hana::equal(
84         zip(undefined{}, MAKE_TUPLE(), MAKE_TUPLE(), MAKE_TUPLE()),
85         MAKE_TUPLE()
86     ));
87 
88     BOOST_HANA_CONSTANT_CHECK(hana::equal(
89         zip(undefined{}, MAKE_TUPLE(undefined{}), MAKE_TUPLE(), MAKE_TUPLE()),
90         MAKE_TUPLE()
91     ));
92     BOOST_HANA_CONSTANT_CHECK(hana::equal(
93         zip(undefined{}, MAKE_TUPLE(), MAKE_TUPLE(undefined{}), MAKE_TUPLE()),
94         MAKE_TUPLE()
95     ));
96     BOOST_HANA_CONSTANT_CHECK(hana::equal(
97         zip(undefined{}, MAKE_TUPLE(), MAKE_TUPLE(), MAKE_TUPLE(undefined{})),
98         MAKE_TUPLE()
99     ));
100 
101     BOOST_HANA_CONSTANT_CHECK(hana::equal(
102         zip(undefined{}, MAKE_TUPLE(), MAKE_TUPLE(undefined{}), MAKE_TUPLE(undefined{})),
103         MAKE_TUPLE()
104     ));
105     BOOST_HANA_CONSTANT_CHECK(hana::equal(
106         zip(undefined{}, MAKE_TUPLE(undefined{}), MAKE_TUPLE(), MAKE_TUPLE(undefined{})),
107         MAKE_TUPLE()
108     ));
109     BOOST_HANA_CONSTANT_CHECK(hana::equal(
110         zip(undefined{}, MAKE_TUPLE(undefined{}), MAKE_TUPLE(undefined{}), MAKE_TUPLE()),
111         MAKE_TUPLE()
112     ));
113 
114     BOOST_HANA_CONSTANT_CHECK(hana::equal(
115         zip(f, MAKE_TUPLE(ct_eq<0>{}), MAKE_TUPLE(ct_eq<1>{}), MAKE_TUPLE(ct_eq<2>{})),
116         MAKE_TUPLE(f(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{}))
117     ));
118 
119     // zip 4
120     BOOST_HANA_CONSTANT_CHECK(hana::equal(
121         zip(f,
122             MAKE_TUPLE(ct_eq<11>{}, ct_eq<12>{}, ct_eq<13>{}, ct_eq<14>{}),
123             MAKE_TUPLE(ct_eq<21>{}, ct_eq<22>{}, ct_eq<23>{}),
124             MAKE_TUPLE(ct_eq<31>{}, ct_eq<32>{}, ct_eq<33>{}, ct_eq<34>{}),
125             MAKE_TUPLE(ct_eq<41>{}, ct_eq<42>{}, ct_eq<43>{}, ct_eq<44>{}, ct_eq<45>{})
126         ),
127         MAKE_TUPLE(
128             f(ct_eq<11>{}, ct_eq<21>{}, ct_eq<31>{}, ct_eq<41>{}),
129             f(ct_eq<12>{}, ct_eq<22>{}, ct_eq<32>{}, ct_eq<42>{}),
130             f(ct_eq<13>{}, ct_eq<23>{}, ct_eq<33>{}, ct_eq<43>{})
131         )
132     ));
133 
134     // zip 5
135     BOOST_HANA_CONSTANT_CHECK(hana::equal(
136         zip(f,
137             MAKE_TUPLE(ct_eq<11>{}, ct_eq<12>{}, ct_eq<13>{}, ct_eq<14>{}),
138             MAKE_TUPLE(ct_eq<21>{}, ct_eq<22>{}, ct_eq<23>{}, ct_eq<24>{}, ct_eq<25>{}),
139             MAKE_TUPLE(ct_eq<31>{}, ct_eq<32>{}, ct_eq<33>{}, ct_eq<34>{}),
140             MAKE_TUPLE(ct_eq<41>{}, ct_eq<42>{}, ct_eq<43>{}, ct_eq<44>{}, ct_eq<45>{}, ct_eq<46>{}),
141             MAKE_TUPLE(ct_eq<51>{}, ct_eq<52>{}, ct_eq<53>{}, ct_eq<54>{}, ct_eq<55>{})
142         ),
143         MAKE_TUPLE(
144             f(ct_eq<11>{}, ct_eq<21>{}, ct_eq<31>{}, ct_eq<41>{}, ct_eq<51>{}),
145             f(ct_eq<12>{}, ct_eq<22>{}, ct_eq<32>{}, ct_eq<42>{}, ct_eq<52>{}),
146             f(ct_eq<13>{}, ct_eq<23>{}, ct_eq<33>{}, ct_eq<43>{}, ct_eq<53>{}),
147             f(ct_eq<14>{}, ct_eq<24>{}, ct_eq<34>{}, ct_eq<44>{}, ct_eq<54>{})
148         )
149     ));
150 }};
151 
__anoncca9caea0202null152 TestCase test_zip_with{[]{
153     namespace hana = boost::hana;
154     using hana::test::ct_eq;
155 
156     hana::test::_injection<0> f{};
157     struct undefined { };
158 
159     // zip 1
160     BOOST_HANA_CONSTANT_CHECK(hana::equal(
161         hana::zip_with(undefined{}, MAKE_TUPLE()),
162         MAKE_TUPLE()
163     ));
164     BOOST_HANA_CONSTANT_CHECK(hana::equal(
165         hana::zip_with(f, MAKE_TUPLE(ct_eq<0>{})),
166         MAKE_TUPLE(f(ct_eq<0>{}))
167     ));
168     BOOST_HANA_CONSTANT_CHECK(hana::equal(
169         hana::zip_with(f, MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{})),
170         MAKE_TUPLE(f(ct_eq<0>{}), f(ct_eq<1>{}))
171     ));
172     BOOST_HANA_CONSTANT_CHECK(hana::equal(
173         hana::zip_with(f, MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{})),
174         MAKE_TUPLE(f(ct_eq<0>{}), f(ct_eq<1>{}), f(ct_eq<2>{}))
175     ));
176 
177     // zip 2
178     BOOST_HANA_CONSTANT_CHECK(hana::equal(
179         hana::zip_with(undefined{}, MAKE_TUPLE(), MAKE_TUPLE()),
180         MAKE_TUPLE()
181     ));
182     BOOST_HANA_CONSTANT_CHECK(hana::equal(
183         hana::zip_with(f, MAKE_TUPLE(ct_eq<1>{}), MAKE_TUPLE(ct_eq<-1>{})),
184         MAKE_TUPLE(f(ct_eq<1>{}, ct_eq<-1>{}))
185     ));
186     BOOST_HANA_CONSTANT_CHECK(hana::equal(
187         hana::zip_with(f, MAKE_TUPLE(ct_eq<1>{}, ct_eq<2>{}), MAKE_TUPLE(ct_eq<-1>{}, ct_eq<-2>{})),
188         MAKE_TUPLE(f(ct_eq<1>{}, ct_eq<-1>{}), f(ct_eq<2>{}, ct_eq<-2>{}))
189     ));
190     BOOST_HANA_CONSTANT_CHECK(hana::equal(
191         hana::zip_with(f,
192             MAKE_TUPLE(ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{}),
193             MAKE_TUPLE(ct_eq<-1>{}, ct_eq<-2>{}, ct_eq<-3>{})),
194         MAKE_TUPLE(
195             f(ct_eq<1>{}, ct_eq<-1>{}),
196             f(ct_eq<2>{}, ct_eq<-2>{}),
197             f(ct_eq<3>{}, ct_eq<-3>{}))
198     ));
199 
200     // zip 3
201     BOOST_HANA_CONSTANT_CHECK(hana::equal(
202         hana::zip_with(undefined{}, MAKE_TUPLE(), MAKE_TUPLE(), MAKE_TUPLE()),
203         MAKE_TUPLE()
204     ));
205     BOOST_HANA_CONSTANT_CHECK(hana::equal(
206         hana::zip_with(f, MAKE_TUPLE(ct_eq<0>{}), MAKE_TUPLE(ct_eq<1>{}), MAKE_TUPLE(ct_eq<2>{})),
207         MAKE_TUPLE(f(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{}))
208     ));
209     BOOST_HANA_CONSTANT_CHECK(hana::equal(
210         hana::zip_with(f,
211             MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}),
212             MAKE_TUPLE(ct_eq<2>{}, ct_eq<3>{}),
213             MAKE_TUPLE(ct_eq<4>{}, ct_eq<5>{})
214         ),
215         MAKE_TUPLE(
216             f(ct_eq<0>{}, ct_eq<2>{}, ct_eq<4>{}),
217             f(ct_eq<1>{}, ct_eq<3>{}, ct_eq<5>{})
218         )
219     ));
220 
221     // zip 4
222     BOOST_HANA_CONSTANT_CHECK(hana::equal(
223         hana::zip_with(f,
224             MAKE_TUPLE(ct_eq<11>{}, ct_eq<12>{}, ct_eq<13>{}),
225             MAKE_TUPLE(ct_eq<21>{}, ct_eq<22>{}, ct_eq<23>{}),
226             MAKE_TUPLE(ct_eq<31>{}, ct_eq<32>{}, ct_eq<33>{}),
227             MAKE_TUPLE(ct_eq<41>{}, ct_eq<42>{}, ct_eq<43>{})
228         ),
229         MAKE_TUPLE(
230             f(ct_eq<11>{}, ct_eq<21>{}, ct_eq<31>{}, ct_eq<41>{}),
231             f(ct_eq<12>{}, ct_eq<22>{}, ct_eq<32>{}, ct_eq<42>{}),
232             f(ct_eq<13>{}, ct_eq<23>{}, ct_eq<33>{}, ct_eq<43>{})
233         )
234     ));
235 
236     // zip 5
237     BOOST_HANA_CONSTANT_CHECK(hana::equal(
238         hana::zip_with(f,
239             MAKE_TUPLE(ct_eq<11>{}, ct_eq<12>{}, ct_eq<13>{}, ct_eq<14>{}),
240             MAKE_TUPLE(ct_eq<21>{}, ct_eq<22>{}, ct_eq<23>{}, ct_eq<24>{}),
241             MAKE_TUPLE(ct_eq<31>{}, ct_eq<32>{}, ct_eq<33>{}, ct_eq<34>{}),
242             MAKE_TUPLE(ct_eq<41>{}, ct_eq<42>{}, ct_eq<43>{}, ct_eq<44>{}),
243             MAKE_TUPLE(ct_eq<51>{}, ct_eq<52>{}, ct_eq<53>{}, ct_eq<54>{})
244         ),
245         MAKE_TUPLE(
246             f(ct_eq<11>{}, ct_eq<21>{}, ct_eq<31>{}, ct_eq<41>{}, ct_eq<51>{}),
247             f(ct_eq<12>{}, ct_eq<22>{}, ct_eq<32>{}, ct_eq<42>{}, ct_eq<52>{}),
248             f(ct_eq<13>{}, ct_eq<23>{}, ct_eq<33>{}, ct_eq<43>{}, ct_eq<53>{}),
249             f(ct_eq<14>{}, ct_eq<24>{}, ct_eq<34>{}, ct_eq<44>{}, ct_eq<54>{})
250         )
251     ));
252 }};
253 
__anoncca9caea0302null254 TestCase test_zip{[]{
255     namespace hana = boost::hana;
256     using hana::test::ct_eq;
257 
258     BOOST_HANA_CONSTANT_CHECK(hana::equal(
259         hana::zip(MAKE_TUPLE()),
260         MAKE_TUPLE()
261     ));
262     BOOST_HANA_CONSTANT_CHECK(hana::equal(
263         hana::zip(MAKE_TUPLE(ct_eq<0>{})),
264         MAKE_TUPLE(MAKE_TUPLE(ct_eq<0>{}))
265     ));
266     BOOST_HANA_CONSTANT_CHECK(hana::equal(
267         hana::zip(MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{})),
268         MAKE_TUPLE(MAKE_TUPLE(ct_eq<0>{}), MAKE_TUPLE(ct_eq<1>{}))
269     ));
270     BOOST_HANA_CONSTANT_CHECK(hana::equal(
271         hana::zip(MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{})),
272         MAKE_TUPLE(MAKE_TUPLE(ct_eq<0>{}), MAKE_TUPLE(ct_eq<1>{}), MAKE_TUPLE(ct_eq<2>{}))
273     ));
274 
275     BOOST_HANA_CONSTANT_CHECK(hana::equal(
276         hana::zip(MAKE_TUPLE(), MAKE_TUPLE()),
277         MAKE_TUPLE()
278     ));
279     BOOST_HANA_CONSTANT_CHECK(hana::equal(
280         hana::zip(MAKE_TUPLE(ct_eq<0>{}), MAKE_TUPLE(ct_eq<1>{})),
281         MAKE_TUPLE(MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}))
282     ));
283 
284     BOOST_HANA_CONSTANT_CHECK(hana::equal(
285         hana::zip(MAKE_TUPLE(ct_eq<0>{}), MAKE_TUPLE(ct_eq<1>{}), MAKE_TUPLE(ct_eq<2>{})),
286         MAKE_TUPLE(MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{}))
287     ));
288     BOOST_HANA_CONSTANT_CHECK(hana::equal(
289         hana::zip(MAKE_TUPLE(ct_eq<0>{}, ct_eq<3>{}),
290                   MAKE_TUPLE(ct_eq<1>{}, ct_eq<4>{}),
291                   MAKE_TUPLE(ct_eq<2>{}, ct_eq<5>{})),
292         MAKE_TUPLE(MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{}),
293                    MAKE_TUPLE(ct_eq<3>{}, ct_eq<4>{}, ct_eq<5>{}))
294     ));
295 }};
296 
__anoncca9caea0402null297 TestCase test_zip_shortest{[]{
298     namespace hana = boost::hana;
299     using hana::test::ct_eq;
300 
301     BOOST_HANA_CONSTANT_CHECK(hana::equal(
302         hana::zip_shortest(MAKE_TUPLE()),
303         MAKE_TUPLE()
304     ));
305     BOOST_HANA_CONSTANT_CHECK(hana::equal(
306         hana::zip_shortest(MAKE_TUPLE(ct_eq<0>{})),
307         MAKE_TUPLE(MAKE_TUPLE(ct_eq<0>{}))
308     ));
309     BOOST_HANA_CONSTANT_CHECK(hana::equal(
310         hana::zip_shortest(MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{})),
311         MAKE_TUPLE(MAKE_TUPLE(ct_eq<0>{}), MAKE_TUPLE(ct_eq<1>{}))
312     ));
313     BOOST_HANA_CONSTANT_CHECK(hana::equal(
314         hana::zip_shortest(MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{})),
315         MAKE_TUPLE(MAKE_TUPLE(ct_eq<0>{}), MAKE_TUPLE(ct_eq<1>{}), MAKE_TUPLE(ct_eq<2>{}))
316     ));
317 
318     BOOST_HANA_CONSTANT_CHECK(hana::equal(
319         hana::zip_shortest(MAKE_TUPLE(), MAKE_TUPLE()),
320         MAKE_TUPLE()
321     ));
322     BOOST_HANA_CONSTANT_CHECK(hana::equal(
323         hana::zip_shortest(MAKE_TUPLE(ct_eq<0>{}), MAKE_TUPLE(ct_eq<1>{})),
324         MAKE_TUPLE(MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}))
325     ));
326 
327     BOOST_HANA_CONSTANT_CHECK(hana::equal(
328         hana::zip_shortest(MAKE_TUPLE(ct_eq<0>{}),
329                            MAKE_TUPLE(ct_eq<1>{}),
330                            MAKE_TUPLE(ct_eq<2>{})),
331         MAKE_TUPLE(MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{}))
332     ));
333     BOOST_HANA_CONSTANT_CHECK(hana::equal(
334         hana::zip_shortest(MAKE_TUPLE(ct_eq<0>{}, ct_eq<3>{}),
335                            MAKE_TUPLE(ct_eq<1>{}, ct_eq<4>{}),
336                            MAKE_TUPLE(ct_eq<2>{}, ct_eq<5>{}, ct_eq<8>{})),
337         MAKE_TUPLE(MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{}),
338                    MAKE_TUPLE(ct_eq<3>{}, ct_eq<4>{}, ct_eq<5>{}))
339     ));
340 }};
341 
342 #endif // !BOOST_HANA_TEST_AUTO_ZIPS_HPP
343