#pragma once #include #include namespace stream::detail { template class filter_stream { public: using iter_type = ::iterator::filter_iterator, true>; public: template filter_stream(F && func, stream_base const & sb) : pred_(func), source_(sb) {} iterator begin() { return iter_type(pred_, source_); } iterator end() { return iter_type(); } private: typename iter_type::predicate_t pred_; stream_base source_; }; template template auto stream_base::filter(F && pred) && -> stream_base { return std::make_shared>(pred, std::move(*this)); } template template auto stream_base::filter(F && pred) const & -> stream_base { return std::make_shared>(pred, *this); } }