split_at.cpp 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  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/detail/variadic/split_at.hpp>
  5. #include <boost/hana/assert.hpp>
  6. #include <boost/hana/equal.hpp>
  7. #include <boost/hana/pair.hpp>
  8. #include <boost/hana/tuple.hpp>
  9. #include <laws/base.hpp>
  10. namespace hana = boost::hana;
  11. namespace vd = hana::detail::variadic;
  12. using hana::test::ct_eq;
  13. auto check = [](auto split, auto xs, auto ys) {
  14. auto result = split([](auto ...xs) {
  15. return [=](auto ...ys) {
  16. return hana::make_pair(hana::make_tuple(xs...), hana::make_tuple(ys...));
  17. };
  18. });
  19. BOOST_HANA_CONSTANT_CHECK(hana::equal(xs, hana::first(result)));
  20. BOOST_HANA_CONSTANT_CHECK(hana::equal(ys, hana::second(result)));
  21. };
  22. int main() {
  23. {
  24. check(
  25. vd::split_at<0>(),
  26. hana::make_tuple(),
  27. hana::make_tuple()
  28. );
  29. check(
  30. vd::split_at<0>(ct_eq<1>{}),
  31. hana::make_tuple(),
  32. hana::make_tuple(ct_eq<1>{})
  33. );
  34. check(
  35. vd::split_at<0>(ct_eq<1>{}, ct_eq<2>{}),
  36. hana::make_tuple(),
  37. hana::make_tuple(ct_eq<1>{}, ct_eq<2>{})
  38. );
  39. check(
  40. vd::split_at<0>(ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{}),
  41. hana::make_tuple(),
  42. hana::make_tuple(ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{})
  43. );
  44. }
  45. {
  46. check(
  47. vd::split_at<1>(ct_eq<1>{}),
  48. hana::make_tuple(ct_eq<1>{}),
  49. hana::make_tuple()
  50. );
  51. check(
  52. vd::split_at<1>(ct_eq<1>{}, ct_eq<2>{}),
  53. hana::make_tuple(ct_eq<1>{}),
  54. hana::make_tuple(ct_eq<2>{})
  55. );
  56. check(
  57. vd::split_at<1>(ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{}),
  58. hana::make_tuple(ct_eq<1>{}),
  59. hana::make_tuple(ct_eq<2>{}, ct_eq<3>{})
  60. );
  61. check(
  62. vd::split_at<1>(ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{}, ct_eq<4>{}),
  63. hana::make_tuple(ct_eq<1>{}),
  64. hana::make_tuple(ct_eq<2>{}, ct_eq<3>{}, ct_eq<4>{})
  65. );
  66. }
  67. {
  68. check(
  69. vd::split_at<2>(ct_eq<1>{}, ct_eq<2>{}),
  70. hana::make_tuple(ct_eq<1>{}, ct_eq<2>{}),
  71. hana::make_tuple()
  72. );
  73. check(
  74. vd::split_at<2>(ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{}),
  75. hana::make_tuple(ct_eq<1>{}, ct_eq<2>{}),
  76. hana::make_tuple(ct_eq<3>{})
  77. );
  78. check(
  79. vd::split_at<2>(ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{}, ct_eq<4>{}),
  80. hana::make_tuple(ct_eq<1>{}, ct_eq<2>{}),
  81. hana::make_tuple(ct_eq<3>{}, ct_eq<4>{})
  82. );
  83. check(
  84. vd::split_at<2>(ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{}, ct_eq<4>{}, ct_eq<5>{}),
  85. hana::make_tuple(ct_eq<1>{}, ct_eq<2>{}),
  86. hana::make_tuple(ct_eq<3>{}, ct_eq<4>{}, ct_eq<5>{})
  87. );
  88. }
  89. {
  90. check(
  91. vd::split_at<7>(ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{}, ct_eq<4>{}, ct_eq<5>{}, ct_eq<6>{}, ct_eq<7>{}),
  92. hana::make_tuple(ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{}, ct_eq<4>{}, ct_eq<5>{}, ct_eq<6>{}, ct_eq<7>{}),
  93. hana::make_tuple()
  94. );
  95. check(
  96. vd::split_at<7>(ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{}, ct_eq<4>{}, ct_eq<5>{}, ct_eq<6>{}, ct_eq<7>{}, ct_eq<8>{}),
  97. hana::make_tuple(ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{}, ct_eq<4>{}, ct_eq<5>{}, ct_eq<6>{}, ct_eq<7>{}),
  98. hana::make_tuple(ct_eq<8>{})
  99. );
  100. check(
  101. vd::split_at<7>(ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{}, ct_eq<4>{}, ct_eq<5>{}, ct_eq<6>{}, ct_eq<7>{}, ct_eq<8>{}, ct_eq<9>{}),
  102. hana::make_tuple(ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{}, ct_eq<4>{}, ct_eq<5>{}, ct_eq<6>{}, ct_eq<7>{}),
  103. hana::make_tuple(ct_eq<8>{}, ct_eq<9>{})
  104. );
  105. check(
  106. vd::split_at<7>(ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{}, ct_eq<4>{}, ct_eq<5>{}, ct_eq<6>{}, ct_eq<7>{}, ct_eq<8>{}, ct_eq<9>{}, ct_eq<10>{}),
  107. hana::make_tuple(ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{}, ct_eq<4>{}, ct_eq<5>{}, ct_eq<6>{}, ct_eq<7>{}),
  108. hana::make_tuple(ct_eq<8>{}, ct_eq<9>{}, ct_eq<10>{})
  109. );
  110. }
  111. {
  112. check(
  113. vd::split_at<8>(ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{}, ct_eq<4>{}, ct_eq<5>{}, ct_eq<6>{}, ct_eq<7>{}, ct_eq<8>{}),
  114. hana::make_tuple(ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{}, ct_eq<4>{}, ct_eq<5>{}, ct_eq<6>{}, ct_eq<7>{}, ct_eq<8>{}),
  115. hana::make_tuple()
  116. );
  117. check(
  118. vd::split_at<8>(ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{}, ct_eq<4>{}, ct_eq<5>{}, ct_eq<6>{}, ct_eq<7>{}, ct_eq<8>{}, ct_eq<9>{}),
  119. hana::make_tuple(ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{}, ct_eq<4>{}, ct_eq<5>{}, ct_eq<6>{}, ct_eq<7>{}, ct_eq<8>{}),
  120. hana::make_tuple(ct_eq<9>{})
  121. );
  122. check(
  123. vd::split_at<8>(ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{}, ct_eq<4>{}, ct_eq<5>{}, ct_eq<6>{}, ct_eq<7>{}, ct_eq<8>{}, ct_eq<9>{}, ct_eq<10>{}),
  124. hana::make_tuple(ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{}, ct_eq<4>{}, ct_eq<5>{}, ct_eq<6>{}, ct_eq<7>{}, ct_eq<8>{}),
  125. hana::make_tuple(ct_eq<9>{}, ct_eq<10>{})
  126. );
  127. }
  128. {
  129. check(
  130. vd::split_at<9>(ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{}, ct_eq<4>{}, ct_eq<5>{}, ct_eq<6>{}, ct_eq<7>{}, ct_eq<8>{}, ct_eq<9>{}),
  131. hana::make_tuple(ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{}, ct_eq<4>{}, ct_eq<5>{}, ct_eq<6>{}, ct_eq<7>{}, ct_eq<8>{}, ct_eq<9>{}),
  132. hana::make_tuple()
  133. );
  134. check(
  135. vd::split_at<9>(ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{}, ct_eq<4>{}, ct_eq<5>{}, ct_eq<6>{}, ct_eq<7>{}, ct_eq<8>{}, ct_eq<9>{}, ct_eq<10>{}),
  136. hana::make_tuple(ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{}, ct_eq<4>{}, ct_eq<5>{}, ct_eq<6>{}, ct_eq<7>{}, ct_eq<8>{}, ct_eq<9>{}),
  137. hana::make_tuple(ct_eq<10>{})
  138. );
  139. check(
  140. vd::split_at<9>(ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{}, ct_eq<4>{}, ct_eq<5>{}, ct_eq<6>{}, ct_eq<7>{}, ct_eq<8>{}, ct_eq<9>{}, ct_eq<10>{}, ct_eq<11>{}),
  141. hana::make_tuple(ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{}, ct_eq<4>{}, ct_eq<5>{}, ct_eq<6>{}, ct_eq<7>{}, ct_eq<8>{}, ct_eq<9>{}),
  142. hana::make_tuple(ct_eq<10>{}, ct_eq<11>{})
  143. );
  144. }
  145. }