#pragma once #include #include #include #include #include namespace stream::ranges { template class ref_view { private: It begin_; It end_; public: ref_view(It begin, It end) : begin_(begin), end_(end) {} template 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, size_t) size() const { return end_ - begin_; } }; template ref_view(It, It) -> ref_view; template ref_view(C &) -> ref_view>; } namespace stream::ranges::views { template auto all(C & container) { return ref_view(container); } template auto all(C const & container) { return ref_view(container); } template auto all(C && container) { return owning_view(std::move(container)); } } #include