filter_view.h 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. #pragma once
  2. #include <functional>
  3. #include <iterator/filter_iterator.hpp>
  4. #define FWD(x) std::forward<decltype(x)>(x)
  5. namespace stream::ranges {
  6. template <typename S> class filter_view {
  7. private:
  8. using Pred = std::function<bool(traits::cref_t<S>)>;
  9. using iterator = ::iterator::filter_iterator<iter<S>, true>;
  10. private:
  11. S stream_;
  12. Pred predicate_;
  13. public:
  14. template <typename F>
  15. filter_view(S && stream, F predicate)
  16. : stream_(FWD(stream)), predicate_(predicate) {}
  17. auto begin() const { return iterator(predicate_, stream_); }
  18. auto end() const { return iterator(); }
  19. };
  20. template <typename S, typename F> filter_view(S &&, F) -> filter_view<S>;
  21. }
  22. namespace stream::ranges::views {
  23. template <typename Pred> class filter {
  24. public:
  25. filter(Pred const & predicate) : predicate_(predicate) {}
  26. filter(Pred & predicate) : predicate_(std::move(predicate)) {}
  27. template <typename Stream>
  28. friend auto operator|(Stream && stream, filter filt) {
  29. // TODO: if constexpr filter_view
  30. return filter_view(FWD(stream), std::move(filt.predicate_));
  31. }
  32. private:
  33. Pred predicate_;
  34. };
  35. }
  36. #undef FWD