github_221.cpp 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452
  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. #include <boost/hana/adjust_if.hpp>
  5. #include <boost/hana/all_of.hpp>
  6. #include <boost/hana/any_of.hpp>
  7. #include <boost/hana/assert.hpp>
  8. #include <boost/hana/count_if.hpp>
  9. #include <boost/hana/drop_while.hpp>
  10. #include <boost/hana/equal.hpp>
  11. #include <boost/hana/ext/std/tuple.hpp>
  12. #include <boost/hana/filter.hpp>
  13. #include <boost/hana/find_if.hpp>
  14. #include <boost/hana/functional/id.hpp>
  15. #include <boost/hana/functional/partial.hpp>
  16. #include <boost/hana/group.hpp>
  17. #include <boost/hana/integral_constant.hpp>
  18. #include <boost/hana/lexicographical_compare.hpp>
  19. #include <boost/hana/maximum.hpp>
  20. #include <boost/hana/minimum.hpp>
  21. #include <boost/hana/none_of.hpp>
  22. #include <boost/hana/optional.hpp>
  23. #include <boost/hana/partition.hpp>
  24. #include <boost/hana/plus.hpp>
  25. #include <boost/hana/remove_if.hpp>
  26. #include <boost/hana/replace_if.hpp>
  27. #include <boost/hana/sort.hpp>
  28. #include <boost/hana/span.hpp>
  29. #include <boost/hana/take_while.hpp>
  30. #include <boost/hana/tuple.hpp>
  31. #include <boost/hana/unique.hpp>
  32. #include <boost/hana/while.hpp>
  33. namespace hana = boost::hana;
  34. constexpr auto increment = hana::partial(hana::plus, hana::int_c<1>);
  35. int main() {
  36. // adjust_if
  37. {
  38. constexpr auto x = hana::adjust_if(hana::make_tuple(hana::int_c<0>), hana::id, increment);
  39. BOOST_HANA_CONSTANT_CHECK(hana::equal(x, hana::make_tuple(hana::int_c<0>)));
  40. constexpr auto y = hana::adjust_if(hana::make_tuple(hana::int_c<1>), hana::id, increment);
  41. BOOST_HANA_CONSTANT_CHECK(hana::equal(y, hana::make_tuple(hana::int_c<2>)));
  42. constexpr auto z = hana::adjust_if(hana::make_tuple(hana::int_c<3>), hana::id, increment);
  43. BOOST_HANA_CONSTANT_CHECK(hana::equal(z, hana::make_tuple(hana::int_c<4>)));
  44. constexpr auto l = hana::adjust_if(hana::tuple_c<int, 3>, hana::id, increment);
  45. BOOST_HANA_CONSTANT_CHECK(hana::equal(l, hana::make_tuple(hana::int_c<4>)));
  46. }
  47. {
  48. // test with lvalue
  49. constexpr auto x = hana::adjust_if(hana::tuple_c<int, 3>, hana::id, increment);
  50. BOOST_HANA_CONSTANT_CHECK(hana::equal(x, hana::make_tuple(hana::int_c<4>)));
  51. }
  52. // all_of
  53. {
  54. BOOST_HANA_CONSTANT_CHECK(!hana::all_of(hana::make_tuple(hana::int_c<0>), hana::id));
  55. BOOST_HANA_CONSTANT_CHECK(hana::all_of(hana::make_tuple(hana::int_c<1>), hana::id));
  56. BOOST_HANA_CONSTANT_CHECK(hana::all_of(hana::make_tuple(hana::int_c<3>), hana::id));
  57. // test with lvalue
  58. BOOST_HANA_CONSTANT_CHECK(hana::all_of(hana::tuple_c<int, 3>, hana::id));
  59. }
  60. // any_of
  61. {
  62. BOOST_HANA_CONSTANT_CHECK(!hana::any_of(hana::make_tuple(hana::int_c<0>), hana::id));
  63. BOOST_HANA_CONSTANT_CHECK(hana::any_of(hana::make_tuple(hana::int_c<1>), hana::id));
  64. BOOST_HANA_CONSTANT_CHECK(hana::any_of(hana::make_tuple(hana::int_c<3>), hana::id));
  65. // test with lvalue
  66. BOOST_HANA_CONSTANT_CHECK(hana::any_of(hana::tuple_c<int, 3>, hana::id));
  67. }
  68. // count_if
  69. {
  70. constexpr auto x = hana::count_if(hana::make_tuple(hana::int_c<0>), hana::id);
  71. BOOST_HANA_CONSTANT_CHECK(hana::equal(x, hana::size_c<0>));
  72. constexpr auto y = hana::count_if(hana::make_tuple(hana::int_c<1>), hana::id);
  73. BOOST_HANA_CONSTANT_CHECK(hana::equal(y, hana::size_c<1>));
  74. constexpr auto z = hana::count_if(hana::make_tuple(hana::int_c<3>), hana::id);
  75. BOOST_HANA_CONSTANT_CHECK(hana::equal(z, hana::size_c<1>));
  76. }
  77. {
  78. // test with lvalue
  79. constexpr auto x = hana::count_if(hana::tuple_c<int, 3>, hana::id);
  80. BOOST_HANA_CONSTANT_CHECK(hana::equal(x, hana::size_c<1>));
  81. }
  82. // drop_while
  83. {
  84. constexpr auto x = hana::drop_while(
  85. hana::make_tuple(hana::int_c<0>), hana::id
  86. );
  87. BOOST_HANA_CONSTANT_CHECK(hana::equal(x,
  88. hana::make_tuple(hana::int_c<0>)
  89. )
  90. );
  91. constexpr auto y = hana::drop_while(
  92. hana::make_tuple(hana::int_c<1>, hana::int_c<3>, hana::int_c<0>), hana::id
  93. );
  94. BOOST_HANA_CONSTANT_CHECK(hana::equal(y,
  95. hana::make_tuple(hana::int_c<0>)
  96. )
  97. );
  98. }
  99. {
  100. // test with lvalue
  101. constexpr auto x = hana::drop_while(
  102. hana::tuple_c<int, 1, 3, 0>, hana::id
  103. );
  104. BOOST_HANA_CONSTANT_CHECK(hana::equal(x,
  105. hana::make_tuple(hana::int_c<0>)
  106. )
  107. );
  108. }
  109. // filter
  110. {
  111. constexpr auto x = hana::filter(hana::make_tuple(hana::int_c<0>), hana::id);
  112. BOOST_HANA_CONSTANT_CHECK(hana::equal(x, hana::make_tuple()));
  113. constexpr auto y = hana::filter(hana::make_tuple(hana::int_c<1>), hana::id);
  114. BOOST_HANA_CONSTANT_CHECK(hana::equal(y, hana::make_tuple(hana::int_c<1>)));
  115. constexpr auto z = hana::filter(hana::make_tuple(hana::int_c<3>), hana::id);
  116. BOOST_HANA_CONSTANT_CHECK(hana::equal(z, hana::make_tuple(hana::int_c<3>)));
  117. }
  118. {
  119. // test with lvalue
  120. constexpr auto x = hana::filter(hana::tuple_c<int, 3>, hana::id);
  121. BOOST_HANA_CONSTANT_CHECK(hana::equal(x, hana::make_tuple(hana::int_c<3>)));
  122. }
  123. // find_if
  124. {
  125. constexpr auto x = hana::find_if(hana::make_tuple(hana::int_c<0>), hana::id);
  126. BOOST_HANA_CONSTANT_CHECK(hana::equal(x, hana::nothing));
  127. constexpr auto y = hana::find_if(hana::make_tuple(hana::int_c<1>), hana::id);
  128. BOOST_HANA_CONSTANT_CHECK(hana::equal(y, hana::just(hana::int_c<1>)));
  129. constexpr auto z = hana::find_if(hana::make_tuple(hana::int_c<3>), hana::id);
  130. BOOST_HANA_CONSTANT_CHECK(hana::equal(z, hana::just(hana::int_c<3>)));
  131. }
  132. {
  133. // test with lvalue
  134. constexpr auto z = hana::find_if(hana::tuple_c<int, 3>, hana::id);
  135. BOOST_HANA_CONSTANT_CHECK(hana::equal(z, hana::just(hana::int_c<3>)));
  136. }
  137. {
  138. // test with std::tuple (for default implementation of find_if)
  139. constexpr auto x = hana::find_if(std::make_tuple(hana::int_c<0>), hana::id);
  140. BOOST_HANA_CONSTANT_CHECK(hana::equal(x, hana::nothing));
  141. constexpr auto y = hana::find_if(std::make_tuple(hana::int_c<1>), hana::id);
  142. BOOST_HANA_CONSTANT_CHECK(hana::equal(y, hana::just(hana::int_c<1>)));
  143. constexpr auto z = hana::find_if(std::make_tuple(hana::int_c<3>), hana::id);
  144. BOOST_HANA_CONSTANT_CHECK(hana::equal(z, hana::just(hana::int_c<3>)));
  145. }
  146. {
  147. // test with lvalue
  148. constexpr auto seq = std::make_tuple(hana::int_c<3>);
  149. constexpr auto x = hana::find_if(seq, hana::id);
  150. BOOST_HANA_CONSTANT_CHECK(hana::equal(x, hana::just(hana::int_c<3>)));
  151. }
  152. // group
  153. {
  154. constexpr auto x = hana::group(
  155. hana::make_tuple(
  156. hana::int_c<0>,
  157. hana::int_c<0>,
  158. hana::int_c<1>,
  159. hana::int_c<1>,
  160. hana::int_c<2>
  161. ),
  162. hana::plus
  163. );
  164. BOOST_HANA_CONSTANT_CHECK(hana::equal(x,
  165. hana::make_tuple(
  166. hana::tuple_c<int, 0>,
  167. hana::tuple_c<int, 0, 1, 1, 2>
  168. )
  169. )
  170. );
  171. }
  172. {
  173. // test with lvalue
  174. constexpr auto x = hana::group(hana::tuple_c<int, 0, 0, 1, 1, 2>, hana::plus);
  175. BOOST_HANA_CONSTANT_CHECK(hana::equal(x,
  176. hana::make_tuple(
  177. hana::tuple_c<int, 0>,
  178. hana::tuple_c<int, 0, 1, 1, 2>
  179. )
  180. )
  181. );
  182. }
  183. // lexicographical_compare
  184. {
  185. BOOST_HANA_CONSTANT_CHECK(
  186. hana::lexicographical_compare(
  187. hana::make_tuple(hana::int_c<0>, hana::int_c<0>),
  188. hana::make_tuple(hana::int_c<0>, hana::int_c<3>),
  189. hana::plus
  190. )
  191. );
  192. }
  193. {
  194. // test with lvalue
  195. BOOST_HANA_CONSTANT_CHECK(
  196. hana::lexicographical_compare(
  197. hana::tuple_c<int, 0, 0>,
  198. hana::tuple_c<int, 0, 3>,
  199. hana::plus
  200. )
  201. );
  202. }
  203. // maximum
  204. {
  205. constexpr auto x = hana::maximum(
  206. hana::make_tuple(
  207. hana::int_c<0>,
  208. hana::int_c<0>,
  209. hana::int_c<1>,
  210. hana::int_c<3>,
  211. hana::int_c<2>
  212. ),
  213. hana::plus
  214. );
  215. BOOST_HANA_CONSTANT_CHECK(hana::equal(x, hana::int_c<2>));
  216. }
  217. {
  218. // test with lvalue
  219. constexpr auto x = hana::maximum(hana::tuple_c<int, 0, 0, 1, 3, 2>, hana::plus);
  220. BOOST_HANA_CONSTANT_CHECK(hana::equal(x, hana::int_c<2>));
  221. }
  222. // minimum
  223. {
  224. constexpr auto x = hana::minimum(
  225. hana::make_tuple(
  226. hana::int_c<0>,
  227. hana::int_c<0>,
  228. hana::int_c<1>,
  229. hana::int_c<3>,
  230. hana::int_c<2>
  231. ),
  232. hana::plus
  233. );
  234. BOOST_HANA_CONSTANT_CHECK(hana::equal(x, hana::int_c<0>));
  235. }
  236. {
  237. // test with lvalue
  238. constexpr auto x = hana::minimum(hana::tuple_c<int, 0, 0, 1, 3, 2>, hana::plus);
  239. BOOST_HANA_CONSTANT_CHECK(hana::equal(x, hana::int_c<0>));
  240. }
  241. // none_of
  242. {
  243. BOOST_HANA_CONSTANT_CHECK(hana::none_of(hana::make_tuple(hana::int_c<0>), hana::id));
  244. BOOST_HANA_CONSTANT_CHECK(!hana::none_of(hana::make_tuple(hana::int_c<1>), hana::id));
  245. BOOST_HANA_CONSTANT_CHECK(!hana::none_of(hana::make_tuple(hana::int_c<3>), hana::id));
  246. }
  247. {
  248. // test with lvalue
  249. BOOST_HANA_CONSTANT_CHECK(hana::none_of(hana::tuple_c<int, 0>, hana::id));
  250. BOOST_HANA_CONSTANT_CHECK(!hana::none_of(hana::tuple_c<int, 1>, hana::id));
  251. BOOST_HANA_CONSTANT_CHECK(!hana::none_of(hana::tuple_c<int, 3>, hana::id));
  252. }
  253. // partition
  254. {
  255. constexpr auto x = hana::partition(
  256. hana::make_tuple(
  257. hana::int_c<0>,
  258. hana::int_c<1>,
  259. hana::int_c<3>
  260. ),
  261. hana::id
  262. );
  263. BOOST_HANA_CONSTANT_CHECK(hana::equal(x,
  264. hana::make_pair(
  265. hana::tuple_c<int, 1, 3>,
  266. hana::tuple_c<int, 0>
  267. )
  268. )
  269. );
  270. }
  271. {
  272. // test with lvalue
  273. constexpr auto x = hana::partition(hana::tuple_c<int, 0, 1, 3>, hana::id);
  274. BOOST_HANA_CONSTANT_CHECK(hana::equal(x,
  275. hana::make_pair(
  276. hana::tuple_c<int, 1, 3>,
  277. hana::tuple_c<int, 0>
  278. )
  279. )
  280. );
  281. }
  282. // remove_if
  283. {
  284. constexpr auto x = hana::remove_if(hana::make_tuple(hana::int_c<0>), hana::id);
  285. BOOST_HANA_CONSTANT_CHECK(hana::equal(x, hana::make_tuple(hana::int_c<0>)));
  286. constexpr auto y = hana::remove_if(hana::make_tuple(hana::int_c<1>), hana::id);
  287. BOOST_HANA_CONSTANT_CHECK(hana::equal(y, hana::make_tuple()));
  288. constexpr auto z = hana::remove_if(hana::make_tuple(hana::int_c<3>), hana::id);
  289. BOOST_HANA_CONSTANT_CHECK(hana::equal(z, hana::make_tuple()));
  290. }
  291. {
  292. // test with lvalue
  293. constexpr auto z = hana::remove_if(hana::tuple_c<int, 3>, hana::id);
  294. BOOST_HANA_CONSTANT_CHECK(hana::equal(z, hana::make_tuple()));
  295. }
  296. // replace_if
  297. {
  298. constexpr auto x = hana::replace_if(
  299. hana::make_tuple(hana::int_c<0>),
  300. hana::id,
  301. hana::int_c<42>
  302. );
  303. BOOST_HANA_CONSTANT_CHECK(hana::equal(x, hana::make_tuple(hana::int_c<0>)));
  304. constexpr auto y = hana::replace_if(
  305. hana::make_tuple(hana::int_c<1>),
  306. hana::id,
  307. hana::int_c<42>
  308. );
  309. BOOST_HANA_CONSTANT_CHECK(hana::equal(y, hana::make_tuple(hana::int_c<42>)));
  310. constexpr auto z = hana::replace_if(
  311. hana::make_tuple(hana::int_c<3>),
  312. hana::id,
  313. hana::int_c<42>
  314. );
  315. BOOST_HANA_CONSTANT_CHECK(hana::equal(z, hana::make_tuple(hana::int_c<42>)));
  316. }
  317. {
  318. // test with lvalue
  319. constexpr auto z = hana::replace_if(
  320. hana::tuple_c<int, 3>,
  321. hana::id,
  322. hana::int_c<42>
  323. );
  324. BOOST_HANA_CONSTANT_CHECK(hana::equal(z, hana::make_tuple(hana::int_c<42>)));
  325. }
  326. // sort
  327. {
  328. constexpr auto x = hana::sort(
  329. hana::make_tuple(
  330. hana::int_c<0>,
  331. hana::int_c<1>,
  332. hana::int_c<2>
  333. ),
  334. hana::plus);
  335. BOOST_HANA_CONSTANT_CHECK(hana::equal(x, hana::tuple_c<int, 2, 1, 0>));
  336. }
  337. {
  338. // test with lvalue
  339. constexpr auto x = hana::sort(hana::tuple_c<int, 0, 1, 2>, hana::plus);
  340. BOOST_HANA_CONSTANT_CHECK(hana::equal(x, hana::tuple_c<int, 2, 1, 0>));
  341. }
  342. // span
  343. {
  344. constexpr auto x = hana::span(
  345. hana::make_tuple(
  346. hana::int_c<2>,
  347. hana::int_c<1>,
  348. hana::int_c<0>
  349. ),
  350. hana::id
  351. );
  352. BOOST_HANA_CONSTANT_CHECK(
  353. hana::equal(x,
  354. hana::make_pair(
  355. hana::tuple_c<int, 2, 1>,
  356. hana::tuple_c<int, 0>
  357. )
  358. )
  359. );
  360. }
  361. {
  362. // test with an lvalue
  363. constexpr auto x = hana::span(hana::tuple_c<int, 2, 1, 0>, hana::id);
  364. BOOST_HANA_CONSTANT_CHECK(
  365. hana::equal(x,
  366. hana::make_pair(
  367. hana::tuple_c<int, 2, 1>,
  368. hana::tuple_c<int, 0>
  369. )
  370. )
  371. );
  372. }
  373. // take_while
  374. {
  375. constexpr auto x = hana::take_while(
  376. hana::make_tuple(
  377. hana::int_c<2>,
  378. hana::int_c<1>,
  379. hana::int_c<0>
  380. ),
  381. hana::id
  382. );
  383. BOOST_HANA_CONSTANT_CHECK(hana::equal(x, hana::tuple_c<int, 2, 1>));
  384. }
  385. {
  386. // test with lvalue
  387. constexpr auto x = hana::take_while(hana::tuple_c<int, 2, 1, 0>, hana::id);
  388. BOOST_HANA_CONSTANT_CHECK(hana::equal(x, hana::tuple_c<int, 2, 1>));
  389. }
  390. // unique
  391. {
  392. constexpr auto x = hana::unique(
  393. hana::make_tuple(
  394. hana::int_c<0>,
  395. hana::int_c<0>,
  396. hana::int_c<1>,
  397. hana::int_c<2>
  398. ),
  399. hana::plus
  400. );
  401. BOOST_HANA_CONSTANT_CHECK(hana::equal(x, hana::tuple_c<int, 0, 0>));
  402. }
  403. {
  404. // test with lvalue
  405. constexpr auto x = hana::unique(hana::tuple_c<int, 0, 0, 1, 2>, hana::plus);
  406. BOOST_HANA_CONSTANT_CHECK(hana::equal(x, hana::tuple_c<int, 0, 0>));
  407. }
  408. // while
  409. {
  410. constexpr auto x = hana::while_(hana::id, hana::int_c<-3>, increment);
  411. BOOST_HANA_CONSTANT_CHECK(hana::equal(x, hana::int_c<0>));
  412. }
  413. }