cartesian_product.hpp 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  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. #ifndef BOOST_HANA_TEST_AUTO_CARTESIAN_PRODUCT_HPP
  5. #define BOOST_HANA_TEST_AUTO_CARTESIAN_PRODUCT_HPP
  6. #include <boost/hana/assert.hpp>
  7. #include <boost/hana/cartesian_product.hpp>
  8. #include <boost/hana/equal.hpp>
  9. #include <laws/base.hpp>
  10. #include "test_case.hpp"
  11. TestCase test_cartesian_product{[]{
  12. namespace hana = boost::hana;
  13. using hana::test::ct_eq;
  14. // 0 lists
  15. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  16. hana::cartesian_product(MAKE_TUPLE()),
  17. MAKE_TUPLE()
  18. ));
  19. // 1 list
  20. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  21. hana::cartesian_product(MAKE_TUPLE(
  22. MAKE_TUPLE()
  23. )),
  24. MAKE_TUPLE()
  25. ));
  26. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  27. hana::cartesian_product(MAKE_TUPLE(
  28. MAKE_TUPLE(ct_eq<0>{})
  29. )),
  30. MAKE_TUPLE(
  31. MAKE_TUPLE(ct_eq<0>{})
  32. )
  33. ));
  34. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  35. hana::cartesian_product(MAKE_TUPLE(
  36. MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{})
  37. )),
  38. MAKE_TUPLE(
  39. MAKE_TUPLE(ct_eq<0>{}),
  40. MAKE_TUPLE(ct_eq<1>{})
  41. )
  42. ));
  43. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  44. hana::cartesian_product(MAKE_TUPLE(
  45. MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{})
  46. )),
  47. MAKE_TUPLE(
  48. MAKE_TUPLE(ct_eq<0>{}),
  49. MAKE_TUPLE(ct_eq<1>{}),
  50. MAKE_TUPLE(ct_eq<2>{})
  51. )
  52. ));
  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>{}, ct_eq<3>{})
  56. )),
  57. MAKE_TUPLE(
  58. MAKE_TUPLE(ct_eq<0>{}),
  59. MAKE_TUPLE(ct_eq<1>{}),
  60. MAKE_TUPLE(ct_eq<2>{}),
  61. MAKE_TUPLE(ct_eq<3>{})
  62. )
  63. ));
  64. // 2 lists
  65. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  66. hana::cartesian_product(MAKE_TUPLE(
  67. MAKE_TUPLE(),
  68. MAKE_TUPLE()
  69. )),
  70. MAKE_TUPLE()
  71. ));
  72. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  73. hana::cartesian_product(MAKE_TUPLE(
  74. MAKE_TUPLE(ct_eq<00>{}),
  75. MAKE_TUPLE()
  76. )),
  77. MAKE_TUPLE()
  78. ));
  79. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  80. hana::cartesian_product(MAKE_TUPLE(
  81. MAKE_TUPLE(ct_eq<00>{}),
  82. MAKE_TUPLE(ct_eq<10>{})
  83. )),
  84. MAKE_TUPLE(
  85. MAKE_TUPLE(ct_eq<00>{}, ct_eq<10>{})
  86. )
  87. ));
  88. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  89. hana::cartesian_product(MAKE_TUPLE(
  90. MAKE_TUPLE(ct_eq<00>{}, ct_eq<01>{}),
  91. MAKE_TUPLE(ct_eq<10>{})
  92. )),
  93. MAKE_TUPLE(
  94. MAKE_TUPLE(ct_eq<00>{}, ct_eq<10>{}),
  95. MAKE_TUPLE(ct_eq<01>{}, ct_eq<10>{})
  96. )
  97. ));
  98. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  99. hana::cartesian_product(MAKE_TUPLE(
  100. MAKE_TUPLE(ct_eq<00>{}),
  101. MAKE_TUPLE(ct_eq<10>{}, ct_eq<11>{})
  102. )),
  103. MAKE_TUPLE(
  104. MAKE_TUPLE(ct_eq<00>{}, ct_eq<10>{}),
  105. MAKE_TUPLE(ct_eq<00>{}, ct_eq<11>{})
  106. )
  107. ));
  108. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  109. hana::cartesian_product(MAKE_TUPLE(
  110. MAKE_TUPLE(ct_eq<00>{}, ct_eq<01>{}),
  111. MAKE_TUPLE(ct_eq<10>{}, ct_eq<11>{})
  112. )),
  113. MAKE_TUPLE(
  114. MAKE_TUPLE(ct_eq<00>{}, ct_eq<10>{}),
  115. MAKE_TUPLE(ct_eq<00>{}, ct_eq<11>{}),
  116. MAKE_TUPLE(ct_eq<01>{}, ct_eq<10>{}),
  117. MAKE_TUPLE(ct_eq<01>{}, ct_eq<11>{})
  118. )
  119. ));
  120. // misc
  121. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  122. hana::cartesian_product(MAKE_TUPLE(
  123. MAKE_TUPLE(ct_eq<00>{}),
  124. MAKE_TUPLE(ct_eq<10>{}),
  125. MAKE_TUPLE(ct_eq<20>{}),
  126. MAKE_TUPLE(ct_eq<30>{}, ct_eq<31>{})
  127. )),
  128. MAKE_TUPLE(
  129. MAKE_TUPLE(ct_eq<00>{}, ct_eq<10>{}, ct_eq<20>{}, ct_eq<30>{}),
  130. MAKE_TUPLE(ct_eq<00>{}, ct_eq<10>{}, ct_eq<20>{}, ct_eq<31>{})
  131. )
  132. ));
  133. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  134. hana::cartesian_product(MAKE_TUPLE(
  135. MAKE_TUPLE(ct_eq<00>{}),
  136. MAKE_TUPLE(ct_eq<10>{}),
  137. MAKE_TUPLE(ct_eq<20>{}, ct_eq<21>{}),
  138. MAKE_TUPLE(ct_eq<30>{}, ct_eq<31>{})
  139. )),
  140. MAKE_TUPLE(
  141. MAKE_TUPLE(ct_eq<00>{}, ct_eq<10>{}, ct_eq<20>{}, ct_eq<30>{}),
  142. MAKE_TUPLE(ct_eq<00>{}, ct_eq<10>{}, ct_eq<20>{}, ct_eq<31>{}),
  143. MAKE_TUPLE(ct_eq<00>{}, ct_eq<10>{}, ct_eq<21>{}, ct_eq<30>{}),
  144. MAKE_TUPLE(ct_eq<00>{}, ct_eq<10>{}, ct_eq<21>{}, ct_eq<31>{})
  145. )
  146. ));
  147. // cartesian_product in a constexpr context
  148. #ifndef MAKE_TUPLE_NO_CONSTEXPR
  149. static_assert(hana::equal(
  150. hana::cartesian_product(MAKE_TUPLE(
  151. MAKE_TUPLE(1),
  152. MAKE_TUPLE('a', 'b')
  153. )),
  154. MAKE_TUPLE(
  155. MAKE_TUPLE(1, 'a'),
  156. MAKE_TUPLE(1, 'b')
  157. )
  158. ), "");
  159. static_assert(hana::equal(
  160. hana::cartesian_product(MAKE_TUPLE(
  161. MAKE_TUPLE(1, 2),
  162. MAKE_TUPLE('a')
  163. )),
  164. MAKE_TUPLE(
  165. MAKE_TUPLE(1, 'a'),
  166. MAKE_TUPLE(2, 'a')
  167. )
  168. ), "");
  169. static_assert(hana::equal(
  170. hana::cartesian_product(MAKE_TUPLE(
  171. MAKE_TUPLE(1, 2),
  172. MAKE_TUPLE('a', 'b')
  173. )),
  174. MAKE_TUPLE(
  175. MAKE_TUPLE(1, 'a'),
  176. MAKE_TUPLE(1, 'b'),
  177. MAKE_TUPLE(2, 'a'),
  178. MAKE_TUPLE(2, 'b')
  179. )
  180. ), "");
  181. static_assert(hana::equal(
  182. hana::cartesian_product(MAKE_TUPLE(
  183. MAKE_TUPLE(1),
  184. MAKE_TUPLE('a'),
  185. MAKE_TUPLE(1.f),
  186. MAKE_TUPLE(1l, 2l)
  187. )),
  188. MAKE_TUPLE(
  189. MAKE_TUPLE(1, 'a', 1.f, 1l),
  190. MAKE_TUPLE(1, 'a', 1.f, 2l)
  191. )
  192. ), "");
  193. static_assert(hana::equal(
  194. hana::cartesian_product(MAKE_TUPLE(
  195. MAKE_TUPLE(1),
  196. MAKE_TUPLE('a'),
  197. MAKE_TUPLE(1.f),
  198. MAKE_TUPLE(1l, 2l),
  199. MAKE_TUPLE(nullptr)
  200. )),
  201. MAKE_TUPLE(
  202. MAKE_TUPLE(1, 'a', 1.f, 1l, nullptr),
  203. MAKE_TUPLE(1, 'a', 1.f, 2l, nullptr)
  204. )
  205. ), "");
  206. #endif
  207. }};
  208. #endif // !BOOST_HANA_TEST_AUTO_CARTESIAN_PRODUCT_HPP