foldable.hpp 41 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104
  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_LAWS_FOLDABLE_HPP
  5. #define BOOST_HANA_TEST_LAWS_FOLDABLE_HPP
  6. #include <boost/hana/assert.hpp>
  7. #include <boost/hana/chain.hpp>
  8. #include <boost/hana/concept/comparable.hpp>
  9. #include <boost/hana/concept/foldable.hpp>
  10. #include <boost/hana/concept/product.hpp>
  11. #include <boost/hana/concept/sequence.hpp>
  12. #include <boost/hana/config.hpp>
  13. #include <boost/hana/core/make.hpp>
  14. #include <boost/hana/core/when.hpp>
  15. #include <boost/hana/count.hpp>
  16. #include <boost/hana/count_if.hpp>
  17. #include <boost/hana/equal.hpp>
  18. #include <boost/hana/first.hpp>
  19. #include <boost/hana/fold.hpp>
  20. #include <boost/hana/fold_left.hpp>
  21. #include <boost/hana/fold_right.hpp>
  22. #include <boost/hana/for_each.hpp>
  23. #include <boost/hana/functional/capture.hpp>
  24. #include <boost/hana/functional/curry.hpp>
  25. #include <boost/hana/functional/demux.hpp>
  26. #include <boost/hana/functional/flip.hpp>
  27. #include <boost/hana/integral_constant.hpp>
  28. #include <boost/hana/lazy.hpp>
  29. #include <boost/hana/length.hpp>
  30. #include <boost/hana/lift.hpp>
  31. #include <boost/hana/maximum.hpp>
  32. #include <boost/hana/minimum.hpp>
  33. #include <boost/hana/monadic_fold_left.hpp>
  34. #include <boost/hana/monadic_fold_right.hpp>
  35. #include <boost/hana/not_equal.hpp>
  36. #include <boost/hana/product.hpp>
  37. #include <boost/hana/reverse_fold.hpp>
  38. #include <boost/hana/second.hpp>
  39. #include <boost/hana/size.hpp>
  40. #include <boost/hana/sum.hpp>
  41. #include <boost/hana/unpack.hpp>
  42. #include <boost/hana/value.hpp>
  43. #include <laws/base.hpp>
  44. #include <support/identity.hpp>
  45. #include <vector>
  46. namespace boost { namespace hana { namespace test {
  47. template <typename F, typename = when<true>>
  48. struct TestFoldable : TestFoldable<F, laws> {
  49. using TestFoldable<F, laws>::TestFoldable;
  50. };
  51. template <typename F>
  52. struct TestFoldable<F, laws> {
  53. template <typename Foldables>
  54. TestFoldable(Foldables foldables) {
  55. hana::for_each(foldables, [](auto xs) {
  56. static_assert(Foldable<decltype(xs)>{}, "");
  57. _injection<0> f{};
  58. ct_eq<999> s{};
  59. // equivalence of size(xs) and length(xs)
  60. BOOST_HANA_CHECK(hana::equal(
  61. hana::length(xs),
  62. hana::size(xs)
  63. ));
  64. // equivalence of fold with fold_left and
  65. // of reverse_fold with fold_right
  66. BOOST_HANA_CHECK(hana::equal(
  67. hana::fold(xs, s, f),
  68. hana::fold_left(xs, s, f)
  69. ));
  70. BOOST_HANA_CHECK(hana::equal(
  71. hana::reverse_fold(xs, s, f),
  72. hana::fold_right(xs, s, hana::flip(f))
  73. ));
  74. only_when_(hana::not_equal(hana::length(xs), hana::size_c<0>),
  75. hana::make_lazy([](auto f, auto xs) {
  76. BOOST_HANA_CHECK(hana::equal(
  77. hana::fold(xs, f),
  78. hana::fold_left(xs, f)
  79. ));
  80. BOOST_HANA_CHECK(hana::equal(
  81. hana::reverse_fold(xs, f),
  82. hana::fold_right(xs, hana::flip(f))
  83. ));
  84. })(f, xs));
  85. // equivalence of count(xs, val) and count_if(xs, equal.to(val))
  86. struct not_there { };
  87. BOOST_HANA_CHECK(hana::equal(
  88. hana::count(xs, not_there{}),
  89. hana::count_if(xs, equal.to(not_there{}))
  90. ));
  91. hana::for_each(xs, hana::capture(xs)([](auto xs, auto value) {
  92. BOOST_HANA_CHECK(hana::equal(
  93. hana::count(xs, value),
  94. hana::count_if(xs, equal.to(value))
  95. ));
  96. }));
  97. });
  98. }
  99. };
  100. template <typename P>
  101. struct TestFoldable<P, when<Product<P>::value>>
  102. : TestFoldable<P, laws>
  103. {
  104. template <typename Products>
  105. TestFoldable(Products products) : TestFoldable<P, laws>{products} {
  106. hana::for_each(products, [](auto p) {
  107. _injection<0> f{};
  108. BOOST_HANA_CHECK(hana::equal(
  109. hana::unpack(p, f),
  110. f(hana::first(p), hana::second(p))
  111. ));
  112. });
  113. }
  114. };
  115. template <typename S>
  116. struct TestFoldable<S, when<Sequence<S>::value>>
  117. : TestFoldable<S, laws>
  118. {
  119. template <int i>
  120. using x = _constant<i>;
  121. template <int i>
  122. using ord = _constant<i>;
  123. struct undefined { };
  124. template <typename Xs>
  125. TestFoldable(Xs xs) : TestFoldable<S, laws>{xs} {
  126. _injection<0> f{};
  127. auto z = x<999>{};
  128. constexpr auto list = make<S>;
  129. //////////////////////////////////////////////////////////////////
  130. // fold_left (with initial state)
  131. //////////////////////////////////////////////////////////////////
  132. BOOST_HANA_CONSTANT_CHECK(equal(
  133. fold_left(list(), z, undefined{}),
  134. z
  135. ));
  136. BOOST_HANA_CONSTANT_CHECK(equal(
  137. fold_left(list(x<1>{}), z, f),
  138. f(z, x<1>{})
  139. ));
  140. BOOST_HANA_CONSTANT_CHECK(equal(
  141. fold_left(list(x<1>{}, x<2>{}), z, f),
  142. f(f(z, x<1>{}), x<2>{})
  143. ));
  144. BOOST_HANA_CONSTANT_CHECK(equal(
  145. fold_left(list(x<1>{}, x<2>{}, x<3>{}), z, f),
  146. f(f(f(z, x<1>{}), x<2>{}), x<3>{})
  147. ));
  148. BOOST_HANA_CONSTANT_CHECK(equal(
  149. fold_left(list(x<1>{}, x<2>{}, x<3>{}, x<4>{}), z, f),
  150. f(f(f(f(z, x<1>{}), x<2>{}), x<3>{}), x<4>{})
  151. ));
  152. BOOST_HANA_CONSTEXPR_CHECK(equal(
  153. fold_left(list(1), z, f),
  154. f(z, 1)
  155. ));
  156. BOOST_HANA_CONSTEXPR_CHECK(equal(
  157. fold_left(list(1, '2'), z, f),
  158. f(f(z, 1), '2')
  159. ));
  160. BOOST_HANA_CONSTEXPR_CHECK(equal(
  161. fold_left(list(1, '2', 3.3), z, f),
  162. f(f(f(z, 1), '2'), 3.3)
  163. ));
  164. BOOST_HANA_CONSTEXPR_CHECK(equal(
  165. fold_left(list(1, '2', 3.3, 4.4f), z, f),
  166. f(f(f(f(z, 1), '2'), 3.3), 4.4f)
  167. ));
  168. //////////////////////////////////////////////////////////////////
  169. // fold_left (without initial state)
  170. //////////////////////////////////////////////////////////////////
  171. BOOST_HANA_CONSTANT_CHECK(equal(
  172. fold_left(list(z), undefined{}),
  173. z
  174. ));
  175. BOOST_HANA_CONSTANT_CHECK(equal(
  176. fold_left(list(z, x<2>{}), f),
  177. f(z, x<2>{})
  178. ));
  179. BOOST_HANA_CONSTANT_CHECK(equal(
  180. fold_left(list(z, x<2>{}, x<3>{}), f),
  181. f(f(z, x<2>{}), x<3>{})
  182. ));
  183. BOOST_HANA_CONSTANT_CHECK(equal(
  184. fold_left(list(z, x<2>{}, x<3>{}, x<4>{}), f),
  185. f(f(f(z, x<2>{}), x<3>{}), x<4>{})
  186. ));
  187. //////////////////////////////////////////////////////////////////
  188. // fold_right (with initial state)
  189. //////////////////////////////////////////////////////////////////
  190. BOOST_HANA_CONSTANT_CHECK(equal(
  191. fold_right(list(), z, undefined{}),
  192. z
  193. ));
  194. BOOST_HANA_CONSTANT_CHECK(equal(
  195. fold_right(list(x<0>{}), z, f),
  196. f(x<0>{}, z)
  197. ));
  198. BOOST_HANA_CONSTANT_CHECK(equal(
  199. fold_right(list(x<0>{}, x<1>{}), z, f),
  200. f(x<0>{}, f(x<1>{}, z))
  201. ));
  202. BOOST_HANA_CONSTANT_CHECK(equal(
  203. fold_right(list(x<0>{}, x<1>{}, x<2>{}), z, f),
  204. f(x<0>{}, f(x<1>{}, f(x<2>{}, z)))
  205. ));
  206. BOOST_HANA_CONSTANT_CHECK(equal(
  207. fold_right(list(x<0>{}, x<1>{}, x<2>{}, x<3>{}), z, f),
  208. f(x<0>{}, f(x<1>{}, f(x<2>{}, f(x<3>{}, z))))
  209. ));
  210. BOOST_HANA_CONSTEXPR_CHECK(equal(
  211. fold_right(list(1), z, f),
  212. f(1, z)
  213. ));
  214. BOOST_HANA_CONSTEXPR_CHECK(equal(
  215. fold_right(list(1, '2'), z, f),
  216. f(1, f('2', z))
  217. ));
  218. BOOST_HANA_CONSTEXPR_CHECK(equal(
  219. fold_right(list(1, '2', 3.3), z, f),
  220. f(1, f('2', f(3.3, z)))
  221. ));
  222. BOOST_HANA_CONSTEXPR_CHECK(equal(
  223. fold_right(list(1, '2', 3.3, 4.4f), z, f),
  224. f(1, f('2', f(3.3, f(4.4f, z))))
  225. ));
  226. //////////////////////////////////////////////////////////////////
  227. // fold_right (without initial state)
  228. //////////////////////////////////////////////////////////////////
  229. BOOST_HANA_CONSTANT_CHECK(equal(
  230. fold_right(list(z), undefined{}),
  231. z
  232. ));
  233. BOOST_HANA_CONSTANT_CHECK(equal(
  234. fold_right(list(x<1>{}, z), f),
  235. f(x<1>{}, z)
  236. ));
  237. BOOST_HANA_CONSTANT_CHECK(equal(
  238. fold_right(list(x<1>{}, x<2>{}, z), f),
  239. f(x<1>{}, f(x<2>{}, z))
  240. ));
  241. BOOST_HANA_CONSTANT_CHECK(equal(
  242. fold_right(list(x<1>{}, x<2>{}, x<3>{}, z), f),
  243. f(x<1>{}, f(x<2>{}, f(x<3>{}, z)))
  244. ));
  245. //////////////////////////////////////////////////////////////////
  246. // monadic_fold_left (with initial state)
  247. //////////////////////////////////////////////////////////////////
  248. {
  249. using M = ::Identity;
  250. auto f = hana::demux(::identity)(test::_injection<0>{});
  251. auto s = x<999>{};
  252. auto fp = hana::curry<2>(hana::flip(f));
  253. constexpr auto mfold = monadic_fold_left<M>;
  254. BOOST_HANA_CONSTANT_CHECK(equal(
  255. mfold(list(), s, undefined{}),
  256. lift<M>(s)
  257. ));
  258. BOOST_HANA_CONSTANT_CHECK(equal(
  259. mfold(list(x<1>{}), s, f),
  260. f(s, x<1>{})
  261. ));
  262. BOOST_HANA_CONSTANT_CHECK(equal(
  263. mfold(list(x<1>{}, x<2>{}), s, f),
  264. chain(f(s, x<1>{}), fp(x<2>{}))
  265. ));
  266. BOOST_HANA_CONSTANT_CHECK(equal(
  267. mfold(list(x<1>{}, x<2>{}, x<3>{}), s, f),
  268. chain(chain(f(s, x<1>{}), fp(x<2>{})), fp(x<3>{}))
  269. ));
  270. BOOST_HANA_CONSTANT_CHECK(equal(
  271. mfold(list(x<1>{}, x<2>{}, x<3>{}, x<4>{}), s, f),
  272. chain(chain(chain(f(s, x<1>{}), fp(x<2>{})), fp(x<3>{})), fp(x<4>{}))
  273. ));
  274. BOOST_HANA_CONSTANT_CHECK(equal(
  275. mfold(list(x<1>{}, x<2>{}, x<3>{}, x<4>{}, x<5>{}), s, f),
  276. chain(chain(chain(chain(f(s, x<1>{}), fp(x<2>{})), fp(x<3>{})), fp(x<4>{})), fp(x<5>{}))
  277. ));
  278. }
  279. //////////////////////////////////////////////////////////////////
  280. // monadic_fold_left (without initial state)
  281. //////////////////////////////////////////////////////////////////
  282. {
  283. using M = ::Identity;
  284. auto f = hana::demux(::identity)(test::_injection<0>{});
  285. auto fp = hana::curry<2>(hana::flip(f));
  286. constexpr auto mfold = monadic_fold_left<M>;
  287. BOOST_HANA_CONSTANT_CHECK(equal(
  288. mfold(list(x<1>{}), undefined{}),
  289. lift<M>(x<1>{})
  290. ));
  291. BOOST_HANA_CONSTANT_CHECK(equal(
  292. mfold(list(x<1>{}, x<2>{}), f),
  293. f(x<1>{}, x<2>{})
  294. ));
  295. BOOST_HANA_CONSTANT_CHECK(equal(
  296. mfold(list(x<1>{}, x<2>{}, x<3>{}), f),
  297. chain(f(x<1>{}, x<2>{}), fp(x<3>{}))
  298. ));
  299. BOOST_HANA_CONSTANT_CHECK(equal(
  300. mfold(list(x<1>{}, x<2>{}, x<3>{}, x<4>{}), f),
  301. chain(chain(f(x<1>{}, x<2>{}), fp(x<3>{})), fp(x<4>{}))
  302. ));
  303. BOOST_HANA_CONSTANT_CHECK(equal(
  304. mfold(list(x<1>{}, x<2>{}, x<3>{}, x<4>{}, x<5>{}), f),
  305. chain(chain(chain(f(x<1>{}, x<2>{}), fp(x<3>{})), fp(x<4>{})), fp(x<5>{}))
  306. ));
  307. }
  308. //////////////////////////////////////////////////////////////////
  309. // monadic_fold_right (with initial state)
  310. //////////////////////////////////////////////////////////////////
  311. {
  312. using M = ::Identity;
  313. auto f = hana::demux(::identity)(test::_injection<0>{});
  314. auto s = x<999>{};
  315. auto fp = hana::curry<2>(f);
  316. // flipping `chain` makes the right associativity easier to see
  317. auto chain = hana::flip(hana::chain);
  318. constexpr auto mfold = monadic_fold_right<M>;
  319. BOOST_HANA_CONSTANT_CHECK(equal(
  320. mfold(list(), s, undefined{}),
  321. lift<M>(s)
  322. ));
  323. BOOST_HANA_CONSTANT_CHECK(equal(
  324. mfold(list(x<1>{}), s, f),
  325. f(x<1>{}, s)
  326. ));
  327. BOOST_HANA_CONSTANT_CHECK(equal(
  328. mfold(list(x<1>{}, x<2>{}), s, f),
  329. chain(fp(x<1>{}), f(x<2>{}, s))
  330. ));
  331. BOOST_HANA_CONSTANT_CHECK(equal(
  332. mfold(list(x<1>{}, x<2>{}, x<3>{}), s, f),
  333. chain(fp(x<1>{}), chain(fp(x<2>{}), f(x<3>{}, s)))
  334. ));
  335. BOOST_HANA_CONSTANT_CHECK(equal(
  336. mfold(list(x<1>{}, x<2>{}, x<3>{}, x<4>{}), s, f),
  337. chain(fp(x<1>{}), chain(fp(x<2>{}), chain(fp(x<3>{}), f(x<4>{}, s))))
  338. ));
  339. BOOST_HANA_CONSTANT_CHECK(equal(
  340. mfold(list(x<1>{}, x<2>{}, x<3>{}, x<4>{}, x<5>{}), s, f),
  341. chain(fp(x<1>{}), chain(fp(x<2>{}), chain(fp(x<3>{}), chain(fp(x<4>{}), f(x<5>{}, s)))))
  342. ));
  343. }
  344. //////////////////////////////////////////////////////////////////
  345. // monadic_fold_right (without initial state)
  346. //////////////////////////////////////////////////////////////////
  347. {
  348. using M = ::Identity;
  349. auto f = hana::demux(::identity)(test::_injection<0>{});
  350. auto fp = hana::curry<2>(f);
  351. // flipping `chain` makes the right associativity easier to see
  352. auto chain = hana::flip(hana::chain);
  353. constexpr auto mfold = monadic_fold_right<M>;
  354. BOOST_HANA_CONSTANT_CHECK(equal(
  355. mfold(list(x<1>{}), undefined{}),
  356. lift<M>(x<1>{})
  357. ));
  358. BOOST_HANA_CONSTANT_CHECK(equal(
  359. mfold(list(x<1>{}, x<2>{}), f),
  360. f(x<1>{}, x<2>{})
  361. ));
  362. BOOST_HANA_CONSTANT_CHECK(equal(
  363. mfold(list(x<1>{}, x<2>{}, x<3>{}), f),
  364. chain(fp(x<1>{}), f(x<2>{}, x<3>{}))
  365. ));
  366. BOOST_HANA_CONSTANT_CHECK(equal(
  367. mfold(list(x<1>{}, x<2>{}, x<3>{}, x<4>{}), f),
  368. chain(fp(x<1>{}), chain(fp(x<2>{}), f(x<3>{}, x<4>{})))
  369. ));
  370. BOOST_HANA_CONSTANT_CHECK(equal(
  371. mfold(list(x<1>{}, x<2>{}, x<3>{}, x<4>{}, x<5>{}), f),
  372. chain(fp(x<1>{}), chain(fp(x<2>{}), chain(fp(x<3>{}), f(x<4>{}, x<5>{}))))
  373. ));
  374. }
  375. //////////////////////////////////////////////////////////////////
  376. // length
  377. //////////////////////////////////////////////////////////////////
  378. BOOST_HANA_CONSTANT_CHECK(equal(
  379. length(list()), size_c<0>
  380. ));
  381. BOOST_HANA_CONSTANT_CHECK(equal(
  382. length(list(undefined{})), size_c<1>
  383. ));
  384. BOOST_HANA_CONSTANT_CHECK(equal(
  385. length(list(undefined{}, undefined{})), size_c<2>
  386. ));
  387. BOOST_HANA_CONSTANT_CHECK(equal(
  388. length(list(undefined{}, undefined{}, undefined{})), size_c<3>
  389. ));
  390. int i = 0; // non-constexpr
  391. BOOST_HANA_CONSTANT_CHECK(equal(
  392. length(list(i, i)),
  393. size_c<2>
  394. ));
  395. //////////////////////////////////////////////////////////////////
  396. // maximum (without a custom predicate)
  397. //////////////////////////////////////////////////////////////////
  398. {
  399. BOOST_HANA_CONSTANT_CHECK(equal(
  400. maximum(list(ord<0>{})),
  401. ord<0>{}
  402. ));
  403. BOOST_HANA_CONSTANT_CHECK(equal(
  404. maximum(list(ord<0>{}, ord<1>{})),
  405. ord<1>{}
  406. ));
  407. BOOST_HANA_CONSTANT_CHECK(equal(
  408. maximum(list(ord<1>{}, ord<0>{})),
  409. ord<1>{}
  410. ));
  411. BOOST_HANA_CONSTANT_CHECK(equal(
  412. maximum(list(ord<0>{}, ord<1>{}, ord<2>{})),
  413. ord<2>{}
  414. ));
  415. BOOST_HANA_CONSTANT_CHECK(equal(
  416. maximum(list(ord<1>{}, ord<0>{}, ord<2>{})),
  417. ord<2>{}
  418. ));
  419. BOOST_HANA_CONSTANT_CHECK(equal(
  420. maximum(list(ord<1>{}, ord<2>{}, ord<0>{})),
  421. ord<2>{}
  422. ));
  423. BOOST_HANA_CONSTANT_CHECK(equal(
  424. maximum(list(ord<2>{}, ord<1>{}, ord<0>{})),
  425. ord<2>{}
  426. ));
  427. BOOST_HANA_CONSTANT_CHECK(equal(
  428. maximum(list(ord<2>{}, ord<0>{}, ord<1>{})),
  429. ord<2>{}
  430. ));
  431. BOOST_HANA_CONSTANT_CHECK(equal(
  432. maximum(list(ord<0>{}, ord<1>{}, ord<2>{}, ord<3>{})),
  433. ord<3>{}
  434. ));
  435. BOOST_HANA_CONSTANT_CHECK(equal(
  436. maximum(list(ord<1>{}, ord<0>{}, ord<2>{}, ord<3>{})),
  437. ord<3>{}
  438. ));
  439. BOOST_HANA_CONSTANT_CHECK(equal(
  440. maximum(list(ord<1>{}, ord<2>{}, ord<0>{}, ord<3>{})),
  441. ord<3>{}
  442. ));
  443. BOOST_HANA_CONSTANT_CHECK(equal(
  444. maximum(list(ord<1>{}, ord<2>{}, ord<3>{}, ord<0>{})),
  445. ord<3>{}
  446. ));
  447. BOOST_HANA_CONSTANT_CHECK(equal(
  448. maximum(list(ord<2>{}, ord<1>{}, ord<3>{}, ord<0>{})),
  449. ord<3>{}
  450. ));
  451. BOOST_HANA_CONSTANT_CHECK(equal(
  452. maximum(list(ord<2>{}, ord<3>{}, ord<1>{}, ord<0>{})),
  453. ord<3>{}
  454. ));
  455. BOOST_HANA_CONSTANT_CHECK(equal(
  456. maximum(list(ord<2>{}, ord<3>{}, ord<0>{}, ord<1>{})),
  457. ord<3>{}
  458. ));
  459. BOOST_HANA_CONSTANT_CHECK(equal(
  460. maximum(list(ord<3>{}, ord<2>{}, ord<0>{}, ord<1>{})),
  461. ord<3>{}
  462. ));
  463. BOOST_HANA_CONSTANT_CHECK(equal(
  464. maximum(list(ord<3>{}, ord<0>{}, ord<2>{}, ord<1>{})),
  465. ord<3>{}
  466. ));
  467. BOOST_HANA_CONSTANT_CHECK(equal(
  468. maximum(list(ord<3>{}, ord<0>{}, ord<1>{}, ord<2>{})),
  469. ord<3>{}
  470. ));
  471. BOOST_HANA_CONSTANT_CHECK(equal(
  472. maximum(list(ord<0>{}, ord<2>{}, ord<3>{}, ord<1>{})),
  473. ord<3>{}
  474. ));
  475. BOOST_HANA_CONSTANT_CHECK(equal(
  476. maximum(list(ord<0>{}, ord<3>{}, ord<1>{}, ord<2>{})),
  477. ord<3>{}
  478. ));
  479. BOOST_HANA_CONSTEXPR_CHECK(equal(
  480. maximum(list(int{0})),
  481. int{0}
  482. ));
  483. BOOST_HANA_CONSTEXPR_CHECK(equal(
  484. maximum(list(int{0}, long{1})),
  485. long{1}
  486. ));
  487. BOOST_HANA_CONSTEXPR_CHECK(equal(
  488. maximum(list(int{1}, long{0})),
  489. int{1}
  490. ));
  491. BOOST_HANA_CONSTEXPR_CHECK(equal(
  492. maximum(list(int{0}, 1ll, long{2})),
  493. long{2}
  494. ));
  495. BOOST_HANA_CONSTEXPR_CHECK(equal(
  496. maximum(list(int{1}, 0ll, long{2})),
  497. long{2}
  498. ));
  499. BOOST_HANA_CONSTEXPR_CHECK(equal(
  500. maximum(list(int{1}, 2ll, long{0})),
  501. 2ll
  502. ));
  503. BOOST_HANA_CONSTEXPR_CHECK(equal(
  504. maximum(list(int{2}, 1ll, long{0})),
  505. int{2}
  506. ));
  507. BOOST_HANA_CONSTEXPR_CHECK(equal(
  508. maximum(list(int{2}, 0ll, long{1})),
  509. int{2}
  510. ));
  511. BOOST_HANA_CONSTEXPR_CHECK(equal(
  512. maximum(list(int{0}, 1ll, long{2}, short{3})),
  513. short{3}
  514. ));
  515. BOOST_HANA_CONSTEXPR_CHECK(equal(
  516. maximum(list(int{1}, 0ll, long{2}, short{3})),
  517. short{3}
  518. ));
  519. BOOST_HANA_CONSTEXPR_CHECK(equal(
  520. maximum(list(int{1}, 2ll, long{0}, short{3})),
  521. short{3}
  522. ));
  523. BOOST_HANA_CONSTEXPR_CHECK(equal(
  524. maximum(list(int{1}, 2ll, long{3}, short{0})),
  525. long{3}
  526. ));
  527. BOOST_HANA_CONSTEXPR_CHECK(equal(
  528. maximum(list(int{2}, 1ll, long{3}, short{0})),
  529. long{3}
  530. ));
  531. BOOST_HANA_CONSTEXPR_CHECK(equal(
  532. maximum(list(int{2}, 3ll, long{1}, short{0})),
  533. 3ll
  534. ));
  535. BOOST_HANA_CONSTEXPR_CHECK(equal(
  536. maximum(list(int{2}, 3ll, long{0}, short{1})),
  537. 3ll
  538. ));
  539. BOOST_HANA_CONSTEXPR_CHECK(equal(
  540. maximum(list(int{3}, 2ll, long{0}, short{1})),
  541. int{3}
  542. ));
  543. BOOST_HANA_CONSTEXPR_CHECK(equal(
  544. maximum(list(int{3}, 0ll, long{2}, short{1})),
  545. int{3}
  546. ));
  547. BOOST_HANA_CONSTEXPR_CHECK(equal(
  548. maximum(list(int{3}, 0ll, long{1}, short{2})),
  549. int{3}
  550. ));
  551. BOOST_HANA_CONSTEXPR_CHECK(equal(
  552. maximum(list(int{0}, 2ll, long{3}, short{1})),
  553. long{3}
  554. ));
  555. BOOST_HANA_CONSTEXPR_CHECK(equal(
  556. maximum(list(int{0}, 3ll, long{1}, short{2})),
  557. 3ll
  558. ));
  559. BOOST_HANA_CONSTEXPR_CHECK(equal(
  560. maximum(list(int{0}, 1ll, long_c<2>)),
  561. long{2}
  562. ));
  563. BOOST_HANA_CONSTEXPR_CHECK(equal(
  564. maximum(list(int{0}, long_c<1>, 2ll)),
  565. 2ll
  566. ));
  567. }
  568. //////////////////////////////////////////////////////////////////
  569. // minimum (without a custom predicate)
  570. //////////////////////////////////////////////////////////////////
  571. {
  572. BOOST_HANA_CONSTANT_CHECK(equal(
  573. minimum(list(ord<6>{})),
  574. ord<6>{}
  575. ));
  576. BOOST_HANA_CONSTANT_CHECK(equal(
  577. minimum(list(ord<6>{}, ord<7>{})),
  578. ord<6>{}
  579. ));
  580. BOOST_HANA_CONSTANT_CHECK(equal(
  581. minimum(list(ord<7>{}, ord<6>{})),
  582. ord<6>{}
  583. ));
  584. BOOST_HANA_CONSTANT_CHECK(equal(
  585. minimum(list(ord<6>{}, ord<7>{}, ord<8>{})),
  586. ord<6>{}
  587. ));
  588. BOOST_HANA_CONSTANT_CHECK(equal(
  589. minimum(list(ord<7>{}, ord<6>{}, ord<8>{})),
  590. ord<6>{}
  591. ));
  592. BOOST_HANA_CONSTANT_CHECK(equal(
  593. minimum(list(ord<7>{}, ord<8>{}, ord<6>{})),
  594. ord<6>{}
  595. ));
  596. BOOST_HANA_CONSTANT_CHECK(equal(
  597. minimum(list(ord<8>{}, ord<7>{}, ord<6>{})),
  598. ord<6>{}
  599. ));
  600. BOOST_HANA_CONSTANT_CHECK(equal(
  601. minimum(list(ord<8>{}, ord<6>{}, ord<7>{})),
  602. ord<6>{}
  603. ));
  604. BOOST_HANA_CONSTANT_CHECK(equal(
  605. minimum(list(ord<6>{}, ord<7>{}, ord<8>{}, ord<9>{})),
  606. ord<6>{}
  607. ));
  608. BOOST_HANA_CONSTANT_CHECK(equal(
  609. minimum(list(ord<7>{}, ord<6>{}, ord<8>{}, ord<9>{})),
  610. ord<6>{}
  611. ));
  612. BOOST_HANA_CONSTANT_CHECK(equal(
  613. minimum(list(ord<7>{}, ord<8>{}, ord<6>{}, ord<9>{})),
  614. ord<6>{}
  615. ));
  616. BOOST_HANA_CONSTANT_CHECK(equal(
  617. minimum(list(ord<7>{}, ord<8>{}, ord<9>{}, ord<6>{})),
  618. ord<6>{}
  619. ));
  620. BOOST_HANA_CONSTANT_CHECK(equal(
  621. minimum(list(ord<8>{}, ord<7>{}, ord<9>{}, ord<6>{})),
  622. ord<6>{}
  623. ));
  624. BOOST_HANA_CONSTANT_CHECK(equal(
  625. minimum(list(ord<8>{}, ord<9>{}, ord<7>{}, ord<6>{})),
  626. ord<6>{}
  627. ));
  628. BOOST_HANA_CONSTANT_CHECK(equal(
  629. minimum(list(ord<8>{}, ord<9>{}, ord<6>{}, ord<7>{})),
  630. ord<6>{}
  631. ));
  632. BOOST_HANA_CONSTANT_CHECK(equal(
  633. minimum(list(ord<9>{}, ord<8>{}, ord<6>{}, ord<7>{})),
  634. ord<6>{}
  635. ));
  636. BOOST_HANA_CONSTANT_CHECK(equal(
  637. minimum(list(ord<9>{}, ord<6>{}, ord<8>{}, ord<7>{})),
  638. ord<6>{}
  639. ));
  640. BOOST_HANA_CONSTANT_CHECK(equal(
  641. minimum(list(ord<9>{}, ord<6>{}, ord<7>{}, ord<8>{})),
  642. ord<6>{}
  643. ));
  644. BOOST_HANA_CONSTANT_CHECK(equal(
  645. minimum(list(ord<6>{}, ord<8>{}, ord<9>{}, ord<7>{})),
  646. ord<6>{}
  647. ));
  648. BOOST_HANA_CONSTANT_CHECK(equal(
  649. minimum(list(ord<6>{}, ord<9>{}, ord<7>{}, ord<8>{})),
  650. ord<6>{}
  651. ));
  652. BOOST_HANA_CONSTEXPR_CHECK(equal(
  653. minimum(list(int{4})),
  654. int{4}
  655. ));
  656. BOOST_HANA_CONSTEXPR_CHECK(equal(
  657. minimum(list(int{4}, short{5})),
  658. int{4}
  659. ));
  660. BOOST_HANA_CONSTEXPR_CHECK(equal(
  661. minimum(list(int{5}, short{4})),
  662. short{4}
  663. ));
  664. BOOST_HANA_CONSTEXPR_CHECK(equal(
  665. minimum(list(int{4}, short{5}, long{6})),
  666. int{4}
  667. ));
  668. BOOST_HANA_CONSTEXPR_CHECK(equal(
  669. minimum(list(int{7}, short{6}, long{8})),
  670. short{6}
  671. ));
  672. BOOST_HANA_CONSTEXPR_CHECK(equal(
  673. minimum(list(int{7}, short{8}, long{6})),
  674. long{6}
  675. ));
  676. BOOST_HANA_CONSTEXPR_CHECK(equal(
  677. minimum(list(int{8}, short{7}, long{6})),
  678. long{6}
  679. ));
  680. BOOST_HANA_CONSTEXPR_CHECK(equal(
  681. minimum(list(int{8}, short{6}, long{7})),
  682. short{6}
  683. ));
  684. BOOST_HANA_CONSTEXPR_CHECK(equal(
  685. minimum(list(int{6}, short{7}, long{8}, 9ll)),
  686. int{6}
  687. ));
  688. BOOST_HANA_CONSTEXPR_CHECK(equal(
  689. minimum(list(int{7}, short{6}, long{8}, 9ll)),
  690. short{6}
  691. ));
  692. BOOST_HANA_CONSTEXPR_CHECK(equal(
  693. minimum(list(int{7}, short{8}, long{6}, 9ll)),
  694. long{6}
  695. ));
  696. BOOST_HANA_CONSTEXPR_CHECK(equal(
  697. minimum(list(int{7}, short{8}, long{9}, 6ll)),
  698. 6ll
  699. ));
  700. BOOST_HANA_CONSTEXPR_CHECK(equal(
  701. minimum(list(int{8}, short{7}, long{9}, 6ll)),
  702. 6ll
  703. ));
  704. BOOST_HANA_CONSTEXPR_CHECK(equal(
  705. minimum(list(int{8}, short{9}, long{7}, 6ll)),
  706. 6ll
  707. ));
  708. BOOST_HANA_CONSTEXPR_CHECK(equal(
  709. minimum(list(int{8}, short{9}, long{6}, 7ll)),
  710. long{6}
  711. ));
  712. BOOST_HANA_CONSTEXPR_CHECK(equal(
  713. minimum(list(int{9}, short{8}, long{6}, 7ll)),
  714. long{6}
  715. ));
  716. BOOST_HANA_CONSTEXPR_CHECK(equal(
  717. minimum(list(int{9}, short{6}, long{8}, 7ll)),
  718. short{6}
  719. ));
  720. BOOST_HANA_CONSTEXPR_CHECK(equal(
  721. minimum(list(int{9}, short{6}, long{7}, 8ll)),
  722. short{6}
  723. ));
  724. BOOST_HANA_CONSTEXPR_CHECK(equal(
  725. minimum(list(int{6}, short{8}, long{9}, 7ll)),
  726. int{6}
  727. ));
  728. BOOST_HANA_CONSTEXPR_CHECK(equal(
  729. minimum(list(int{6}, short{9}, long{7}, 8ll)),
  730. int{6}
  731. ));
  732. BOOST_HANA_CONSTEXPR_CHECK(equal(
  733. minimum(list(int{3}, short{4}, long_c<5>)),
  734. int{3}
  735. ));
  736. BOOST_HANA_CONSTEXPR_CHECK(equal(
  737. minimum(list(ord<33>{}, short{45}, long{46})),
  738. ord<33>{}
  739. ));
  740. }
  741. //////////////////////////////////////////////////////////////////
  742. // count_if
  743. //////////////////////////////////////////////////////////////////
  744. BOOST_HANA_CONSTANT_CHECK(equal(
  745. count_if(list(), id), size_c<0>
  746. ));
  747. BOOST_HANA_CONSTANT_CHECK(equal(
  748. count_if(list(int_c<1>), id), size_c<1>
  749. ));
  750. BOOST_HANA_CONSTANT_CHECK(equal(
  751. count_if(list(int_c<0>), id), size_c<0>
  752. ));
  753. BOOST_HANA_CONSTANT_CHECK(equal(
  754. count_if(list(int_c<1>, char_c<1>), id), size_c<2>
  755. ));
  756. BOOST_HANA_CONSTANT_CHECK(equal(
  757. count_if(list(int_c<1>, char_c<0>), id), size_c<1>
  758. ));
  759. BOOST_HANA_CONSTANT_CHECK(equal(
  760. count_if(list(int_c<0>, char_c<1>), id), size_c<1>
  761. ));
  762. BOOST_HANA_CONSTANT_CHECK(equal(
  763. count_if(list(int_c<0>, char_c<0>), id), size_c<0>
  764. ));
  765. BOOST_HANA_CONSTANT_CHECK(equal(
  766. count_if(list(int_c<1>, char_c<1>, long_c<1>), id), size_c<3>
  767. ));
  768. BOOST_HANA_CONSTANT_CHECK(equal(
  769. count_if(list(int_c<1>, char_c<1>, long_c<0>), id), size_c<2>
  770. ));
  771. BOOST_HANA_CONSTANT_CHECK(equal(
  772. count_if(list(int_c<1>, char_c<0>, long_c<1>), id), size_c<2>
  773. ));
  774. BOOST_HANA_CONSTANT_CHECK(equal(
  775. count_if(list(int_c<1>, char_c<0>, long_c<0>), id), size_c<1>
  776. ));
  777. BOOST_HANA_CONSTANT_CHECK(equal(
  778. count_if(list(int_c<0>, char_c<1>, long_c<1>), id), size_c<2>
  779. ));
  780. BOOST_HANA_CONSTANT_CHECK(equal(
  781. count_if(list(int_c<0>, char_c<1>, long_c<0>), id), size_c<1>
  782. ));
  783. BOOST_HANA_CONSTANT_CHECK(equal(
  784. count_if(list(int_c<0>, char_c<0>, long_c<1>), id), size_c<1>
  785. ));
  786. BOOST_HANA_CONSTANT_CHECK(equal(
  787. count_if(list(int_c<0>, char_c<0>, long_c<0>), id), size_c<0>
  788. ));
  789. BOOST_HANA_CONSTEXPR_CHECK(equal(
  790. count_if(list(int{1}), id), 1u
  791. ));
  792. BOOST_HANA_CONSTEXPR_CHECK(equal(
  793. count_if(list(int{0}), id), 0u
  794. ));
  795. BOOST_HANA_CONSTEXPR_CHECK(equal(
  796. count_if(list(int{1}, char{1}), id), 2u
  797. ));
  798. BOOST_HANA_CONSTEXPR_CHECK(equal(
  799. count_if(list(int{1}, char{0}), id), 1u
  800. ));
  801. BOOST_HANA_CONSTEXPR_CHECK(equal(
  802. count_if(list(int{0}, char{1}), id), 1u
  803. ));
  804. BOOST_HANA_CONSTEXPR_CHECK(equal(
  805. count_if(list(int{0}, char{0}), id), 0u
  806. ));
  807. BOOST_HANA_CONSTEXPR_CHECK(equal(
  808. count_if(list(int{1}, char{1}, double{1}), id), 3u
  809. ));
  810. BOOST_HANA_CONSTEXPR_CHECK(equal(
  811. count_if(list(int{1}, char{1}, double{0}), id), 2u
  812. ));
  813. BOOST_HANA_CONSTEXPR_CHECK(equal(
  814. count_if(list(int{1}, char{0}, double{1}), id), 2u
  815. ));
  816. BOOST_HANA_CONSTEXPR_CHECK(equal(
  817. count_if(list(int{1}, char{0}, double{0}), id), 1u
  818. ));
  819. BOOST_HANA_CONSTEXPR_CHECK(equal(
  820. count_if(list(int{0}, char{1}, double{1}), id), 2u
  821. ));
  822. BOOST_HANA_CONSTEXPR_CHECK(equal(
  823. count_if(list(int{0}, char{1}, double{0}), id), 1u
  824. ));
  825. BOOST_HANA_CONSTEXPR_CHECK(equal(
  826. count_if(list(int{0}, char{0}, double{1}), id), 1u
  827. ));
  828. BOOST_HANA_CONSTEXPR_CHECK(equal(
  829. count_if(list(int{0}, char{0}, double{0}), id), 0u
  830. ));
  831. BOOST_HANA_CONSTEXPR_LAMBDA auto is_even = [](auto x) {
  832. return x % 2 == 0;
  833. };
  834. BOOST_HANA_CONSTEXPR_CHECK(equal(
  835. count_if(list(), is_even), 0u
  836. ));
  837. BOOST_HANA_CONSTEXPR_CHECK(equal(
  838. count_if(list(1), is_even), 0u
  839. ));
  840. BOOST_HANA_CONSTEXPR_CHECK(equal(
  841. count_if(list(2), is_even), 1u
  842. ));
  843. BOOST_HANA_CONSTEXPR_CHECK(equal(
  844. count_if(list(1, 2), is_even), 1u
  845. ));
  846. BOOST_HANA_CONSTEXPR_CHECK(equal(
  847. count_if(list(1, 2, 3), is_even), 1u
  848. ));
  849. BOOST_HANA_CONSTEXPR_CHECK(equal(
  850. count_if(list(1, 2, 3, 4), is_even), 2u
  851. ));
  852. //////////////////////////////////////////////////////////////////
  853. // count
  854. //////////////////////////////////////////////////////////////////
  855. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  856. hana::count(list(), undefined{}),
  857. size_c<0>
  858. ));
  859. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  860. hana::count(list(ct_eq<0>{}), undefined{}),
  861. size_c<0>
  862. ));
  863. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  864. hana::count(list(ct_eq<0>{}), ct_eq<0>{}),
  865. size_c<1>
  866. ));
  867. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  868. hana::count(list(ct_eq<0>{}, ct_eq<1>{}), undefined{}),
  869. size_c<0>
  870. ));
  871. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  872. hana::count(list(ct_eq<0>{}, ct_eq<1>{}), ct_eq<0>{}),
  873. size_c<1>
  874. ));
  875. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  876. hana::count(list(ct_eq<0>{}, ct_eq<1>{}), ct_eq<1>{}),
  877. size_c<1>
  878. ));
  879. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  880. hana::count(list(ct_eq<0>{}, ct_eq<0>{}), ct_eq<0>{}),
  881. size_c<2>
  882. ));
  883. //////////////////////////////////////////////////////////////////
  884. // product
  885. //////////////////////////////////////////////////////////////////
  886. BOOST_HANA_CONSTANT_CHECK(equal(
  887. product<integral_constant_tag<int>>(list()),
  888. int_c<1>
  889. ));
  890. BOOST_HANA_CONSTANT_CHECK(equal(
  891. product<integral_constant_tag<int>>(list(int_c<2>)),
  892. int_c<2>
  893. ));
  894. BOOST_HANA_CONSTANT_CHECK(equal(
  895. product<integral_constant_tag<int>>(list(int_c<2>, int_c<3>)),
  896. int_c<2 * 3>
  897. ));
  898. BOOST_HANA_CONSTANT_CHECK(equal(
  899. product<integral_constant_tag<int>>(list(int_c<2>, int_c<3>, int_c<4>)),
  900. int_c<2 * 3 * 4>
  901. ));
  902. BOOST_HANA_CONSTANT_CHECK(equal(
  903. product<integral_constant_tag<int>>(list(int_c<2>, int_c<3>, int_c<4>, int_c<5>)),
  904. int_c<2 * 3 * 4 * 5>
  905. ));
  906. BOOST_HANA_CONSTANT_CHECK(equal(
  907. product<integral_constant_tag<unsigned long>>(list()),
  908. ulong_c<1>
  909. ));
  910. BOOST_HANA_CONSTANT_CHECK(equal(
  911. product<integral_constant_tag<unsigned long>>(list(ulong_c<2>, ulong_c<3>, ulong_c<4>)),
  912. ulong_c<2 * 3 * 4>
  913. ));
  914. BOOST_HANA_CONSTEXPR_CHECK(equal(
  915. product<int>(list(2)),
  916. 2
  917. ));
  918. BOOST_HANA_CONSTEXPR_CHECK(equal(
  919. product<int>(list(2, 3)),
  920. 2 * 3
  921. ));
  922. BOOST_HANA_CONSTEXPR_CHECK(equal(
  923. product<int>(list(2, 3, 4)),
  924. 2 * 3 * 4
  925. ));
  926. BOOST_HANA_CONSTEXPR_CHECK(equal(
  927. product<int>(list(2, 3, 4, 5)),
  928. 2 * 3 * 4 * 5
  929. ));
  930. //////////////////////////////////////////////////////////////////
  931. // sum
  932. //////////////////////////////////////////////////////////////////
  933. BOOST_HANA_CONSTANT_CHECK(equal(
  934. sum<integral_constant_tag<int>>(list()),
  935. int_c<0>
  936. ));
  937. BOOST_HANA_CONSTANT_CHECK(equal(
  938. sum<integral_constant_tag<int>>(list(int_c<1>)),
  939. int_c<1>
  940. ));
  941. BOOST_HANA_CONSTANT_CHECK(equal(
  942. sum<integral_constant_tag<int>>(list(int_c<1>, int_c<2>)),
  943. int_c<1 + 2>
  944. ));
  945. BOOST_HANA_CONSTANT_CHECK(equal(
  946. sum<integral_constant_tag<int>>(list(int_c<1>, int_c<2>, int_c<3>)),
  947. int_c<1 + 2 + 3>
  948. ));
  949. BOOST_HANA_CONSTANT_CHECK(equal(
  950. sum<integral_constant_tag<int>>(list(int_c<1>, int_c<2>, int_c<3>, int_c<4>)),
  951. int_c<1 + 2 + 3 + 4>
  952. ));
  953. BOOST_HANA_CONSTANT_CHECK(equal(
  954. sum<integral_constant_tag<unsigned long>>(list()),
  955. ulong_c<0>
  956. ));
  957. BOOST_HANA_CONSTANT_CHECK(equal(
  958. sum<integral_constant_tag<unsigned long>>(list(ulong_c<1>, ulong_c<2>, ulong_c<3>)),
  959. ulong_c<1 + 2 + 3>
  960. ));
  961. BOOST_HANA_CONSTEXPR_CHECK(equal(
  962. sum<int>(list(1)), 1
  963. ));
  964. BOOST_HANA_CONSTEXPR_CHECK(equal(
  965. sum<int>(list(1, 2)), 1 + 2
  966. ));
  967. BOOST_HANA_CONSTEXPR_CHECK(equal(
  968. sum<int>(list(1, 2, 3)), 1 + 2 + 3
  969. ));
  970. BOOST_HANA_CONSTEXPR_CHECK(equal(
  971. sum<int>(list(1, 2, 3, 4)), 1 + 2 + 3 + 4
  972. ));
  973. //////////////////////////////////////////////////////////////////
  974. // unpack
  975. //////////////////////////////////////////////////////////////////
  976. BOOST_HANA_CONSTANT_CHECK(equal(
  977. unpack(list(), f),
  978. f()
  979. ));
  980. BOOST_HANA_CONSTANT_CHECK(equal(
  981. unpack(list(x<0>{}), f),
  982. f(x<0>{})
  983. ));
  984. BOOST_HANA_CONSTANT_CHECK(equal(
  985. unpack(list(x<0>{}, x<1>{}), f),
  986. f(x<0>{}, x<1>{})
  987. ));
  988. BOOST_HANA_CONSTANT_CHECK(equal(
  989. unpack(list(x<0>{}, x<1>{}, x<2>{}), f),
  990. f(x<0>{}, x<1>{}, x<2>{})
  991. ));
  992. BOOST_HANA_CONSTANT_CHECK(equal(
  993. unpack(list(x<0>{}, x<1>{}, x<2>{}, x<3>{}), f),
  994. f(x<0>{}, x<1>{}, x<2>{}, x<3>{})
  995. ));
  996. }
  997. };
  998. }}} // end namespace boost::hana::test
  999. #endif // !BOOST_HANA_TEST_LAWS_FOLDABLE_HPP