common.cpp 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  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 <sstream>
  14. #include <range/v3/core.hpp>
  15. #include <range/v3/view/common.hpp>
  16. #include <range/v3/view/counted.hpp>
  17. #include <range/v3/view/delimit.hpp>
  18. #include <range/v3/view/repeat_n.hpp>
  19. #include <range/v3/utility/copy.hpp>
  20. #include "../simple_test.hpp"
  21. #include "../test_utils.hpp"
  22. int main()
  23. {
  24. using namespace ranges;
  25. {
  26. std::stringstream sinx("1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 42 6 7 8 9 ");
  27. auto rng1 = istream<int>(sinx) | views::delimit(42); // | views::common;
  28. CPP_assert(!common_range<decltype(rng1)>);
  29. CPP_assert(input_range<decltype(rng1)>);
  30. CPP_assert(!forward_range<decltype(rng1)>);
  31. auto const& crng1 = rng1;
  32. CPP_assert(!range<decltype(crng1)>);
  33. auto rng2 = rng1 | views::common;
  34. CPP_assert(view_<decltype(rng2)>);
  35. CPP_assert(common_range<decltype(rng2)>);
  36. CPP_assert(input_iterator<decltype(rng2.begin())>);
  37. CPP_assert(same_as<typename std::iterator_traits<decltype(rng2.begin())>::iterator_category,
  38. std::input_iterator_tag>);
  39. CPP_assert(!forward_iterator<decltype(rng2.begin())>);
  40. ::check_equal(rng2, {1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3, 4});
  41. }
  42. std::vector<int> v{1,2,3,4,5,6,7,8,9,0,42,64};
  43. {
  44. auto rng1 = v | views::delimit(42) | views::common;
  45. CPP_assert(view_<decltype(rng1)>);
  46. CPP_assert(common_range<decltype(rng1)>);
  47. CPP_assert(!sized_range<decltype(rng1)>);
  48. CPP_assert(forward_iterator<decltype(rng1.begin())>);
  49. CPP_assert(!bidirectional_iterator<decltype(rng1.begin())>);
  50. auto const & crng1 = rng1;
  51. auto i = rng1.begin(); // non-const
  52. auto j = crng1.begin(); // const
  53. j = i;
  54. ::check_equal(rng1, {1, 2, 3, 4, 5, 6, 7, 8, 9, 0});
  55. }
  56. {
  57. std::list<int> l{1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0};
  58. auto rng3 = views::counted(l.begin(), 10) | views::common;
  59. CPP_assert(view_<decltype(rng3)>);
  60. CPP_assert(common_range<decltype(rng3)>);
  61. CPP_assert(sized_range<decltype(rng3)>);
  62. CPP_assert(forward_iterator<decltype(rng3.begin())>);
  63. CPP_assert(!bidirectional_iterator<decltype(rng3.begin())>);
  64. CPP_assert(sized_sentinel_for<decltype(rng3.begin()), decltype(rng3.end())>);
  65. auto b = begin(rng3);
  66. auto e = end(rng3);
  67. CHECK((e-b) == 10);
  68. CHECK((b-e) == -10);
  69. CHECK((e-e) == 0);
  70. CHECK((next(b)-b) == 1);
  71. // Pass-through of already-common ranges is OK:
  72. rng3 = rng3 | views::common;
  73. }
  74. {
  75. auto rng4 = views::counted(begin(v), 8) | views::common;
  76. CPP_assert(view_<decltype(rng4)>);
  77. CPP_assert(common_range<decltype(rng4)>);
  78. CPP_assert(sized_range<decltype(rng4)>);
  79. CPP_assert(random_access_iterator<decltype(begin(rng4))>);
  80. ::check_equal(rng4, {1, 2, 3, 4, 5, 6, 7, 8});
  81. }
  82. {
  83. // Regression test for issue#504:
  84. auto rng1 = views::repeat_n( 0, 10 );
  85. CPP_assert(view_<decltype(rng1)>);
  86. CPP_assert(!common_range<decltype(rng1)>);
  87. CPP_assert(random_access_range<decltype(rng1)>);
  88. CPP_assert(sized_range<decltype(rng1)>);
  89. auto const& crng1 = rng1;
  90. CPP_assert(random_access_range<decltype(crng1)>);
  91. CPP_assert(sized_range<decltype(crng1)>);
  92. auto rng2 = rng1 | views::common;
  93. CPP_assert(view_<decltype(rng2)>);
  94. CPP_assert(common_range<decltype(rng2)>);
  95. CPP_assert(random_access_range<decltype(rng2)>);
  96. CPP_assert(sized_range<decltype(rng2)>);
  97. auto const& crng2 = rng2;
  98. CPP_assert(common_range<decltype(crng2)>);
  99. CPP_assert(random_access_range<decltype(crng2)>);
  100. CPP_assert(sized_range<decltype(crng2)>);
  101. ::check_equal(rng2, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0});
  102. }
  103. {
  104. int const rgi[] = {1,2,3,4};
  105. auto rng = debug_input_view<int const>{rgi} | views::common;
  106. using Rng = decltype(rng);
  107. CPP_assert(input_range<Rng> && view_<Rng>);
  108. CPP_assert(!forward_range<Rng>);
  109. CPP_assert(common_range<Rng>);
  110. ::check_equal(rng, {1,2,3,4});
  111. }
  112. return ::test_result();
  113. }