any_of.hpp 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  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_ANY_OF_HPP
  5. #define BOOST_HANA_TEST_AUTO_ANY_OF_HPP
  6. #include <boost/hana/any_of.hpp>
  7. #include <boost/hana/assert.hpp>
  8. #include <boost/hana/bool.hpp>
  9. #include <boost/hana/equal.hpp>
  10. #include <boost/hana/not.hpp>
  11. #include "test_case.hpp"
  12. #include <laws/base.hpp>
  13. TestCase test_any_of{[]{
  14. namespace hana = boost::hana;
  15. using hana::test::ct_eq;
  16. BOOST_HANA_CONSTANT_CHECK(hana::not_(hana::any_of(
  17. MAKE_TUPLE(),
  18. [](auto) { return hana::true_c; }
  19. )));
  20. BOOST_HANA_CONSTANT_CHECK(hana::any_of(
  21. MAKE_TUPLE(ct_eq<0>{}),
  22. [](auto) { return hana::true_c; }
  23. ));
  24. BOOST_HANA_CONSTANT_CHECK(hana::not_(hana::any_of(
  25. MAKE_TUPLE(ct_eq<0>{}),
  26. [](auto) { return hana::false_c; }
  27. )));
  28. BOOST_HANA_CONSTANT_CHECK(hana::any_of(
  29. MAKE_TUPLE(ct_eq<0>{}),
  30. hana::equal.to(ct_eq<0>{})
  31. ));
  32. BOOST_HANA_CONSTANT_CHECK(hana::not_(hana::any_of(
  33. MAKE_TUPLE(ct_eq<0>{}),
  34. hana::equal.to(ct_eq<999>{})
  35. )));
  36. BOOST_HANA_CONSTANT_CHECK(hana::not_(hana::any_of(
  37. MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}),
  38. [](auto) { return hana::false_c; }
  39. )));
  40. BOOST_HANA_CONSTANT_CHECK(hana::any_of(
  41. MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}),
  42. [](auto) { return hana::true_c; }
  43. ));
  44. BOOST_HANA_CONSTANT_CHECK(hana::any_of(
  45. MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}),
  46. hana::equal.to(ct_eq<0>{})
  47. ));
  48. BOOST_HANA_CONSTANT_CHECK(hana::any_of(
  49. MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}),
  50. hana::equal.to(ct_eq<1>{})
  51. ));
  52. BOOST_HANA_CONSTANT_CHECK(hana::not_(hana::any_of(
  53. MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}),
  54. hana::equal.to(ct_eq<999>{})
  55. )));
  56. BOOST_HANA_CONSTANT_CHECK(hana::not_(hana::any_of(
  57. MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{}),
  58. [](auto) { return hana::false_c; }
  59. )));
  60. BOOST_HANA_CONSTANT_CHECK(hana::any_of(
  61. MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{}),
  62. [](auto) { return hana::true_c; }
  63. ));
  64. BOOST_HANA_CONSTANT_CHECK(hana::any_of(
  65. MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{}),
  66. hana::equal.to(ct_eq<0>{})
  67. ));
  68. BOOST_HANA_CONSTANT_CHECK(hana::any_of(
  69. MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{}),
  70. hana::equal.to(ct_eq<1>{})
  71. ));
  72. BOOST_HANA_CONSTANT_CHECK(hana::any_of(
  73. MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{}),
  74. hana::equal.to(ct_eq<2>{})
  75. ));
  76. BOOST_HANA_CONSTANT_CHECK(hana::not_(hana::any_of(
  77. MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{}),
  78. hana::equal.to(ct_eq<999>{})
  79. )));
  80. BOOST_HANA_CONSTANT_CHECK(hana::not_(hana::any_of(
  81. MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{}),
  82. [](auto) { return hana::false_c; }
  83. )));
  84. BOOST_HANA_CONSTANT_CHECK(hana::any_of(
  85. MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{}),
  86. [](auto) { return hana::true_c; }
  87. ));
  88. BOOST_HANA_CONSTANT_CHECK(hana::any_of(
  89. MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{}),
  90. hana::equal.to(ct_eq<0>{})
  91. ));
  92. BOOST_HANA_CONSTANT_CHECK(hana::any_of(
  93. MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{}),
  94. hana::equal.to(ct_eq<1>{})
  95. ));
  96. BOOST_HANA_CONSTANT_CHECK(hana::any_of(
  97. MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{}),
  98. hana::equal.to(ct_eq<2>{})
  99. ));
  100. BOOST_HANA_CONSTANT_CHECK(hana::any_of(
  101. MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{}),
  102. hana::equal.to(ct_eq<3>{})
  103. ));
  104. BOOST_HANA_CONSTANT_CHECK(hana::not_(hana::any_of(
  105. MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{}),
  106. hana::equal.to(ct_eq<999>{})
  107. )));
  108. BOOST_HANA_CONSTANT_CHECK(hana::not_(hana::any_of(
  109. MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{}, ct_eq<4>{}),
  110. [](auto) { return hana::false_c; }
  111. )));
  112. BOOST_HANA_CONSTANT_CHECK(hana::any_of(
  113. MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{}, ct_eq<4>{}),
  114. [](auto) { return hana::true_c; }
  115. ));
  116. BOOST_HANA_CONSTANT_CHECK(hana::any_of(
  117. MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{}, ct_eq<4>{}),
  118. hana::equal.to(ct_eq<0>{})
  119. ));
  120. BOOST_HANA_CONSTANT_CHECK(hana::any_of(
  121. MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{}, ct_eq<4>{}),
  122. hana::equal.to(ct_eq<1>{})
  123. ));
  124. BOOST_HANA_CONSTANT_CHECK(hana::any_of(
  125. MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{}, ct_eq<4>{}),
  126. hana::equal.to(ct_eq<2>{})
  127. ));
  128. BOOST_HANA_CONSTANT_CHECK(hana::any_of(
  129. MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{}, ct_eq<4>{}),
  130. hana::equal.to(ct_eq<3>{})
  131. ));
  132. BOOST_HANA_CONSTANT_CHECK(hana::any_of(
  133. MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{}, ct_eq<4>{}),
  134. hana::equal.to(ct_eq<4>{})
  135. ));
  136. BOOST_HANA_CONSTANT_CHECK(hana::not_(hana::any_of(
  137. MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{}, ct_eq<4>{}),
  138. hana::equal.to(ct_eq<999>{})
  139. )));
  140. // Make sure `any_of` short-circuits with runtime predicates
  141. // See http://stackoverflow.com/q/42012512/627587
  142. {
  143. {
  144. int counter = 0;
  145. auto tuple = MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{});
  146. hana::any_of(tuple, [&](auto) { ++counter; return true; });
  147. BOOST_HANA_RUNTIME_CHECK(counter == 1);
  148. }
  149. {
  150. int counter = 0;
  151. auto tuple = MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{});
  152. hana::any_of(tuple, [&](auto x) -> bool {
  153. ++counter;
  154. return hana::equal(x, ct_eq<1>{});
  155. });
  156. BOOST_HANA_RUNTIME_CHECK(counter == 2);
  157. }
  158. }
  159. }};
  160. #endif // !BOOST_HANA_TEST_AUTO_ANY_OF_HPP