| 123456789101112131415161718192021222324252627282930313233343536373839404142434445 |
- #pragma once
- #include <iterator>
- #include <iterator/detail/facade_traits.h>
- #include <stream/forward.h>
- #include <stream/owning_view.h>
- #include <iterator/detail/macro.h>
- namespace stream::ranges {
- template <typename It> class ref_view {
- private:
- It begin_;
- It end_;
- public:
- ref_view(It begin, It end) : begin_(begin), end_(end) {}
- template <typename C>
- ref_view(C & container)
- : begin_(std::begin(container)), end_(std::end(container)) {}
- auto begin() const { return begin_; }
- auto end() const { return end_; }
- bool empty() const { return begin_ == end_; }
- SFINAE(detail::has_distance_to_v<It>, size_t) size() const {
- return end_ - begin_;
- }
- };
- template <typename It> ref_view(It, It) -> ref_view<It>;
- template <typename C> ref_view(C &) -> ref_view<detail::iter<C>>;
- }
- namespace stream::ranges::views {
- template <typename C> auto all(C & container) { return ref_view(container); }
- template <typename C> auto all(C const & container) {
- return ref_view(container);
- }
- template <typename C> auto all(C && container) {
- return owning_view(std::move(container));
- }
- }
- #include <iterator/detail/undef.h>
|