// // common_view.h // stream // // Created by Sam Jaffe on 3/30/23. // #pragma once #include #include #include #include namespace stream::ranges { template class common_view { private: using iterator = common_iterator, detail::end_t>; private: S stream_; public: common_view(S && stream) : stream_(FWD(stream)) {} auto begin() const { return iterator(stream_.begin()); } auto end() const { return iterator(stream_.end()); } SFINAE(detail::has_empty_v, bool) empty() const { return stream_.empty(); } SFINAE(detail::has_size_v, bool) size() const { return stream_.size(); } }; template common_view(S &&) -> common_view; } namespace stream::ranges::views { struct common { template friend auto operator|(Stream && stream, common) { if constexpr (detail::is_sentinal_v) { return common_view(FWD(stream)); } else { return FWD(stream); } } }; } #include