filter.hpp 894 B

123456789101112131415161718192021222324252627282930313233343536
  1. #pragma once
  2. #include <stream/iterator.hpp>
  3. #include <iterator/filter_iterator.hpp>
  4. namespace stream::detail {
  5. template <typename T> class filter_stream {
  6. public:
  7. using iter_type = ::iterator::filter_iterator<iterator<T>, true>;
  8. public:
  9. template <typename F>
  10. filter_stream(F && func, stream_base<T> const & sb)
  11. : pred_(func), source_(sb) {}
  12. iterator<T> begin() { return iter_type(pred_, source_); }
  13. iterator<T> end() { return iter_type(); }
  14. private:
  15. typename iter_type::predicate_t pred_;
  16. stream_base<T> source_;
  17. };
  18. template <typename T>
  19. template <typename F>
  20. auto stream_base<T>::filter(F && pred) && -> stream_base<T> {
  21. return std::make_shared<filter_stream<T>>(pred, std::move(*this));
  22. }
  23. template <typename T>
  24. template <typename F>
  25. auto stream_base<T>::filter(F && pred) const & -> stream_base<T> {
  26. return std::make_shared<filter_stream<T>>(pred, *this);
  27. }
  28. }