#pragma once #include #include #include #include #include #include namespace stream::ranges { template class filter_view : public proxy_view_interface, S, iterator::filter_iterator, P> { public: using iterator = iterator::filter_iterator, P>; private: S stream_; P predicate_; public: filter_view(S && stream, P predicate) : stream_(FWD(stream)), predicate_(predicate) {} auto begin() const { return iterator(stream_, predicate_); } auto end() const { return sentinel_end(this, stream_, stream_.end(), predicate_); } }; template filter_view(S &&, P) -> filter_view; } namespace stream::ranges::views { template class filter { public: filter(Pred const & predicate) : predicate_(predicate) {} filter(Pred && predicate) : predicate_(std::move(predicate)) {} filter(Pred & predicate) : predicate_(predicate) {} template friend auto operator|(Stream && stream, filter filt) { // TODO: if constexpr filter_view return filter_view(FWD(stream), std::move(filt.predicate_)); } private: Pred predicate_; }; } #include