cache1.cpp 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. /// \file
  2. // Range v3 library
  3. //
  4. // Copyright Eric Niebler 2013-2014.
  5. // Copyright Casey Carter 2017.
  6. //
  7. // Use, modification and distribution is subject to the
  8. // Boost Software License, Version 1.0. (See accompanying
  9. // file LICENSE_1_0.txt or copy at
  10. // http://www.boost.org/LICENSE_1_0.txt)
  11. //
  12. // Project home: https://github.com/ericniebler/range-v3
  13. //
  14. #include <vector>
  15. #include <range/v3/view/cache1.hpp>
  16. #include <range/v3/view/transform.hpp>
  17. #include <range/v3/view/c_str.hpp>
  18. #include <range/v3/view/move.hpp>
  19. #include "../simple_test.hpp"
  20. #include "../test_utils.hpp"
  21. using namespace ranges;
  22. int main()
  23. {
  24. {
  25. int count = 0;
  26. std::vector<int> v{1,2,3};
  27. auto rng = v | views::transform([&count](int i){ ++count; return i;})
  28. | views::cache1;
  29. using Rng = decltype(rng);
  30. CPP_assert(!range<Rng const>);
  31. CPP_assert(input_range<Rng>);
  32. CPP_assert(!forward_range<Rng>);
  33. CPP_assert(common_range<Rng>);
  34. CPP_assert(view_<Rng>);
  35. CPP_assert(sized_range<Rng>);
  36. CPP_assert(sized_sentinel_for<sentinel_t<Rng>, iterator_t<Rng>>);
  37. CPP_assert(same_as<range_value_t<Rng>, int>);
  38. CPP_assert(same_as<range_reference_t<Rng>, int &&>);
  39. CPP_assert(same_as<range_rvalue_reference_t<Rng>, int &&>);
  40. CHECK(count == 0);
  41. auto it = ranges::begin(rng);
  42. CHECK(count == 0);
  43. auto last = ranges::end(rng);
  44. CHECK(it != last);
  45. CHECK(count == 0);
  46. CHECK(*it == 1);
  47. CHECK(count == 1);
  48. CHECK(*it == 1);
  49. CHECK(count == 1);
  50. ++it;
  51. CHECK(it != last);
  52. CHECK(count == 1);
  53. CHECK(*it == 2);
  54. CHECK(count == 2);
  55. CHECK(*it == 2);
  56. CHECK(count == 2);
  57. ++it;
  58. CHECK(it != last);
  59. CHECK(count == 2);
  60. CHECK(*it == 3);
  61. CHECK(count == 3);
  62. CHECK(*it == 3);
  63. CHECK(count == 3);
  64. ++it;
  65. CHECK(count == 3);
  66. CHECK(it == last);
  67. }
  68. {
  69. int count = 0;
  70. char const * hi = "hi";
  71. auto rng = views::c_str(hi)
  72. | views::transform([&count](char ch){ ++count; return ch;})
  73. | views::cache1;
  74. using Rng = decltype(rng);
  75. CPP_assert(!range<Rng const>);
  76. CPP_assert(input_range<Rng>);
  77. CPP_assert(!forward_range<Rng>);
  78. CPP_assert(!common_range<Rng>);
  79. CPP_assert(view_<Rng>);
  80. CPP_assert(!sized_range<Rng>);
  81. CPP_assert(!sized_sentinel_for<sentinel_t<Rng>, iterator_t<Rng>>);
  82. CPP_assert(same_as<range_value_t<Rng>, char>);
  83. CPP_assert(same_as<range_reference_t<Rng>, char &&>);
  84. CPP_assert(same_as<range_rvalue_reference_t<Rng>, char &&>);
  85. CHECK(count == 0);
  86. auto it = ranges::begin(rng);
  87. CHECK(count == 0);
  88. auto last = ranges::end(rng);
  89. CHECK(it != last);
  90. CHECK(count == 0);
  91. CHECK(*it == 'h');
  92. CHECK(count == 1);
  93. CHECK(*it == 'h');
  94. CHECK(count == 1);
  95. ++it;
  96. CHECK(it != last);
  97. CHECK(count == 1);
  98. CHECK(*it == 'i');
  99. CHECK(count == 2);
  100. CHECK(*it == 'i');
  101. CHECK(count == 2);
  102. ++it;
  103. CHECK(count == 2);
  104. CHECK(it == last);
  105. }
  106. {
  107. int count = 0;
  108. MoveOnlyString rg[] = {"hello", "world"};
  109. auto rng = rg
  110. | views::move
  111. | views::transform([&count](auto s){ ++count; RANGES_ENSURE(s != ""); return s;})
  112. | views::cache1;
  113. using Rng = decltype(rng);
  114. CPP_assert(!range<Rng const>);
  115. CPP_assert(input_range<Rng>);
  116. CPP_assert(!forward_range<Rng>);
  117. CPP_assert(common_range<Rng>);
  118. CPP_assert(view_<Rng>);
  119. CPP_assert(sized_range<Rng>);
  120. CPP_assert(sized_sentinel_for<sentinel_t<Rng>, iterator_t<Rng>>);
  121. CPP_assert(same_as<range_value_t<Rng>, MoveOnlyString>);
  122. CPP_assert(same_as<range_reference_t<Rng>, MoveOnlyString &&>);
  123. CPP_assert(same_as<range_rvalue_reference_t<Rng>, MoveOnlyString &&>);
  124. CHECK(count == 0);
  125. auto it = ranges::begin(rng);
  126. CHECK(count == 0);
  127. auto last = ranges::end(rng);
  128. CHECK(it != last);
  129. CHECK(count == 0);
  130. CHECK((*it == "hello"));
  131. CHECK(count == 1);
  132. CHECK((*it == "hello"));
  133. CHECK(count == 1);
  134. ++it;
  135. CHECK(it != last);
  136. CHECK(count == 1);
  137. CHECK((*it == "world"));
  138. CHECK(count == 2);
  139. CHECK((*it == "world"));
  140. CHECK(count == 2);
  141. ++it;
  142. CHECK(count == 2);
  143. CHECK(it == last);
  144. }
  145. return test_result();
  146. }