iterate.cpp 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  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/functional/iterate.hpp>
  5. #include <boost/hana/assert.hpp>
  6. #include <boost/hana/equal.hpp>
  7. #include <laws/base.hpp>
  8. #include <vector>
  9. namespace hana = boost::hana;
  10. using hana::test::ct_eq;
  11. struct undefined { };
  12. constexpr int incr(int i) { return i + 1; }
  13. int main() {
  14. hana::test::_injection<0> f{};
  15. // "real usage" tests
  16. static_assert(hana::iterate<3>(incr, 0) == 3, "");
  17. {
  18. std::vector<int> vec;
  19. hana::iterate<10>([&](int i) { vec.push_back(i); return i + 1; }, 0);
  20. BOOST_HANA_RUNTIME_CHECK(
  21. vec == std::vector<int>{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
  22. );
  23. }
  24. // equivalence between iterate<n>(f, x) and iterate<n>(f)(x)
  25. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  26. hana::iterate<0>(undefined{})(ct_eq<0>{}),
  27. hana::iterate<0>(undefined{}, ct_eq<0>{})
  28. ));
  29. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  30. hana::iterate<4>(f)(ct_eq<0>{}),
  31. hana::iterate<4>(f, ct_eq<0>{})
  32. ));
  33. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  34. hana::iterate<10>(f)(ct_eq<0>{}),
  35. hana::iterate<10>(f, ct_eq<0>{})
  36. ));
  37. // systematic tests
  38. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  39. hana::iterate<0>(undefined{}, ct_eq<0>{}),
  40. ct_eq<0>{}
  41. ));
  42. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  43. hana::iterate<1>(f, ct_eq<0>{}),
  44. f(ct_eq<0>{})
  45. ));
  46. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  47. hana::iterate<2>(f, ct_eq<0>{}),
  48. f(f(ct_eq<0>{}))
  49. ));
  50. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  51. hana::iterate<3>(f, ct_eq<0>{}),
  52. f(f(f(ct_eq<0>{})))
  53. ));
  54. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  55. hana::iterate<4>(f, ct_eq<0>{}),
  56. f(f(f(f(ct_eq<0>{}))))
  57. ));
  58. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  59. hana::iterate<5>(f, ct_eq<0>{}),
  60. f(f(f(f(f(ct_eq<0>{})))))
  61. ));
  62. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  63. hana::iterate<6>(f, ct_eq<0>{}),
  64. f(f(f(f(f(f(ct_eq<0>{}))))))
  65. ));
  66. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  67. hana::iterate<7>(f, ct_eq<0>{}),
  68. f(f(f(f(f(f(f(ct_eq<0>{})))))))
  69. ));
  70. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  71. hana::iterate<11>(f, ct_eq<0>{}),
  72. f(f(f(f(f(f(f(f(f(f(f(ct_eq<0>{})))))))))))
  73. ));
  74. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  75. hana::iterate<12>(f, ct_eq<0>{}),
  76. f(f(f(f(f(f(f(f(f(f(f(f(ct_eq<0>{}))))))))))))
  77. ));
  78. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  79. hana::iterate<13>(f, ct_eq<0>{}),
  80. f(f(f(f(f(f(f(f(f(f(f(f(f(ct_eq<0>{})))))))))))))
  81. ));
  82. // We can't nest too many calls to f, because that uses a hana::tuple
  83. // internally and some implementation (libstdc++) have trouble with
  84. // deeply-nested calls to `std::is_constructible`, which is required by
  85. // hana::tuple. Hence, we use an homogeneous function for the remaining
  86. // tests.
  87. static_assert(hana::iterate<23>(incr, 0) == 23, "");
  88. static_assert(hana::iterate<24>(incr, 0) == 24, "");
  89. static_assert(hana::iterate<25>(incr, 0) == 25, "");
  90. static_assert(hana::iterate<26>(incr, 0) == 26, "");
  91. static_assert(hana::iterate<27>(incr, 0) == 27, "");
  92. static_assert(hana::iterate<28>(incr, 0) == 28, "");
  93. static_assert(hana::iterate<29>(incr, 0) == 29, "");
  94. static_assert(hana::iterate<30>(incr, 0) == 30, "");
  95. static_assert(hana::iterate<31>(incr, 0) == 31, "");
  96. static_assert(hana::iterate<32>(incr, 0) == 32, "");
  97. static_assert(hana::iterate<33>(incr, 0) == 33, "");
  98. static_assert(hana::iterate<34>(incr, 0) == 34, "");
  99. static_assert(hana::iterate<35>(incr, 0) == 35, "");
  100. static_assert(hana::iterate<36>(incr, 0) == 36, "");
  101. static_assert(hana::iterate<37>(incr, 0) == 37, "");
  102. static_assert(hana::iterate<38>(incr, 0) == 38, "");
  103. static_assert(hana::iterate<39>(incr, 0) == 39, "");
  104. static_assert(hana::iterate<40>(incr, 0) == 40, "");
  105. static_assert(hana::iterate<41>(incr, 0) == 41, "");
  106. static_assert(hana::iterate<42>(incr, 0) == 42, "");
  107. static_assert(hana::iterate<43>(incr, 0) == 43, "");
  108. static_assert(hana::iterate<44>(incr, 0) == 44, "");
  109. static_assert(hana::iterate<45>(incr, 0) == 45, "");
  110. static_assert(hana::iterate<46>(incr, 0) == 46, "");
  111. static_assert(hana::iterate<47>(incr, 0) == 47, "");
  112. static_assert(hana::iterate<48>(incr, 0) == 48, "");
  113. static_assert(hana::iterate<49>(incr, 0) == 49, "");
  114. static_assert(hana::iterate<50>(incr, 0) == 50, "");
  115. static_assert(hana::iterate<51>(incr, 0) == 51, "");
  116. static_assert(hana::iterate<52>(incr, 0) == 52, "");
  117. static_assert(hana::iterate<53>(incr, 0) == 53, "");
  118. static_assert(hana::iterate<54>(incr, 0) == 54, "");
  119. static_assert(hana::iterate<55>(incr, 0) == 55, "");
  120. static_assert(hana::iterate<56>(incr, 0) == 56, "");
  121. static_assert(hana::iterate<57>(incr, 0) == 57, "");
  122. static_assert(hana::iterate<58>(incr, 0) == 58, "");
  123. static_assert(hana::iterate<59>(incr, 0) == 59, "");
  124. }