take.cpp 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. // Range v3 library
  2. //
  3. // Copyright Eric Niebler 2014-present
  4. //
  5. // Use, modification and distribution is subject to the
  6. // Boost Software License, Version 1.0. (See accompanying
  7. // file LICENSE_1_0.txt or copy at
  8. // http://www.boost.org/LICENSE_1_0.txt)
  9. //
  10. // Project home: https://github.com/ericniebler/range-v3
  11. #include <list>
  12. #include <vector>
  13. #include <range/v3/core.hpp>
  14. #include <range/v3/view/iota.hpp>
  15. #include <range/v3/view/take.hpp>
  16. #include <range/v3/view/reverse.hpp>
  17. #include <range/v3/view/delimit.hpp>
  18. #include <range/v3/utility/copy.hpp>
  19. #include "../simple_test.hpp"
  20. #include "../test_utils.hpp"
  21. int main()
  22. {
  23. using namespace ranges;
  24. int rgi[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
  25. auto rng0 = rgi | views::take(6);
  26. has_type<int &>(*begin(rng0));
  27. CPP_assert(view_<decltype(rng0)>);
  28. CPP_assert(common_range<decltype(rng0)>);
  29. CPP_assert(sized_range<decltype(rng0)>);
  30. CPP_assert(random_access_iterator<decltype(begin(rng0))>);
  31. CPP_assert(range<decltype(detail::as_const(rng0))>);
  32. check_equal(rng0, {0, 1, 2, 3, 4, 5});
  33. CHECK(size(rng0) == 6u);
  34. auto rng0b = rgi | views::take(20);
  35. has_type<int &>(*begin(rng0b));
  36. CPP_assert(view_<decltype(rng0b)>);
  37. CPP_assert(common_range<decltype(rng0b)>);
  38. CPP_assert(sized_range<decltype(rng0b)>);
  39. CPP_assert(random_access_iterator<decltype(begin(rng0b))>);
  40. CPP_assert(range<decltype(detail::as_const(rng0b))>);
  41. check_equal(rng0b, {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10});
  42. CHECK(size(rng0b) == 11u);
  43. auto rng1 = rng0 | views::reverse;
  44. has_type<int &>(*begin(rng1));
  45. CPP_assert(view_<decltype(rng1)>);
  46. CPP_assert(common_range<decltype(rng1)>);
  47. CPP_assert(sized_range<decltype(rng1)>);
  48. CPP_assert(random_access_iterator<decltype(begin(rng1))>);
  49. CPP_assert(range<decltype(detail::as_const(rng1))>);
  50. check_equal(rng1, {5, 4, 3, 2, 1, 0});
  51. std::vector<int> v{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
  52. auto rng2 = v | views::take(6) | views::reverse;
  53. has_type<int &>(*begin(rng2));
  54. CPP_assert(view_<decltype(rng2)>);
  55. CPP_assert(common_range<decltype(rng2)>);
  56. CPP_assert(sized_range<decltype(rng2)>);
  57. CPP_assert(random_access_iterator<decltype(begin(rng2))>);
  58. CPP_assert(range<decltype(detail::as_const(rng2))>);
  59. check_equal(rng2, {5, 4, 3, 2, 1, 0});
  60. std::list<int> l{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
  61. auto rng3 = l | views::take(6);
  62. has_type<int &>(*begin(rng3));
  63. CPP_assert(view_<decltype(rng3)>);
  64. CPP_assert(!common_range<decltype(rng3)>);
  65. CPP_assert(sized_range<decltype(rng3)>);
  66. CPP_assert(bidirectional_iterator<decltype(begin(rng3))>);
  67. CPP_assert(!random_access_iterator<decltype(begin(rng3))>);
  68. CPP_assert(range<decltype(detail::as_const(rng3))>);
  69. ::check_equal(rng3, {0, 1, 2, 3, 4, 5});
  70. CHECK(size(rng3) == 6u);
  71. auto rng3b = l | views::take(20);
  72. has_type<int &>(*begin(rng3b));
  73. CPP_assert(view_<decltype(rng3b)>);
  74. CPP_assert(!common_range<decltype(rng3b)>);
  75. CPP_assert(sized_range<decltype(rng3b)>);
  76. CPP_assert(bidirectional_iterator<decltype(begin(rng3b))>);
  77. CPP_assert(!random_access_iterator<decltype(begin(rng3b))>);
  78. CPP_assert(range<decltype(detail::as_const(rng3b))>);
  79. check_equal(rng3b, {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10});
  80. CHECK(size(rng3b) == 11u);
  81. auto rng4 = views::iota(10) | views::take(10);
  82. CPP_assert(view_<decltype(rng4)>);
  83. CPP_assert(!common_range<decltype(rng4)>);
  84. CPP_assert(sized_range<decltype(rng4)>);
  85. CPP_assert(range<decltype(detail::as_const(rng4))>);
  86. static_assert(!ranges::is_infinite<decltype(rng4)>::value, "");
  87. check_equal(rng4, {10, 11, 12, 13, 14, 15, 16, 17, 18, 19});
  88. CHECK(size(rng4) == 10u);
  89. auto rng5 = views::iota(10) | views::take(10) | views::reverse;
  90. CPP_assert(view_<decltype(rng5)>);
  91. CPP_assert(common_range<decltype(rng5)>);
  92. CPP_assert(sized_range<decltype(rng5)>);
  93. CPP_assert(!range<decltype(detail::as_const(rng5))>);
  94. static_assert(!ranges::is_infinite<decltype(rng5)>::value, "");
  95. check_equal(rng5, {19, 18, 17, 16, 15, 14, 13, 12, 11, 10});
  96. CHECK(size(rng5) == 10u);
  97. auto c_str = views::delimit("hello world", '\0');
  98. CPP_assert(random_access_range<decltype(c_str)>);
  99. CPP_assert(!sized_range<decltype(c_str)>);
  100. auto rng6 = c_str | views::take(5);
  101. CPP_assert(view_<decltype(rng6)>);
  102. CPP_assert(random_access_range<decltype(rng6)>);
  103. CPP_assert(!common_range<decltype(rng6)>);
  104. CPP_assert(!sized_range<decltype(rng6)>);
  105. CPP_assert(range<decltype(detail::as_const(rng6))>);
  106. check_equal(rng6, {'h','e','l','l','o'});
  107. auto rng7 = c_str | views::take(20);
  108. check_equal(rng7, {'h','e','l','l','o',' ','w','o','r','l','d'});
  109. subrange<std::list<int>::iterator> rl{l.begin(), l.end()};
  110. CPP_assert(view_<decltype(rl)>);
  111. CPP_assert(bidirectional_range<decltype(rl)>);
  112. CPP_assert(common_range<decltype(rl)>);
  113. CPP_assert(!sized_range<decltype(rl)>);
  114. CPP_assert(range<decltype(detail::as_const(rl))>);
  115. auto rng8 = rl | views::take(5);
  116. CPP_assert(view_<decltype(rng8)>);
  117. CPP_assert(bidirectional_range<decltype(rng8)>);
  118. CPP_assert(!common_range<decltype(rng8)>);
  119. CPP_assert(!sized_range<decltype(rng8)>);
  120. CPP_assert(range<decltype(detail::as_const(rng8))>);
  121. check_equal(rng8, {0, 1, 2, 3, 4});
  122. auto rng9 = rl | views::take(20);
  123. CPP_assert(view_<decltype(rng9)>);
  124. CPP_assert(bidirectional_range<decltype(rng9)>);
  125. CPP_assert(!common_range<decltype(rng9)>);
  126. CPP_assert(!sized_range<decltype(rng9)>);
  127. CPP_assert(range<decltype(detail::as_const(rng9))>);
  128. check_equal(rng9, {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10});
  129. {
  130. auto rng = debug_input_view<int const>{rgi} | views::take(6);
  131. CPP_assert(!range<decltype(detail::as_const(rng))>);
  132. check_equal(rng, {0, 1, 2, 3, 4, 5});
  133. }
  134. return test_result();
  135. }