ref_view.h 1.0 KB

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