zips.hpp 12 KB

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