drop_exactly.cpp 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  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_exactly.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. auto rng0 = rgi | views::drop_exactly(6);
  29. has_type<int &>(*begin(rng0));
  30. CPP_assert(view_<decltype(rng0)>);
  31. CPP_assert(common_range<decltype(rng0)>);
  32. CPP_assert(sized_range<decltype(rng0)>);
  33. CPP_assert(random_access_iterator<decltype(begin(rng0))>);
  34. ::check_equal(rng0, {6, 7, 8, 9, 10});
  35. CHECK(size(rng0) == 5u);
  36. auto rng1 = rng0 | views::reverse;
  37. has_type<int &>(*begin(rng1));
  38. CPP_assert(view_<decltype(rng1)>);
  39. CPP_assert(common_range<decltype(rng1)>);
  40. CPP_assert(sized_range<decltype(rng1)>);
  41. CPP_assert(random_access_iterator<decltype(begin(rng1))>);
  42. ::check_equal(rng1, {10, 9, 8, 7, 6});
  43. std::vector<int> v{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
  44. auto rng2 = v | views::drop_exactly(6) | views::reverse;
  45. has_type<int &>(*begin(rng2));
  46. CPP_assert(view_<decltype(rng2)>);
  47. CPP_assert(common_range<decltype(rng2)>);
  48. CPP_assert(sized_range<decltype(rng2)>);
  49. CPP_assert(random_access_iterator<decltype(begin(rng2))>);
  50. ::check_equal(rng2, {10, 9, 8, 7, 6});
  51. std::list<int> l{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
  52. auto rng3 = l | views::drop_exactly(6);
  53. has_type<int &>(*begin(rng3));
  54. CPP_assert(view_<decltype(rng3)>);
  55. CPP_assert(common_range<decltype(rng3)>);
  56. CPP_assert(sized_range<decltype(rng3)>);
  57. CPP_assert(bidirectional_iterator<decltype(begin(rng3))>);
  58. CPP_assert(!random_access_iterator<decltype(begin(rng3))>);
  59. ::check_equal(rng3, {6, 7, 8, 9, 10});
  60. auto rng4 = views::iota(10) | views::drop_exactly(10);
  61. CPP_assert(view_<decltype(rng4)>);
  62. CPP_assert(!common_range<decltype(rng4)>);
  63. CPP_assert(!sized_range<decltype(rng4)>);
  64. static_assert(ranges::is_infinite<decltype(rng4)>::value, "");
  65. auto b = ranges::begin(rng4);
  66. CHECK(*b == 20);
  67. CHECK(*(b+1) == 21);
  68. auto rng5 = views::iota(10) | views::drop_exactly(10) | views::take(10) | views::reverse;
  69. CPP_assert(view_<decltype(rng5)>);
  70. CPP_assert(common_range<decltype(rng5)>);
  71. CPP_assert(sized_range<decltype(rng5)>);
  72. static_assert(!ranges::is_infinite<decltype(rng5)>::value, "");
  73. ::check_equal(rng5, {29, 28, 27, 26, 25, 24, 23, 22, 21, 20});
  74. CHECK(size(rng5) == 10u);
  75. {
  76. // drop_exactly should work with random-access mutable-only Views.
  77. auto odds = views::iota(0) |
  78. views::chunk(2) |
  79. views::transform(views::drop_exactly(1)) |
  80. views::join;
  81. (void)odds;
  82. }
  83. {
  84. auto rng = debug_input_view<int const>{rgi} | views::drop_exactly(5);
  85. using Rng = decltype(rng);
  86. CPP_assert(input_range<Rng> && view_<Rng>);
  87. CPP_assert(sized_range<Rng>);
  88. ::check_equal(rng, {5,6,7,8,9,10});
  89. }
  90. return test_result();
  91. }