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)
5 #ifndef BOOST_HANA_TEST_AUTO_CARTESIAN_PRODUCT_HPP
6 #define BOOST_HANA_TEST_AUTO_CARTESIAN_PRODUCT_HPP
8 #include <boost/hana/assert.hpp>
9 #include <boost/hana/cartesian_product.hpp>
10 #include <boost/hana/equal.hpp>
12 #include <laws/base.hpp>
13 #include "test_case.hpp"
16 TestCase test_cartesian_product{[]{
17 namespace hana = boost::hana;
18 using hana::test::ct_eq;
21 BOOST_HANA_CONSTANT_CHECK(hana::equal(
22 hana::cartesian_product(MAKE_TUPLE()),
27 BOOST_HANA_CONSTANT_CHECK(hana::equal(
28 hana::cartesian_product(MAKE_TUPLE(
34 BOOST_HANA_CONSTANT_CHECK(hana::equal(
35 hana::cartesian_product(MAKE_TUPLE(
36 MAKE_TUPLE(ct_eq<0>{})
39 MAKE_TUPLE(ct_eq<0>{})
43 BOOST_HANA_CONSTANT_CHECK(hana::equal(
44 hana::cartesian_product(MAKE_TUPLE(
45 MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{})
48 MAKE_TUPLE(ct_eq<0>{}),
49 MAKE_TUPLE(ct_eq<1>{})
53 BOOST_HANA_CONSTANT_CHECK(hana::equal(
54 hana::cartesian_product(MAKE_TUPLE(
55 MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{})
58 MAKE_TUPLE(ct_eq<0>{}),
59 MAKE_TUPLE(ct_eq<1>{}),
60 MAKE_TUPLE(ct_eq<2>{})
64 BOOST_HANA_CONSTANT_CHECK(hana::equal(
65 hana::cartesian_product(MAKE_TUPLE(
66 MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{})
69 MAKE_TUPLE(ct_eq<0>{}),
70 MAKE_TUPLE(ct_eq<1>{}),
71 MAKE_TUPLE(ct_eq<2>{}),
72 MAKE_TUPLE(ct_eq<3>{})
77 BOOST_HANA_CONSTANT_CHECK(hana::equal(
78 hana::cartesian_product(MAKE_TUPLE(
85 BOOST_HANA_CONSTANT_CHECK(hana::equal(
86 hana::cartesian_product(MAKE_TUPLE(
87 MAKE_TUPLE(ct_eq<00>{}),
93 BOOST_HANA_CONSTANT_CHECK(hana::equal(
94 hana::cartesian_product(MAKE_TUPLE(
95 MAKE_TUPLE(ct_eq<00>{}),
96 MAKE_TUPLE(ct_eq<10>{})
99 MAKE_TUPLE(ct_eq<00>{}, ct_eq<10>{})
103 BOOST_HANA_CONSTANT_CHECK(hana::equal(
104 hana::cartesian_product(MAKE_TUPLE(
105 MAKE_TUPLE(ct_eq<00>{}, ct_eq<01>{}),
106 MAKE_TUPLE(ct_eq<10>{})
109 MAKE_TUPLE(ct_eq<00>{}, ct_eq<10>{}),
110 MAKE_TUPLE(ct_eq<01>{}, ct_eq<10>{})
114 BOOST_HANA_CONSTANT_CHECK(hana::equal(
115 hana::cartesian_product(MAKE_TUPLE(
116 MAKE_TUPLE(ct_eq<00>{}),
117 MAKE_TUPLE(ct_eq<10>{}, ct_eq<11>{})
120 MAKE_TUPLE(ct_eq<00>{}, ct_eq<10>{}),
121 MAKE_TUPLE(ct_eq<00>{}, ct_eq<11>{})
125 BOOST_HANA_CONSTANT_CHECK(hana::equal(
126 hana::cartesian_product(MAKE_TUPLE(
127 MAKE_TUPLE(ct_eq<00>{}, ct_eq<01>{}),
128 MAKE_TUPLE(ct_eq<10>{}, ct_eq<11>{})
131 MAKE_TUPLE(ct_eq<00>{}, ct_eq<10>{}),
132 MAKE_TUPLE(ct_eq<00>{}, ct_eq<11>{}),
133 MAKE_TUPLE(ct_eq<01>{}, ct_eq<10>{}),
134 MAKE_TUPLE(ct_eq<01>{}, ct_eq<11>{})
139 BOOST_HANA_CONSTANT_CHECK(hana::equal(
140 hana::cartesian_product(MAKE_TUPLE(
141 MAKE_TUPLE(ct_eq<00>{}),
142 MAKE_TUPLE(ct_eq<10>{}),
143 MAKE_TUPLE(ct_eq<20>{}),
144 MAKE_TUPLE(ct_eq<30>{}, ct_eq<31>{})
147 MAKE_TUPLE(ct_eq<00>{}, ct_eq<10>{}, ct_eq<20>{}, ct_eq<30>{}),
148 MAKE_TUPLE(ct_eq<00>{}, ct_eq<10>{}, ct_eq<20>{}, ct_eq<31>{})
152 BOOST_HANA_CONSTANT_CHECK(hana::equal(
153 hana::cartesian_product(MAKE_TUPLE(
154 MAKE_TUPLE(ct_eq<00>{}),
155 MAKE_TUPLE(ct_eq<10>{}),
156 MAKE_TUPLE(ct_eq<20>{}, ct_eq<21>{}),
157 MAKE_TUPLE(ct_eq<30>{}, ct_eq<31>{})
160 MAKE_TUPLE(ct_eq<00>{}, ct_eq<10>{}, ct_eq<20>{}, ct_eq<30>{}),
161 MAKE_TUPLE(ct_eq<00>{}, ct_eq<10>{}, ct_eq<20>{}, ct_eq<31>{}),
162 MAKE_TUPLE(ct_eq<00>{}, ct_eq<10>{}, ct_eq<21>{}, ct_eq<30>{}),
163 MAKE_TUPLE(ct_eq<00>{}, ct_eq<10>{}, ct_eq<21>{}, ct_eq<31>{})
168 // cartesian_product in a constexpr context
169 #ifndef MAKE_TUPLE_NO_CONSTEXPR
170 static_assert(hana::equal(
171 hana::cartesian_product(MAKE_TUPLE(
181 static_assert(hana::equal(
182 hana::cartesian_product(MAKE_TUPLE(
192 static_assert(hana::equal(
193 hana::cartesian_product(MAKE_TUPLE(
205 static_assert(hana::equal(
206 hana::cartesian_product(MAKE_TUPLE(
213 MAKE_TUPLE(1, 'a', 1.f, 1l),
214 MAKE_TUPLE(1, 'a', 1.f, 2l)
218 static_assert(hana::equal(
219 hana::cartesian_product(MAKE_TUPLE(
227 MAKE_TUPLE(1, 'a', 1.f, 1l, nullptr),
228 MAKE_TUPLE(1, 'a', 1.f, 2l, nullptr)
234 #endif // !BOOST_HANA_TEST_AUTO_CARTESIAN_PRODUCT_HPP