take_exactly.cpp 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  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_exactly.hpp>
  16. #include <range/v3/view/reverse.hpp>
  17. #include <range/v3/utility/copy.hpp>
  18. #include "../simple_test.hpp"
  19. #include "../test_utils.hpp"
  20. int main()
  21. {
  22. using namespace ranges;
  23. int rgi[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
  24. auto rng0 = rgi | views::take_exactly(6);
  25. has_type<int &>(*begin(rng0));
  26. CPP_assert(view_<decltype(rng0)>);
  27. CPP_assert(common_range<decltype(rng0)>);
  28. CPP_assert(sized_range<decltype(rng0)>);
  29. CPP_assert(random_access_iterator<decltype(begin(rng0))>);
  30. ::check_equal(rng0, {0, 1, 2, 3, 4, 5});
  31. CHECK(size(rng0) == 6u);
  32. auto rng1 = rng0 | views::reverse;
  33. has_type<int &>(*begin(rng1));
  34. CPP_assert(view_<decltype(rng1)>);
  35. CPP_assert(common_range<decltype(rng1)>);
  36. CPP_assert(sized_range<decltype(rng1)>);
  37. CPP_assert(random_access_iterator<decltype(begin(rng1))>);
  38. ::check_equal(rng1, {5, 4, 3, 2, 1, 0});
  39. std::vector<int> v{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
  40. auto rng2 = v | views::take_exactly(6) | views::reverse;
  41. has_type<int &>(*begin(rng2));
  42. CPP_assert(view_<decltype(rng2)>);
  43. CPP_assert(common_range<decltype(rng2)>);
  44. CPP_assert(sized_range<decltype(rng2)>);
  45. CPP_assert(random_access_iterator<decltype(begin(rng2))>);
  46. ::check_equal(rng2, {5, 4, 3, 2, 1, 0});
  47. std::list<int> l{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
  48. auto rng3 = l | views::take_exactly(6);
  49. has_type<int &>(*begin(rng3));
  50. CPP_assert(view_<decltype(rng3)>);
  51. CPP_assert(!common_range<decltype(rng3)>);
  52. CPP_assert(sized_range<decltype(rng3)>);
  53. CPP_assert(bidirectional_iterator<decltype(begin(rng3))>);
  54. CPP_assert(!random_access_iterator<decltype(begin(rng3))>);
  55. ::check_equal(rng3, {0, 1, 2, 3, 4, 5});
  56. auto rng4 = views::iota(10) | views::take_exactly(10);
  57. CPP_assert(view_<decltype(rng4)>);
  58. CPP_assert(common_range<decltype(rng4)>);
  59. CPP_assert(sized_range<decltype(rng4)>);
  60. static_assert(!ranges::is_infinite<decltype(rng4)>::value, "");
  61. ::check_equal(rng4, {10, 11, 12, 13, 14, 15, 16, 17, 18, 19});
  62. CHECK(size(rng4) == 10u);
  63. auto rng5 = views::iota(10) | views::take_exactly(10) | views::reverse;
  64. CPP_assert(view_<decltype(rng5)>);
  65. CPP_assert(common_range<decltype(rng5)>);
  66. CPP_assert(sized_range<decltype(rng5)>);
  67. static_assert(!ranges::is_infinite<decltype(rng5)>::value, "");
  68. ::check_equal(rng5, {19, 18, 17, 16, 15, 14, 13, 12, 11, 10});
  69. CHECK(size(rng5) == 10u);
  70. {
  71. auto rng = debug_input_view<int const>{rgi} | views::take_exactly(6);
  72. ::check_equal(rng, {0, 1, 2, 3, 4, 5});
  73. }
  74. return test_result();
  75. }