slice.cpp 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  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 <string>
  14. #include <sstream>
  15. #include <range/v3/core.hpp>
  16. #include <range/v3/view/iota.hpp>
  17. #include <range/v3/view/istream.hpp>
  18. #include <range/v3/view/slice.hpp>
  19. #include <range/v3/view/reverse.hpp>
  20. #include <range/v3/utility/copy.hpp>
  21. #include "../simple_test.hpp"
  22. #include "../test_utils.hpp"
  23. int main()
  24. {
  25. using namespace ranges;
  26. int rgi[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
  27. auto rng0 = rgi | views::slice(3, 9);
  28. has_type<int &>(*begin(rng0));
  29. CPP_assert(view_<decltype(rng0)>);
  30. CPP_assert(common_range<decltype(rng0)>);
  31. CPP_assert(sized_range<decltype(rng0)>);
  32. CPP_assert(random_access_iterator<decltype(begin(rng0))>);
  33. ::check_equal(rng0, {3, 4, 5, 6, 7, 8});
  34. auto rng1 = rng0 | views::reverse;
  35. has_type<int &>(*begin(rng1));
  36. CPP_assert(view_<decltype(rng1)>);
  37. CPP_assert(common_range<decltype(rng1)>);
  38. CPP_assert(sized_range<decltype(rng1)>);
  39. CPP_assert(random_access_iterator<decltype(begin(rng1))>);
  40. ::check_equal(rng1, {8, 7, 6, 5, 4, 3});
  41. std::vector<int> v{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
  42. auto rng2 = v | views::slice(3, 9) | views::reverse;
  43. has_type<int &>(*begin(rng2));
  44. CPP_assert(view_<decltype(rng2)>);
  45. CPP_assert(common_range<decltype(rng2)>);
  46. CPP_assert(sized_range<decltype(rng2)>);
  47. CPP_assert(random_access_iterator<decltype(begin(rng2))>);
  48. ::check_equal(rng2, {8, 7, 6, 5, 4, 3});
  49. std::list<int> l{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
  50. auto rng3 = l | views::slice(3, 9);
  51. has_type<int &>(*begin(rng3));
  52. CPP_assert(view_<decltype(rng3)>);
  53. CPP_assert(!common_range<decltype(rng3)>);
  54. CPP_assert(sized_range<decltype(rng3)>);
  55. CPP_assert(bidirectional_iterator<decltype(begin(rng3))>);
  56. CPP_assert(!random_access_iterator<decltype(begin(rng3))>);
  57. ::check_equal(rng3, {3, 4, 5, 6, 7, 8});
  58. auto rng4 = views::iota(10) | views::slice(10, 20);
  59. CPP_assert(view_<decltype(rng4)>);
  60. CPP_assert(common_range<decltype(rng4)>);
  61. CPP_assert(sized_range<decltype(rng4)>);
  62. static_assert(!ranges::is_infinite<decltype(rng4)>::value, "");
  63. ::check_equal(rng4, {20, 21, 22, 23, 24, 25, 26, 27, 28, 29});
  64. auto rng5 = views::iota(10)[{10, 20}];
  65. CPP_assert(view_<decltype(rng5)>);
  66. CPP_assert(common_range<decltype(rng5)>);
  67. CPP_assert(sized_range<decltype(rng5)>);
  68. static_assert(!ranges::is_infinite<decltype(rng5)>::value, "");
  69. ::check_equal(rng5, {20, 21, 22, 23, 24, 25, 26, 27, 28, 29});
  70. auto rng6 = views::all(l)[{3, 9}];
  71. has_type<int &>(*begin(rng6));
  72. CPP_assert(view_<decltype(rng6)>);
  73. CPP_assert(!common_range<decltype(rng6)>);
  74. CPP_assert(sized_range<decltype(rng6)>);
  75. CPP_assert(bidirectional_iterator<decltype(begin(rng6))>);
  76. CPP_assert(!random_access_iterator<decltype(begin(rng6))>);
  77. ::check_equal(rng6, {3, 4, 5, 6, 7, 8});
  78. auto rng7 = views::all(l)[{3, end}];
  79. has_type<int &>(*begin(rng7));
  80. CPP_assert(view_<decltype(rng7)>);
  81. CPP_assert(common_range<decltype(rng7)>);
  82. CPP_assert(sized_range<decltype(rng7)>);
  83. CPP_assert(bidirectional_iterator<decltype(begin(rng7))>);
  84. CPP_assert(!random_access_iterator<decltype(begin(rng7))>);
  85. ::check_equal(rng7, {3, 4, 5, 6, 7, 8, 9, 10});
  86. auto rng8 = views::all(l)[{end-5,end-2}];
  87. has_type<int &>(*begin(rng8));
  88. CPP_assert(view_<decltype(rng8)>);
  89. CPP_assert(!common_range<decltype(rng8)>);
  90. CPP_assert(sized_range<decltype(rng8)>);
  91. CPP_assert(bidirectional_iterator<decltype(begin(rng8))>);
  92. CPP_assert(!random_access_iterator<decltype(begin(rng8))>);
  93. ::check_equal(rng8, {6, 7, 8});
  94. auto rng9 = views::iota(0)[{0,end}];
  95. static_assert(is_infinite<decltype(rng9)>::value, "should be infinite");
  96. {
  97. std::string str{"0 1 2 3 4 5 6 7 8 9"};
  98. std::stringstream sin{str};
  99. auto rng10 = istream<int>(sin)[{3,9}];
  100. ::check_equal(rng10, {3, 4, 5, 6, 7, 8});
  101. }
  102. {
  103. std::string str{"0 1 2 3 4 5 6 7 8 9"};
  104. std::stringstream sin{str};
  105. auto rng11 = istream<int>(sin)[{3,end}];
  106. ::check_equal(rng11, {3, 4, 5, 6, 7, 8, 9});
  107. }
  108. {
  109. auto letters = views::closed_iota('a','g');
  110. static_assert(random_access_range<decltype(letters)> && view_<decltype(letters)>, "");
  111. static_assert(common_range<decltype(letters)> && view_<decltype(letters)>, "");
  112. ::check_equal(letters[{2,end-2}], {'c','d','e'});
  113. }
  114. {
  115. int const some_ints[] = {0,1,2,3,4,5,6,7,8,9};
  116. auto rng = debug_input_view<int const>{some_ints} | views::slice(3,10);
  117. ::check_equal(rng, {3, 4, 5, 6, 7, 8, 9});
  118. }
  119. return test_result();
  120. }