filter.h 1.1 KB

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