drop.cpp 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  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/chunk.hpp>
  15. #include <range/v3/view/drop.hpp>
  16. #include <range/v3/view/iota.hpp>
  17. #include <range/v3/view/join.hpp>
  18. #include <range/v3/view/reverse.hpp>
  19. #include <range/v3/view/take.hpp>
  20. #include <range/v3/view/transform.hpp>
  21. #include <range/v3/utility/copy.hpp>
  22. #include "../simple_test.hpp"
  23. #include "../test_utils.hpp"
  24. int main()
  25. {
  26. using namespace ranges;
  27. int rgi[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
  28. {
  29. auto rng0 = rgi | views::drop(6);
  30. has_type<int &>(*begin(rng0));
  31. CPP_assert(view_<decltype(rng0)>);
  32. CPP_assert(common_range<decltype(rng0)>);
  33. CPP_assert(sized_range<decltype(rng0)>);
  34. CPP_assert(random_access_iterator<decltype(begin(rng0))>);
  35. ::check_equal(rng0, {6, 7, 8, 9, 10});
  36. CHECK(size(rng0) == 5u);
  37. auto rng1 = rng0 | views::reverse;
  38. has_type<int &>(*begin(rng1));
  39. CPP_assert(view_<decltype(rng1)>);
  40. CPP_assert(common_range<decltype(rng1)>);
  41. CPP_assert(sized_range<decltype(rng1)>);
  42. CPP_assert(random_access_iterator<decltype(begin(rng1))>);
  43. ::check_equal(rng1, {10, 9, 8, 7, 6});
  44. }
  45. {
  46. std::vector<int> v{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
  47. auto rng2 = v | views::drop(6) | views::reverse;
  48. has_type<int &>(*begin(rng2));
  49. CPP_assert(view_<decltype(rng2)>);
  50. CPP_assert(common_range<decltype(rng2)>);
  51. CPP_assert(sized_range<decltype(rng2)>);
  52. CPP_assert(random_access_iterator<decltype(begin(rng2))>);
  53. ::check_equal(rng2, {10, 9, 8, 7, 6});
  54. }
  55. {
  56. std::list<int> l{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
  57. auto rng3 = l | views::drop(6);
  58. has_type<int &>(*begin(rng3));
  59. CPP_assert(view_<decltype(rng3)>);
  60. CPP_assert(common_range<decltype(rng3)>);
  61. CPP_assert(sized_range<decltype(rng3)>);
  62. CPP_assert(bidirectional_iterator<decltype(begin(rng3))>);
  63. CPP_assert(!random_access_iterator<decltype(begin(rng3))>);
  64. ::check_equal(rng3, {6, 7, 8, 9, 10});
  65. }
  66. {
  67. auto rng4 = views::iota(10) | views::drop(10);
  68. CPP_assert(view_<decltype(rng4)>);
  69. CPP_assert(!common_range<decltype(rng4)>);
  70. CPP_assert(!sized_range<decltype(rng4)>);
  71. static_assert(ranges::is_infinite<decltype(rng4)>::value, "");
  72. auto b = ranges::begin(rng4);
  73. CHECK(*b == 20);
  74. CHECK(*(b+1) == 21);
  75. }
  76. {
  77. auto rng5 = views::iota(10) | views::drop(10) | views::take(10) | views::reverse;
  78. CPP_assert(view_<decltype(rng5)>);
  79. CPP_assert(common_range<decltype(rng5)>);
  80. CPP_assert(sized_range<decltype(rng5)>);
  81. static_assert(!ranges::is_infinite<decltype(rng5)>::value, "");
  82. ::check_equal(rng5, {29, 28, 27, 26, 25, 24, 23, 22, 21, 20});
  83. CHECK(size(rng5) == 10u);
  84. }
  85. {
  86. int some_ints[] = {0,1,2};
  87. auto rng = make_subrange(some_ints + 0, some_ints + 1);
  88. auto rng2 = views::drop(rng, 2);
  89. CHECK(begin(rng2) == some_ints + 1);
  90. CHECK(size(rng2) == 0u);
  91. }
  92. {
  93. // Regression test for https://github.com/ericniebler/range-v3/issues/413
  94. auto skips = [](std::vector<int> xs) {
  95. return views::ints(0, (int)xs.size())
  96. | views::transform([&](int n) {
  97. return xs | views::chunk(n + 1)
  98. | views::transform(views::drop(n))
  99. | views::join;
  100. })
  101. | to<std::vector<std::vector<int>>>();
  102. };
  103. auto skipped = skips({1,2,3,4,5,6,7,8});
  104. CHECK(skipped.size() == 8u);
  105. if(skipped.size() >= 8u)
  106. {
  107. ::check_equal(skipped[0], {1,2,3,4,5,6,7,8});
  108. ::check_equal(skipped[1], {2,4,6,8});
  109. ::check_equal(skipped[2], {3,6});
  110. ::check_equal(skipped[3], {4,8});
  111. ::check_equal(skipped[4], {5});
  112. ::check_equal(skipped[5], {6});
  113. ::check_equal(skipped[6], {7});
  114. ::check_equal(skipped[7], {8});
  115. }
  116. }
  117. {
  118. static int const some_ints[] = {0,1,2,3};
  119. auto rng = debug_input_view<int const>{some_ints} | views::drop(2);
  120. using R = decltype(rng);
  121. CPP_assert(input_range<R> && view_<R>);
  122. CPP_assert(!forward_range<R>);
  123. CPP_assert(same_as<int const&, range_reference_t<R>>);
  124. ::check_equal(rng, {2,3});
  125. }
  126. {
  127. // regression test for #728
  128. auto rng1 = views::iota(1) | views::chunk(6) | views::take(3);
  129. int i = 2;
  130. RANGES_FOR(auto o1, rng1)
  131. {
  132. auto rng2 = o1 | views::drop(1);
  133. ::check_equal(rng2, {i, i+1, i+2, i+3, i+4});
  134. i += 6;
  135. }
  136. }
  137. {
  138. // regression test for #813
  139. static int const some_ints[] = {0,1,2,3};
  140. auto rng = some_ints | views::drop(10);
  141. CHECK(empty(rng));
  142. }
  143. return test_result();
  144. }