filter.h 1.4 KB

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