slice.hpp 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  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_SLICE_HPP
  5. #define BOOST_HANA_TEST_AUTO_SLICE_HPP
  6. #include <boost/hana/assert.hpp>
  7. #include <boost/hana/equal.hpp>
  8. #include <boost/hana/integral_constant.hpp>
  9. #include <boost/hana/range.hpp>
  10. #include <boost/hana/slice.hpp>
  11. #include <boost/hana/tuple.hpp>
  12. #include "test_case.hpp"
  13. #include <laws/base.hpp>
  14. #include <support/seq.hpp>
  15. #include <cstddef>
  16. TestCase test_slice{[]{
  17. namespace hana = boost::hana;
  18. using hana::test::ct_eq;
  19. constexpr auto foldable = ::seq;
  20. struct undefined { };
  21. //////////////////////////////////////////////////////////////////////////
  22. // Test with arbitrary indices
  23. //////////////////////////////////////////////////////////////////////////
  24. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  25. hana::slice(MAKE_TUPLE(),
  26. foldable()),
  27. MAKE_TUPLE()
  28. ));
  29. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  30. hana::slice(MAKE_TUPLE(undefined{}),
  31. foldable()),
  32. MAKE_TUPLE()
  33. ));
  34. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  35. hana::slice(MAKE_TUPLE(undefined{}, undefined{}),
  36. foldable()),
  37. MAKE_TUPLE()
  38. ));
  39. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  40. hana::slice(MAKE_TUPLE(ct_eq<0>{}),
  41. foldable(hana::size_c<0>)),
  42. MAKE_TUPLE(ct_eq<0>{})
  43. ));
  44. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  45. hana::slice(MAKE_TUPLE(ct_eq<0>{}, undefined{}),
  46. foldable(hana::size_c<0>)),
  47. MAKE_TUPLE(ct_eq<0>{})
  48. ));
  49. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  50. hana::slice(MAKE_TUPLE(undefined{}, ct_eq<1>{}),
  51. foldable(hana::size_c<1>)),
  52. MAKE_TUPLE(ct_eq<1>{})
  53. ));
  54. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  55. hana::slice(MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}),
  56. foldable(hana::size_c<0>, hana::size_c<1>)),
  57. MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{})
  58. ));
  59. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  60. hana::slice(MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}),
  61. foldable(hana::size_c<1>, hana::size_c<0>)),
  62. MAKE_TUPLE(ct_eq<1>{}, ct_eq<0>{})
  63. ));
  64. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  65. hana::slice(MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}),
  66. foldable(hana::size_c<0>, hana::size_c<0>)),
  67. MAKE_TUPLE(ct_eq<0>{}, ct_eq<0>{})
  68. ));
  69. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  70. hana::slice(MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}),
  71. foldable(hana::size_c<1>, hana::size_c<1>)),
  72. MAKE_TUPLE(ct_eq<1>{}, ct_eq<1>{})
  73. ));
  74. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  75. hana::slice(MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{}),
  76. foldable(hana::size_c<0>, hana::size_c<1>, hana::size_c<2>)),
  77. MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{})
  78. ));
  79. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  80. hana::slice(MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{}),
  81. foldable(hana::size_c<0>, hana::size_c<2>, hana::size_c<1>)),
  82. MAKE_TUPLE(ct_eq<0>{}, ct_eq<2>{}, ct_eq<1>{})
  83. ));
  84. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  85. hana::slice(MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{}),
  86. foldable(hana::size_c<0>, hana::size_c<2>, hana::size_c<1>, hana::size_c<0>)),
  87. MAKE_TUPLE(ct_eq<0>{}, ct_eq<2>{}, ct_eq<1>{}, ct_eq<0>{})
  88. ));
  89. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  90. hana::slice(MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{}),
  91. foldable(hana::size_c<0>, hana::size_c<2>, hana::size_c<1>, hana::size_c<0>, hana::size_c<1>)),
  92. MAKE_TUPLE(ct_eq<0>{}, ct_eq<2>{}, ct_eq<1>{}, ct_eq<0>{}, ct_eq<1>{})
  93. ));
  94. // Try with a tuple_c
  95. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  96. hana::slice(MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{}),
  97. hana::tuple_c<unsigned, 1, 3, 2>),
  98. MAKE_TUPLE(ct_eq<1>{}, ct_eq<3>{}, ct_eq<2>{})
  99. ));
  100. //////////////////////////////////////////////////////////////////////////
  101. // Test with a `range` (check the optimization for contiguous indices)
  102. //////////////////////////////////////////////////////////////////////////
  103. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  104. hana::slice(MAKE_TUPLE(),
  105. hana::range_c<std::size_t, 0, 0>),
  106. MAKE_TUPLE()
  107. ));
  108. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  109. hana::slice(MAKE_TUPLE(undefined{}),
  110. hana::range_c<std::size_t, 0, 0>),
  111. MAKE_TUPLE()
  112. ));
  113. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  114. hana::slice(MAKE_TUPLE(undefined{}, undefined{}),
  115. hana::range_c<std::size_t, 0, 0>),
  116. MAKE_TUPLE()
  117. ));
  118. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  119. hana::slice(MAKE_TUPLE(ct_eq<0>{}),
  120. hana::range_c<std::size_t, 0, 1>),
  121. MAKE_TUPLE(ct_eq<0>{})
  122. ));
  123. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  124. hana::slice(MAKE_TUPLE(ct_eq<0>{}, undefined{}),
  125. hana::range_c<std::size_t, 0, 1>),
  126. MAKE_TUPLE(ct_eq<0>{})
  127. ));
  128. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  129. hana::slice(MAKE_TUPLE(undefined{}, ct_eq<1>{}),
  130. hana::range_c<std::size_t, 1, 2>),
  131. MAKE_TUPLE(ct_eq<1>{})
  132. ));
  133. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  134. hana::slice(MAKE_TUPLE(undefined{}, ct_eq<1>{}, undefined{}),
  135. hana::range_c<std::size_t, 1, 2>),
  136. MAKE_TUPLE(ct_eq<1>{})
  137. ));
  138. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  139. hana::slice(MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}),
  140. hana::range_c<std::size_t, 0, 2>),
  141. MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{})
  142. ));
  143. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  144. hana::slice(MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}, undefined{}),
  145. hana::range_c<std::size_t, 0, 2>),
  146. MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{})
  147. ));
  148. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  149. hana::slice(MAKE_TUPLE(undefined{}, ct_eq<1>{}, ct_eq<2>{}),
  150. hana::range_c<std::size_t, 1, 3>),
  151. MAKE_TUPLE(ct_eq<1>{}, ct_eq<2>{})
  152. ));
  153. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  154. hana::slice(MAKE_TUPLE(undefined{}, ct_eq<1>{}, ct_eq<2>{}, undefined{}),
  155. hana::range_c<std::size_t, 1, 3>),
  156. MAKE_TUPLE(ct_eq<1>{}, ct_eq<2>{})
  157. ));
  158. }};
  159. #endif // !BOOST_HANA_TEST_AUTO_SLICE_HPP