intersperse.cpp 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  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 <sstream>
  12. #include <range/v3/core.hpp>
  13. #include <range/v3/view/intersperse.hpp>
  14. #include <range/v3/view/delimit.hpp>
  15. #include <range/v3/view/reverse.hpp>
  16. #include <range/v3/range/conversion.hpp>
  17. #include "../simple_test.hpp"
  18. #include "../test_utils.hpp"
  19. #ifdef RANGES_WORKAROUND_MSVC_790554
  20. template<std::size_t N>
  21. auto c_str(char const (&sz)[N])
  22. {
  23. return ranges::subrange<char const*>{&sz[0], &sz[N-1]};
  24. }
  25. #else // ^^^ workaround / no workaround vvv
  26. template<std::size_t N>
  27. ranges::subrange<char const*> c_str(char const (&sz)[N])
  28. {
  29. return {&sz[0], &sz[N-1]};
  30. }
  31. #endif // RANGES_WORKAROUND_MSVC_790554
  32. ranges::delimit_view<ranges::subrange<char const *, ranges::unreachable_sentinel_t>, char>
  33. c_str_(char const *sz)
  34. {
  35. return ranges::views::delimit(sz, '\0');
  36. }
  37. int main()
  38. {
  39. using namespace ranges;
  40. {
  41. auto r0 = views::intersperse(c_str("abcde"), ',');
  42. CPP_assert(common_range<decltype(r0)>);
  43. CHECK((r0.end() - r0.begin()) == 9);
  44. CHECK(to<std::string>(r0) == "a,b,c,d,e");
  45. CHECK(r0.size() == 9u);
  46. auto r1 = views::intersperse(c_str(""), ',');
  47. CPP_assert(common_range<decltype(r1)>);
  48. CHECK(to<std::string>(r1) == "");
  49. CHECK(r1.size() == 0u);
  50. auto r2 = views::intersperse(c_str("a"), ',');
  51. CPP_assert(common_range<decltype(r2)>);
  52. CHECK(to<std::string>(r2) == "a");
  53. CHECK(r2.size() == 1u);
  54. auto r3 = views::intersperse(c_str("ab"), ',');
  55. CPP_assert(common_range<decltype(r3)>);
  56. CHECK(to<std::string>(r3) == "a,b");
  57. CHECK(r3.size() == 3u);
  58. }
  59. {
  60. auto r0 = views::intersperse(c_str("abcde"), ',') | views::reverse;
  61. CPP_assert(common_range<decltype(r0)>);
  62. CHECK(to<std::string>(r0) == "e,d,c,b,a");
  63. auto r1 = views::intersperse(c_str(""), ',') | views::reverse;
  64. CPP_assert(common_range<decltype(r1)>);
  65. CHECK(to<std::string>(r1) == "");
  66. auto r2 = views::intersperse(c_str("a"), ',') | views::reverse;
  67. CPP_assert(common_range<decltype(r2)>);
  68. CHECK(to<std::string>(r2) == "a");
  69. auto r3 = views::intersperse(c_str("ab"), ',') | views::reverse;
  70. CPP_assert(common_range<decltype(r3)>);
  71. CHECK(to<std::string>(r3) == "b,a");
  72. }
  73. {
  74. auto r0 = views::intersperse(c_str_("abcde"), ',');
  75. CPP_assert(!common_range<decltype(r0)>);
  76. CHECK(to<std::string>(r0) == "a,b,c,d,e");
  77. auto r1 = views::intersperse(c_str_(""), ',');
  78. CPP_assert(!common_range<decltype(r1)>);
  79. CHECK(to<std::string>(r1) == "");
  80. auto r2 = views::intersperse(c_str_("a"), ',');
  81. CPP_assert(!common_range<decltype(r2)>);
  82. CHECK(to<std::string>(r2) == "a");
  83. auto r3 = views::intersperse(c_str_("ab"), ',');
  84. CPP_assert(!common_range<decltype(r3)>);
  85. CHECK(to<std::string>(r3) == "a,b");
  86. }
  87. {
  88. auto r0 = views::intersperse(c_str("abcde"), ',');
  89. auto it = r0.begin();
  90. CHECK(*(it+0) == 'a');
  91. CHECK(*(it+1) == ',');
  92. CHECK(*(it+2) == 'b');
  93. CHECK(*(it+3) == ',');
  94. CHECK(*(it+4) == 'c');
  95. CHECK(*(it+5) == ',');
  96. CHECK(*(it+6) == 'd');
  97. CHECK(*(it+7) == ',');
  98. CHECK(*(it+8) == 'e');
  99. CHECK((it+9) == r0.end());
  100. it = r0.end();
  101. CHECK(*(it-9) == 'a');
  102. CHECK(*(it-8) == ',');
  103. CHECK(*(it-7) == 'b');
  104. CHECK(*(it-6) == ',');
  105. CHECK(*(it-5) == 'c');
  106. CHECK(*(it-4) == ',');
  107. CHECK(*(it-3) == 'd');
  108. CHECK(*(it-2) == ',');
  109. CHECK(*(it-1) == 'e');
  110. it = r0.begin();
  111. CHECK(((it+0)-it) == 0);
  112. CHECK(((it+1)-it) == 1);
  113. CHECK(((it+2)-it) == 2);
  114. CHECK(((it+3)-it) == 3);
  115. CHECK(((it+4)-it) == 4);
  116. CHECK(((it+5)-it) == 5);
  117. CHECK(((it+6)-it) == 6);
  118. CHECK(((it+7)-it) == 7);
  119. CHECK(((it+8)-it) == 8);
  120. CHECK(((it+9)-it) == 9);
  121. CHECK((it-(it+0)) == 0);
  122. CHECK((it-(it+1)) == -1);
  123. CHECK((it-(it+2)) == -2);
  124. CHECK((it-(it+3)) == -3);
  125. CHECK((it-(it+4)) == -4);
  126. CHECK((it-(it+5)) == -5);
  127. CHECK((it-(it+6)) == -6);
  128. CHECK((it-(it+7)) == -7);
  129. CHECK((it-(it+8)) == -8);
  130. CHECK((it-(it+9)) == -9);
  131. }
  132. {
  133. std::stringstream str{"1 2 3 4 5"};
  134. auto r0 = istream<int>(str) | views::intersperse(42);
  135. check_equal(r0, {1,42,2,42,3,42,4,42,5});
  136. }
  137. {
  138. int const some_ints[] = {1,2,3,4,5};
  139. auto rng = debug_input_view<int const>{some_ints} | views::intersperse(42);
  140. check_equal(rng, {1,42,2,42,3,42,4,42,5});
  141. }
  142. return test_result();
  143. }