filter.h 1.1 KB

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