ref_view.h 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. #pragma once
  2. #include <iterator>
  3. #include <iterator/detail/facade_traits.h>
  4. #include <stream/forward.h>
  5. #include <stream/owning_view.h>
  6. #include <iterator/detail/macro.h>
  7. namespace stream::ranges {
  8. template <typename It> class ref_view {
  9. private:
  10. It begin_;
  11. It end_;
  12. public:
  13. ref_view(It begin, It end) : begin_(begin), end_(end) {}
  14. template <typename C>
  15. ref_view(C & container)
  16. : begin_(std::begin(container)), end_(std::end(container)) {}
  17. auto begin() const { return begin_; }
  18. auto end() const { return end_; }
  19. bool empty() const { return begin_ == end_; }
  20. SFINAE(detail::has_distance_to_v<It>, size_t) size() const {
  21. return end_ - begin_;
  22. }
  23. };
  24. template <typename It> ref_view(It, It) -> ref_view<It>;
  25. template <typename C> ref_view(C &) -> ref_view<detail::iter<C>>;
  26. }
  27. namespace stream::ranges::views {
  28. template <typename C> auto all(C & container) { return ref_view(container); }
  29. template <typename C> auto all(C const & container) {
  30. return ref_view(container);
  31. }
  32. template <typename C> auto all(C && container) {
  33. return owning_view(std::move(container));
  34. }
  35. }
  36. #include <iterator/detail/undef.h>