searchable.hpp 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611
  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_SEARCHABLE_HPP
  5. #define BOOST_HANA_TEST_LAWS_SEARCHABLE_HPP
  6. #include <boost/hana/all.hpp>
  7. #include <boost/hana/all_of.hpp>
  8. #include <boost/hana/any.hpp>
  9. #include <boost/hana/any_of.hpp>
  10. #include <boost/hana/assert.hpp>
  11. #include <boost/hana/at_key.hpp>
  12. #include <boost/hana/bool.hpp>
  13. #include <boost/hana/concat.hpp>
  14. #include <boost/hana/concept/comparable.hpp>
  15. #include <boost/hana/concept/searchable.hpp>
  16. #include <boost/hana/concept/sequence.hpp>
  17. #include <boost/hana/contains.hpp>
  18. #include <boost/hana/core/is_a.hpp>
  19. #include <boost/hana/core/when.hpp>
  20. #include <boost/hana/equal.hpp>
  21. #include <boost/hana/find.hpp>
  22. #include <boost/hana/find_if.hpp>
  23. #include <boost/hana/for_each.hpp>
  24. #include <boost/hana/functional/always.hpp>
  25. #include <boost/hana/functional/capture.hpp>
  26. #include <boost/hana/functional/compose.hpp>
  27. #include <boost/hana/functional/partial.hpp>
  28. #include <boost/hana/is_disjoint.hpp>
  29. #include <boost/hana/is_subset.hpp>
  30. #include <boost/hana/lazy.hpp>
  31. #include <boost/hana/none.hpp>
  32. #include <boost/hana/none_of.hpp>
  33. #include <boost/hana/not.hpp>
  34. #include <boost/hana/optional.hpp>
  35. #include <boost/hana/transform.hpp>
  36. #include <boost/hana/tuple.hpp>
  37. #include <laws/base.hpp>
  38. #include <support/numeric.hpp>
  39. namespace boost { namespace hana { namespace test {
  40. template <typename S, typename = when<true>>
  41. struct TestSearchable : TestSearchable<S, laws> {
  42. using TestSearchable<S, laws>::TestSearchable;
  43. };
  44. template <typename S>
  45. struct TestSearchable<S, laws> {
  46. template <typename Searchables, typename Keys>
  47. TestSearchable(Searchables searchables, Keys keys) {
  48. hana::for_each(searchables, [](auto xs) {
  49. static_assert(Searchable<decltype(xs)>{}, "");
  50. });
  51. auto predicates = hana::concat(
  52. hana::to_tuple(hana::transform(keys, equal.to)),
  53. hana::make_tuple(
  54. hana::always(false_c),
  55. hana::always(true_c)
  56. )
  57. );
  58. hana::for_each(searchables, hana::capture(searchables, keys, predicates)(
  59. [](auto searchables, auto keys, auto predicates, auto xs) {
  60. hana::for_each(predicates, hana::capture(xs)(
  61. [](auto xs, auto p) {
  62. // any_of(xs, p) <=> !all_of(xs, negated p)
  63. // <=> !none_of(xs, p)
  64. BOOST_HANA_CHECK(
  65. hana::any_of(xs, p) ^iff^
  66. hana::not_(hana::all_of(xs, hana::compose(not_, p)))
  67. );
  68. BOOST_HANA_CHECK(
  69. hana::any_of(xs, p) ^iff^
  70. hana::not_(hana::none_of(xs, p))
  71. );
  72. }));
  73. // any(xs) <=> any_of(xs, id)
  74. // all(xs) <=> all_of(xs, id)
  75. // none(xs) <=> none_of(xs, id)
  76. auto all_logicals = hana::all_of(xs, [](auto x) {
  77. return hana::bool_c<hana::Logical<decltype(x)>::value>;
  78. });
  79. only_when_(all_logicals, hana::make_lazy([](auto xs) {
  80. BOOST_HANA_CHECK(
  81. hana::any(xs) ^iff^ hana::any_of(xs, id)
  82. );
  83. BOOST_HANA_CHECK(
  84. hana::all(xs) ^iff^ hana::all_of(xs, hana::id)
  85. );
  86. BOOST_HANA_CHECK(
  87. hana::none(xs) ^iff^ hana::none_of(xs, hana::id)
  88. );
  89. })(xs));
  90. // find_if(xs, always(false_c)) == nothing
  91. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  92. hana::find_if(xs, hana::always(hana::false_c)),
  93. hana::nothing
  94. ));
  95. hana::for_each(searchables, hana::capture(xs)([](auto xs, auto ys) {
  96. // is_subset(xs, ys) <=> all_of(xs, [](auto x) { return contains(ys, x); })
  97. BOOST_HANA_CHECK(
  98. hana::is_subset(xs, ys) ^iff^
  99. hana::all_of(xs, hana::partial(hana::contains, ys))
  100. );
  101. // is_disjoint(xs, ys) <=> none_of(xs, [](auto x) { return contains(ys, x); })
  102. BOOST_HANA_CHECK(
  103. hana::is_disjoint(xs, ys) ^iff^
  104. hana::none_of(xs, hana::partial(hana::contains, ys))
  105. );
  106. }));
  107. hana::for_each(keys, hana::capture(xs)([](auto xs, auto key) {
  108. // find(xs, x) == find_if(xs, [](auto y) { return y == x; })
  109. BOOST_HANA_CHECK(hana::equal(
  110. hana::find(xs, key),
  111. hana::find_if(xs, hana::equal.to(key))
  112. ));
  113. // contains(xs, x) <=> any_of(xs, [](auto y) { return y == x; })
  114. BOOST_HANA_CHECK(
  115. hana::contains(xs, key) ^iff^
  116. hana::any_of(xs, hana::equal.to(key))
  117. );
  118. only_when_(hana::contains(xs, key),
  119. hana::make_lazy([](auto xs, auto key) {
  120. // at_key(xs, key) == find(xs, key).value()
  121. BOOST_HANA_CHECK(hana::equal(
  122. hana::at_key(xs, key),
  123. hana::find(xs, key).value()
  124. ));
  125. })(xs, key)
  126. );
  127. }));
  128. }));
  129. }
  130. };
  131. template <typename S>
  132. struct TestSearchable<S, when<Sequence<S>::value>>
  133. : TestSearchable<S, laws>
  134. {
  135. template <int i>
  136. using x = _constant<i>;
  137. template <int = 0>
  138. struct invalid { };
  139. struct undefined { };
  140. template <typename Xs, typename Keys>
  141. TestSearchable(Xs xs, Keys keys)
  142. : TestSearchable<S, laws>{xs, keys}
  143. {
  144. constexpr auto list = make<S>;
  145. BOOST_HANA_CONSTEXPR_LAMBDA auto is_even = [](auto x) {
  146. return x % 2 == 0;
  147. };
  148. auto c = numeric; // a minimal comparable
  149. auto logical = numeric;
  150. //////////////////////////////////////////////////////////////////
  151. // any_of
  152. //////////////////////////////////////////////////////////////////
  153. BOOST_HANA_CONSTANT_CHECK(
  154. hana::not_(hana::any_of(list(), equal.to(x<9>{})))
  155. );
  156. BOOST_HANA_CONSTANT_CHECK(
  157. hana::not_(hana::any_of(list(x<0>{}), equal.to(x<9>{})))
  158. );
  159. BOOST_HANA_CONSTANT_CHECK(
  160. hana::any_of(list(x<0>{}), equal.to(x<0>{}))
  161. );
  162. BOOST_HANA_CONSTANT_CHECK(
  163. hana::any_of(list(x<0>{}, invalid<1>{}), equal.to(x<0>{}))
  164. );
  165. BOOST_HANA_CONSTANT_CHECK(
  166. hana::any_of(list(x<0>{}, invalid<1>{}, invalid<2>{}), equal.to(x<0>{}))
  167. );
  168. BOOST_HANA_CONSTANT_CHECK(
  169. hana::not_(hana::any_of(list(x<0>{}, x<1>{}), equal.to(x<9>{})))
  170. );
  171. BOOST_HANA_CONSTANT_CHECK(
  172. hana::any_of(list(x<0>{}, x<1>{}), equal.to(x<1>{}))
  173. );
  174. BOOST_HANA_CONSTANT_CHECK(
  175. hana::any_of(list(x<0>{}, x<1>{}, invalid<2>{}), equal.to(x<1>{}))
  176. );
  177. BOOST_HANA_CONSTANT_CHECK(
  178. hana::any_of(list(x<0>{}, x<1>{}, invalid<2>{}, invalid<3>{}), equal.to(x<1>{}))
  179. );
  180. BOOST_HANA_CONSTANT_CHECK(
  181. hana::not_(hana::any_of(list(x<0>{}, x<1>{}, x<2>{}), equal.to(x<9>{})))
  182. );
  183. BOOST_HANA_CONSTANT_CHECK(
  184. hana::any_of(list(x<0>{}, x<1>{}, x<2>{}), equal.to(x<2>{}))
  185. );
  186. BOOST_HANA_CONSTANT_CHECK(
  187. hana::any_of(list(x<0>{}, x<1>{}, x<2>{}, nothing), equal.to(x<2>{}))
  188. );
  189. BOOST_HANA_CONSTANT_CHECK(
  190. hana::any_of(list(x<0>{}, x<1>{}, x<2>{}, nothing, nothing), equal.to(x<2>{}))
  191. );
  192. BOOST_HANA_CONSTANT_CHECK(
  193. hana::not_(hana::any_of(list(), invalid<>{}))
  194. );
  195. BOOST_HANA_CONSTEXPR_CHECK(
  196. hana::any_of(list(c(0)), equal.to(c(0)))
  197. );
  198. BOOST_HANA_CONSTEXPR_CHECK(
  199. hana::not_(hana::any_of(list(c(0)), equal.to(c(1))))
  200. );
  201. BOOST_HANA_CONSTEXPR_CHECK(
  202. hana::not_(hana::any_of(list(1), is_even))
  203. );
  204. BOOST_HANA_CONSTEXPR_CHECK(
  205. hana::any_of(list(2), is_even)
  206. );
  207. BOOST_HANA_CONSTEXPR_CHECK(
  208. hana::any_of(list(1, 2), is_even)
  209. );
  210. BOOST_HANA_CONSTEXPR_CHECK(
  211. hana::not_(hana::any_of(list(1, 3), is_even))
  212. );
  213. BOOST_HANA_CONSTEXPR_CHECK(
  214. hana::any_of(list(1, 3, 4), is_even)
  215. );
  216. //////////////////////////////////////////////////////////////////
  217. // any
  218. //////////////////////////////////////////////////////////////////
  219. BOOST_HANA_CONSTANT_CHECK(hana::not_(hana::any(list())));
  220. BOOST_HANA_CONSTEXPR_CHECK(hana::any(list(logical(true))));
  221. BOOST_HANA_CONSTEXPR_CHECK(hana::not_(hana::any(list(logical(false)))));
  222. //////////////////////////////////////////////////////////////////
  223. // all_of
  224. //////////////////////////////////////////////////////////////////
  225. BOOST_HANA_CONSTANT_CHECK(
  226. all_of(list(), invalid<>{})
  227. );
  228. BOOST_HANA_CONSTEXPR_CHECK(
  229. all_of(list(c(0)), equal.to(c(0)))
  230. );
  231. BOOST_HANA_CONSTEXPR_CHECK(
  232. not_(all_of(list(c(0)), equal.to(c(1))))
  233. );
  234. BOOST_HANA_CONSTEXPR_CHECK(not_(
  235. all_of(list(c(0), c(1)), equal.to(c(0)))
  236. ));
  237. BOOST_HANA_CONSTEXPR_CHECK(
  238. all_of(list(c(0), c(0)), equal.to(c(0)))
  239. );
  240. BOOST_HANA_CONSTEXPR_CHECK(not_(all_of(list(1), is_even)));
  241. BOOST_HANA_CONSTEXPR_CHECK(all_of(list(2), is_even));
  242. BOOST_HANA_CONSTEXPR_CHECK(all_of(list(2, 4), is_even));
  243. BOOST_HANA_CONSTEXPR_CHECK(not_(all_of(list(1, 2), is_even)));
  244. BOOST_HANA_CONSTEXPR_CHECK(not_(all_of(list(1, 3), is_even)));
  245. BOOST_HANA_CONSTEXPR_CHECK(not_(all_of(list(1, 3, 4), is_even)));
  246. //////////////////////////////////////////////////////////////////
  247. // all
  248. //////////////////////////////////////////////////////////////////
  249. BOOST_HANA_CONSTANT_CHECK(all(list()));
  250. BOOST_HANA_CONSTEXPR_CHECK(all(list(logical(true))));
  251. BOOST_HANA_CONSTEXPR_CHECK(not_(all(list(logical(false)))));
  252. BOOST_HANA_CONSTEXPR_CHECK(all(list(logical(true), logical(true))));
  253. BOOST_HANA_CONSTEXPR_CHECK(not_(all(list(logical(true), logical(false)))));
  254. //////////////////////////////////////////////////////////////////
  255. // none_of
  256. //////////////////////////////////////////////////////////////////
  257. BOOST_HANA_CONSTANT_CHECK(none_of(list(), invalid<>{}));
  258. BOOST_HANA_CONSTEXPR_CHECK(none_of(list(c(0)), equal.to(c(1))));
  259. BOOST_HANA_CONSTEXPR_CHECK(not_(none_of(list(c(0)), equal.to(c(0)))));
  260. BOOST_HANA_CONSTEXPR_CHECK(none_of(list(1), is_even));
  261. BOOST_HANA_CONSTEXPR_CHECK(not_(none_of(list(2), is_even)));
  262. BOOST_HANA_CONSTEXPR_CHECK(not_(none_of(list(1, 2), is_even)));
  263. BOOST_HANA_CONSTEXPR_CHECK(none_of(list(1, 3), is_even));
  264. BOOST_HANA_CONSTEXPR_CHECK(not_(none_of(list(1, 3, 4), is_even)));
  265. //////////////////////////////////////////////////////////////////
  266. // none
  267. //////////////////////////////////////////////////////////////////
  268. BOOST_HANA_CONSTANT_CHECK(none(list()));
  269. BOOST_HANA_CONSTEXPR_CHECK(none(list(logical(false))));
  270. BOOST_HANA_CONSTEXPR_CHECK(not_(none(list(logical(true)))));
  271. //////////////////////////////////////////////////////////////////
  272. // find_if
  273. //////////////////////////////////////////////////////////////////
  274. {
  275. BOOST_HANA_CONSTANT_CHECK(equal(
  276. find_if(list(), equal.to(x<9>{})),
  277. nothing
  278. ));
  279. BOOST_HANA_CONSTANT_CHECK(equal(
  280. find_if(list(x<0>{}), equal.to(x<9>{})),
  281. nothing
  282. ));
  283. BOOST_HANA_CONSTANT_CHECK(equal(
  284. find_if(list(x<0>{}), equal.to(x<0>{})),
  285. just(x<0>{})
  286. ));
  287. BOOST_HANA_CONSTANT_CHECK(equal(
  288. find_if(list(x<0>{}, invalid<1>{}), equal.to(x<0>{})),
  289. just(x<0>{})
  290. ));
  291. BOOST_HANA_CONSTANT_CHECK(equal(
  292. find_if(list(x<0>{}, invalid<1>{}, invalid<2>{}), equal.to(x<0>{})),
  293. just(x<0>{})
  294. ));
  295. BOOST_HANA_CONSTANT_CHECK(equal(
  296. find_if(list(x<0>{}, x<1>{}), equal.to(x<9>{})),
  297. nothing
  298. ));
  299. BOOST_HANA_CONSTANT_CHECK(equal(
  300. find_if(list(x<0>{}, x<1>{}), equal.to(x<1>{})),
  301. just(x<1>{})
  302. ));
  303. BOOST_HANA_CONSTANT_CHECK(equal(
  304. find_if(list(x<0>{}, x<1>{}, invalid<2>{}), equal.to(x<1>{})),
  305. just(x<1>{})
  306. ));
  307. BOOST_HANA_CONSTANT_CHECK(equal(
  308. find_if(list(x<0>{}, x<1>{}, invalid<2>{}, invalid<3>{}), equal.to(x<1>{})),
  309. just(x<1>{})
  310. ));
  311. BOOST_HANA_CONSTANT_CHECK(equal(
  312. find_if(list(x<0>{}, x<1>{}, x<2>{}), equal.to(x<9>{})),
  313. nothing
  314. ));
  315. BOOST_HANA_CONSTANT_CHECK(equal(
  316. find_if(list(x<0>{}, x<1>{}, x<2>{}), equal.to(x<2>{})),
  317. just(x<2>{})
  318. ));
  319. BOOST_HANA_CONSTANT_CHECK(equal(
  320. find_if(list(x<0>{}, x<1>{}, x<2>{}, nothing), equal.to(x<2>{})),
  321. just(x<2>{})
  322. ));
  323. BOOST_HANA_CONSTANT_CHECK(equal(
  324. find_if(list(x<0>{}, x<1>{}, x<2>{}, nothing, nothing), equal.to(x<2>{})),
  325. just(x<2>{})
  326. ));
  327. // Make sure find_if works with an lvalue sequence. hana::tuple
  328. // used to have a bug that broke this.
  329. auto const const_lvalue = list(x<0>{}, x<1>{}, x<2>{});
  330. BOOST_HANA_CONSTANT_CHECK(equal(
  331. find_if(const_lvalue, equal.to(x<1>{})),
  332. just(x<1>{})
  333. ));
  334. auto lvalue = list(x<0>{}, x<1>{}, x<2>{});
  335. BOOST_HANA_CONSTANT_CHECK(equal(
  336. find_if(lvalue, equal.to(x<1>{})),
  337. just(x<1>{})
  338. ));
  339. }
  340. //////////////////////////////////////////////////////////////////
  341. // find
  342. //////////////////////////////////////////////////////////////////
  343. {
  344. BOOST_HANA_CONSTANT_CHECK(equal(
  345. find(list(), invalid<>{}),
  346. nothing
  347. ));
  348. BOOST_HANA_CONSTANT_CHECK(equal(
  349. find(list(x<0>{}), x<9>{}),
  350. nothing
  351. ));
  352. BOOST_HANA_CONSTANT_CHECK(equal(
  353. find(list(x<0>{}), x<0>{}),
  354. just(x<0>{})
  355. ));
  356. BOOST_HANA_CONSTANT_CHECK(equal(
  357. find(list(x<0>{}, invalid<1>{}), x<0>{}),
  358. just(x<0>{})
  359. ));
  360. BOOST_HANA_CONSTANT_CHECK(equal(
  361. find(list(x<0>{}, invalid<1>{}, invalid<2>{}), x<0>{}),
  362. just(x<0>{})
  363. ));
  364. BOOST_HANA_CONSTANT_CHECK(equal(
  365. find(list(x<0>{}, x<1>{}), x<9>{}),
  366. nothing
  367. ));
  368. BOOST_HANA_CONSTANT_CHECK(equal(
  369. find(list(x<0>{}, x<1>{}), x<1>{}),
  370. just(x<1>{})
  371. ));
  372. BOOST_HANA_CONSTANT_CHECK(equal(
  373. find(list(x<0>{}, x<1>{}, invalid<2>{}), x<1>{}),
  374. just(x<1>{})
  375. ));
  376. BOOST_HANA_CONSTANT_CHECK(equal(
  377. find(list(x<0>{}, x<1>{}, invalid<2>{}, invalid<3>{}), x<1>{}),
  378. just(x<1>{})
  379. ));
  380. BOOST_HANA_CONSTANT_CHECK(equal(
  381. find(list(x<0>{}, x<1>{}, x<2>{}), x<9>{}),
  382. nothing
  383. ));
  384. BOOST_HANA_CONSTANT_CHECK(equal(
  385. find(list(x<0>{}, x<1>{}, x<2>{}), x<2>{}),
  386. just(x<2>{})
  387. ));
  388. BOOST_HANA_CONSTANT_CHECK(equal(
  389. find(list(x<0>{}, x<1>{}, x<2>{}, nothing), x<2>{}),
  390. just(x<2>{})
  391. ));
  392. BOOST_HANA_CONSTANT_CHECK(equal(
  393. find(list(x<0>{}, x<1>{}, x<2>{}, nothing, nothing), x<2>{}),
  394. just(x<2>{})
  395. ));
  396. }
  397. //////////////////////////////////////////////////////////////////
  398. // at_key
  399. //////////////////////////////////////////////////////////////////
  400. {
  401. BOOST_HANA_CONSTANT_CHECK(equal(
  402. at_key(list(x<0>{}), x<0>{}),
  403. x<0>{}
  404. ));
  405. BOOST_HANA_CONSTANT_CHECK(equal(
  406. at_key(list(x<0>{}, x<1>{}), x<0>{}),
  407. x<0>{}
  408. ));
  409. BOOST_HANA_CONSTANT_CHECK(equal(
  410. at_key(list(x<0>{}, x<1>{}), x<1>{}),
  411. x<1>{}
  412. ));
  413. BOOST_HANA_CONSTANT_CHECK(equal(
  414. at_key(list(x<0>{}, x<1>{}, x<2>{}), x<0>{}),
  415. x<0>{}
  416. ));
  417. BOOST_HANA_CONSTANT_CHECK(equal(
  418. at_key(list(x<0>{}, x<1>{}, x<2>{}), x<1>{}),
  419. x<1>{}
  420. ));
  421. BOOST_HANA_CONSTANT_CHECK(equal(
  422. at_key(list(x<0>{}, x<1>{}, x<2>{}), x<2>{}),
  423. x<2>{}
  424. ));
  425. }
  426. //////////////////////////////////////////////////////////////////
  427. // contains
  428. //////////////////////////////////////////////////////////////////
  429. {
  430. BOOST_HANA_CONSTANT_CHECK(not_(
  431. contains(list(), undefined{})
  432. ));
  433. BOOST_HANA_CONSTANT_CHECK(not_(
  434. contains(list(x<0>{}), x<999>{})
  435. ));
  436. BOOST_HANA_CONSTANT_CHECK(
  437. contains(list(x<0>{}), x<0>{})
  438. );
  439. BOOST_HANA_CONSTANT_CHECK(
  440. contains(list(x<0>{}, x<1>{}), x<1>{})
  441. );
  442. BOOST_HANA_CONSTANT_CHECK(
  443. contains(list(x<0>{}, x<1>{}, x<3>{}), x<3>{})
  444. );
  445. BOOST_HANA_CONSTEXPR_CHECK(contains(list(c(0)), c(0)));
  446. BOOST_HANA_CONSTEXPR_CHECK(not_(contains(list(c(0)), c(1))));
  447. // infix application
  448. BOOST_HANA_CONSTANT_CHECK(
  449. list(x<0>{}, x<1>{}) ^contains^ x<1>{}
  450. );
  451. }
  452. //////////////////////////////////////////////////////////////////
  453. // in
  454. //////////////////////////////////////////////////////////////////
  455. BOOST_HANA_CONSTEXPR_CHECK(c(0) ^in^ list(c(0)));
  456. BOOST_HANA_CONSTEXPR_CHECK(not_(c(1) ^in^ list(c(0))));
  457. //////////////////////////////////////////////////////////////////
  458. // is_subset
  459. //////////////////////////////////////////////////////////////////
  460. {
  461. BOOST_HANA_CONSTANT_CHECK(is_subset(
  462. list(), list(undefined{})
  463. ));
  464. BOOST_HANA_CONSTANT_CHECK(not_(is_subset(
  465. list(undefined{}), list()
  466. )));
  467. BOOST_HANA_CONSTEXPR_CHECK(is_subset(
  468. list(c(0)), list(c(0))
  469. ));
  470. BOOST_HANA_CONSTEXPR_CHECK(is_subset(
  471. list(c(0)), list(c(0), c(1))
  472. ));
  473. BOOST_HANA_CONSTEXPR_CHECK(not_(is_subset(
  474. list(c(0)), list(c(1))
  475. )));
  476. // infix application
  477. BOOST_HANA_CONSTANT_CHECK(
  478. list(x<0>{}) ^is_subset^ list(x<1>{}, x<0>{})
  479. );
  480. BOOST_HANA_CONSTANT_CHECK(
  481. list(x<0>{}, x<1>{}) ^is_subset^ list(x<1>{}, x<0>{})
  482. );
  483. }
  484. //////////////////////////////////////////////////////////////////
  485. // is_disjoint
  486. //////////////////////////////////////////////////////////////////
  487. {
  488. BOOST_HANA_CONSTANT_CHECK(is_disjoint(
  489. list(),
  490. list()
  491. ));
  492. BOOST_HANA_CONSTANT_CHECK(is_disjoint(
  493. list(),
  494. list(undefined{})
  495. ));
  496. BOOST_HANA_CONSTANT_CHECK(is_disjoint(
  497. list(undefined{}),
  498. list()
  499. ));
  500. BOOST_HANA_CONSTANT_CHECK(is_disjoint(
  501. list(x<0>{}),
  502. list(x<1>{})
  503. ));
  504. BOOST_HANA_CONSTANT_CHECK(is_disjoint(
  505. list(x<1>{}),
  506. list(x<0>{})
  507. ));
  508. BOOST_HANA_CONSTANT_CHECK(not_(is_disjoint(
  509. list(x<0>{}),
  510. list(x<0>{})
  511. )));
  512. BOOST_HANA_CONSTANT_CHECK(not_(is_disjoint(
  513. list(x<0>{}, x<1>{}),
  514. list(x<0>{})
  515. )));
  516. BOOST_HANA_CONSTANT_CHECK(not_(is_disjoint(
  517. list(x<0>{}),
  518. list(x<0>{}, x<1>{})
  519. )));
  520. BOOST_HANA_CONSTANT_CHECK(not_(is_disjoint(
  521. list(x<1>{}, x<0>{}),
  522. list(x<0>{}, x<1>{})
  523. )));
  524. BOOST_HANA_CONSTANT_CHECK(not_(is_disjoint(
  525. list(x<0>{}, x<1>{}),
  526. list(x<1>{}, x<2>{})
  527. )));
  528. BOOST_HANA_CONSTANT_CHECK(is_disjoint(
  529. list(x<0>{}, x<1>{}),
  530. list(x<2>{}, x<3>{})
  531. ));
  532. }
  533. }
  534. };
  535. }}} // end namespace boost::hana::test
  536. #endif // !BOOST_HANA_TEST_LAWS_SEARCHABLE_HPP