iterator_range.cpp 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  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/utility/copy.hpp>
  15. #include <range/v3/iterator/unreachable_sentinel.hpp>
  16. #include <range/v3/iterator_range.hpp>
  17. #include <range/v3/view/all.hpp>
  18. #include "../simple_test.hpp"
  19. #include "../test_utils.hpp"
  20. struct empty
  21. {};
  22. int main()
  23. {
  24. std::vector<int> vi{1,2,3,4};
  25. using namespace ranges;
  26. iterator_range<std::vector<int>::iterator> r0 {vi.begin(), vi.end()};
  27. CPP_assert(view_<decltype(r0)>);
  28. CPP_assert(sized_range<decltype(r0)>);
  29. CHECK(r0.size() == 4u);
  30. CHECK(r0.begin() == vi.begin());
  31. CHECK(r0.end() == vi.end());
  32. CHECK(ranges::get<0>(r0) == vi.begin());
  33. CHECK(ranges::get<1>(r0) == vi.end());
  34. ++r0.begin();
  35. CHECK(r0.size() == 3u);
  36. std::pair<std::vector<int>::iterator, std::vector<int>::iterator> p0 = r0;
  37. CHECK(p0.first == vi.begin()+1);
  38. CHECK(p0.second == vi.end());
  39. iterator_range<std::vector<int>::iterator, unreachable_sentinel_t> r1 { r0.begin(), {} };
  40. CPP_assert(view_<decltype(r1)>);
  41. CPP_assert(!sized_range<decltype(r1)>);
  42. CHECK(r1.begin() == vi.begin()+1);
  43. r1.end() = unreachable;
  44. ++r0.begin();
  45. CHECK(r0.begin() == vi.begin()+2);
  46. CHECK(r0.size() == 2u);
  47. --r0.end();
  48. CHECK(r0.end() == vi.end()-1);
  49. CHECK(r0.size() == 1u);
  50. CHECK(r0.front() == 3);
  51. CHECK(r0.back() == 3);
  52. std::pair<std::vector<int>::iterator, unreachable_sentinel_t> p1 = r1;
  53. CHECK(p1.first == vi.begin()+1);
  54. iterator_range<std::vector<int>::iterator, unreachable_sentinel_t> r2 { p1 };
  55. CHECK(r1.begin() == vi.begin()+1);
  56. std::list<int> li{1,2,3,4};
  57. sized_iterator_range<std::list<int>::iterator> l0 {li.begin(), li.end(), li.size()};
  58. CPP_assert(view_<decltype(l0)>);
  59. CPP_assert(sized_range<decltype(l0)>);
  60. CHECK(l0.begin() == li.begin());
  61. CHECK(l0.end() == li.end());
  62. CHECK(l0.size() == li.size());
  63. return ::test_result();
  64. }