#pragma once #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 end_aware_iterator(begin_, end_); } auto end() const { return end_aware_iterator(); } bool empty() const { return begin_ == end_; } size_t size() const { return std::distance(begin_, end_); } }; 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)); } }