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