• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #include <boost/hana/detail/variadic/split_at.hpp>
6 
7 #include <boost/hana/assert.hpp>
8 #include <boost/hana/equal.hpp>
9 #include <boost/hana/pair.hpp>
10 #include <boost/hana/tuple.hpp>
11 
12 #include <laws/base.hpp>
13 namespace hana = boost::hana;
14 namespace vd = hana::detail::variadic;
15 using hana::test::ct_eq;
16 
17 
__anoncc3cdace0102(auto split, auto xs, auto ys) 18 auto check = [](auto split, auto xs, auto ys) {
19     auto result = split([](auto ...xs) {
20         return [=](auto ...ys) {
21             return hana::make_pair(hana::make_tuple(xs...), hana::make_tuple(ys...));
22         };
23     });
24 
25     BOOST_HANA_CONSTANT_CHECK(hana::equal(xs, hana::first(result)));
26     BOOST_HANA_CONSTANT_CHECK(hana::equal(ys, hana::second(result)));
27 };
28 
main()29 int main() {
30     {
31         check(
32             vd::split_at<0>(),
33             hana::make_tuple(),
34             hana::make_tuple()
35         );
36 
37         check(
38             vd::split_at<0>(ct_eq<1>{}),
39             hana::make_tuple(),
40             hana::make_tuple(ct_eq<1>{})
41         );
42 
43         check(
44             vd::split_at<0>(ct_eq<1>{}, ct_eq<2>{}),
45             hana::make_tuple(),
46             hana::make_tuple(ct_eq<1>{}, ct_eq<2>{})
47         );
48 
49         check(
50             vd::split_at<0>(ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{}),
51             hana::make_tuple(),
52             hana::make_tuple(ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{})
53         );
54     }
55     {
56         check(
57             vd::split_at<1>(ct_eq<1>{}),
58             hana::make_tuple(ct_eq<1>{}),
59             hana::make_tuple()
60         );
61 
62         check(
63             vd::split_at<1>(ct_eq<1>{}, ct_eq<2>{}),
64             hana::make_tuple(ct_eq<1>{}),
65             hana::make_tuple(ct_eq<2>{})
66         );
67 
68         check(
69             vd::split_at<1>(ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{}),
70             hana::make_tuple(ct_eq<1>{}),
71             hana::make_tuple(ct_eq<2>{}, ct_eq<3>{})
72         );
73 
74         check(
75             vd::split_at<1>(ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{}, ct_eq<4>{}),
76             hana::make_tuple(ct_eq<1>{}),
77             hana::make_tuple(ct_eq<2>{}, ct_eq<3>{}, ct_eq<4>{})
78         );
79     }
80     {
81         check(
82             vd::split_at<2>(ct_eq<1>{}, ct_eq<2>{}),
83             hana::make_tuple(ct_eq<1>{}, ct_eq<2>{}),
84             hana::make_tuple()
85         );
86 
87         check(
88             vd::split_at<2>(ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{}),
89             hana::make_tuple(ct_eq<1>{}, ct_eq<2>{}),
90             hana::make_tuple(ct_eq<3>{})
91         );
92 
93         check(
94             vd::split_at<2>(ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{}, ct_eq<4>{}),
95             hana::make_tuple(ct_eq<1>{}, ct_eq<2>{}),
96             hana::make_tuple(ct_eq<3>{}, ct_eq<4>{})
97         );
98 
99         check(
100             vd::split_at<2>(ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{}, ct_eq<4>{}, ct_eq<5>{}),
101             hana::make_tuple(ct_eq<1>{}, ct_eq<2>{}),
102             hana::make_tuple(ct_eq<3>{}, ct_eq<4>{}, ct_eq<5>{})
103         );
104     }
105     {
106         check(
107             vd::split_at<7>(ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{}, ct_eq<4>{}, ct_eq<5>{}, ct_eq<6>{}, ct_eq<7>{}),
108             hana::make_tuple(ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{}, ct_eq<4>{}, ct_eq<5>{}, ct_eq<6>{}, ct_eq<7>{}),
109             hana::make_tuple()
110         );
111 
112         check(
113             vd::split_at<7>(ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{}, ct_eq<4>{}, ct_eq<5>{}, ct_eq<6>{}, ct_eq<7>{}, ct_eq<8>{}),
114             hana::make_tuple(ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{}, ct_eq<4>{}, ct_eq<5>{}, ct_eq<6>{}, ct_eq<7>{}),
115             hana::make_tuple(ct_eq<8>{})
116         );
117 
118         check(
119             vd::split_at<7>(ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{}, ct_eq<4>{}, ct_eq<5>{}, ct_eq<6>{}, ct_eq<7>{}, ct_eq<8>{}, ct_eq<9>{}),
120             hana::make_tuple(ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{}, ct_eq<4>{}, ct_eq<5>{}, ct_eq<6>{}, ct_eq<7>{}),
121             hana::make_tuple(ct_eq<8>{}, ct_eq<9>{})
122         );
123 
124         check(
125             vd::split_at<7>(ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{}, ct_eq<4>{}, ct_eq<5>{}, ct_eq<6>{}, ct_eq<7>{}, ct_eq<8>{}, ct_eq<9>{}, ct_eq<10>{}),
126             hana::make_tuple(ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{}, ct_eq<4>{}, ct_eq<5>{}, ct_eq<6>{}, ct_eq<7>{}),
127             hana::make_tuple(ct_eq<8>{}, ct_eq<9>{}, ct_eq<10>{})
128         );
129     }
130     {
131         check(
132             vd::split_at<8>(ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{}, ct_eq<4>{}, ct_eq<5>{}, ct_eq<6>{}, ct_eq<7>{}, ct_eq<8>{}),
133             hana::make_tuple(ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{}, ct_eq<4>{}, ct_eq<5>{}, ct_eq<6>{}, ct_eq<7>{}, ct_eq<8>{}),
134             hana::make_tuple()
135         );
136 
137         check(
138             vd::split_at<8>(ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{}, ct_eq<4>{}, ct_eq<5>{}, ct_eq<6>{}, ct_eq<7>{}, ct_eq<8>{}, ct_eq<9>{}),
139             hana::make_tuple(ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{}, ct_eq<4>{}, ct_eq<5>{}, ct_eq<6>{}, ct_eq<7>{}, ct_eq<8>{}),
140             hana::make_tuple(ct_eq<9>{})
141         );
142 
143         check(
144             vd::split_at<8>(ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{}, ct_eq<4>{}, ct_eq<5>{}, ct_eq<6>{}, ct_eq<7>{}, ct_eq<8>{}, ct_eq<9>{}, ct_eq<10>{}),
145             hana::make_tuple(ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{}, ct_eq<4>{}, ct_eq<5>{}, ct_eq<6>{}, ct_eq<7>{}, ct_eq<8>{}),
146             hana::make_tuple(ct_eq<9>{}, ct_eq<10>{})
147         );
148     }
149     {
150         check(
151             vd::split_at<9>(ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{}, ct_eq<4>{}, ct_eq<5>{}, ct_eq<6>{}, ct_eq<7>{}, ct_eq<8>{}, ct_eq<9>{}),
152             hana::make_tuple(ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{}, ct_eq<4>{}, ct_eq<5>{}, ct_eq<6>{}, ct_eq<7>{}, ct_eq<8>{}, ct_eq<9>{}),
153             hana::make_tuple()
154         );
155 
156         check(
157             vd::split_at<9>(ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{}, ct_eq<4>{}, ct_eq<5>{}, ct_eq<6>{}, ct_eq<7>{}, ct_eq<8>{}, ct_eq<9>{}, ct_eq<10>{}),
158             hana::make_tuple(ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{}, ct_eq<4>{}, ct_eq<5>{}, ct_eq<6>{}, ct_eq<7>{}, ct_eq<8>{}, ct_eq<9>{}),
159             hana::make_tuple(ct_eq<10>{})
160         );
161 
162         check(
163             vd::split_at<9>(ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{}, ct_eq<4>{}, ct_eq<5>{}, ct_eq<6>{}, ct_eq<7>{}, ct_eq<8>{}, ct_eq<9>{}, ct_eq<10>{}, ct_eq<11>{}),
164             hana::make_tuple(ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{}, ct_eq<4>{}, ct_eq<5>{}, ct_eq<6>{}, ct_eq<7>{}, ct_eq<8>{}, ct_eq<9>{}),
165             hana::make_tuple(ct_eq<10>{}, ct_eq<11>{})
166         );
167     }
168 }
169