join_view.h 647 B

1234567891011121314151617181920212223242526272829303132
  1. #pragma once
  2. #include <iterator/join_iterator.hpp>
  3. #define FWD(x) std::forward<decltype(x)>(x)
  4. namespace stream::ranges {
  5. template <typename S> struct join_view {
  6. private:
  7. using iterator = ::iterator::joining_iterator<iter<S>>;
  8. private:
  9. S stream_;
  10. public:
  11. join_view(S && stream) : stream_(FWD(stream)) {}
  12. auto begin() const { return iterator(stream_); }
  13. auto end() const { return iterator(); }
  14. bool empty() const { return begin() == end(); }
  15. };
  16. }
  17. namespace stream::ranges::views {
  18. struct join {
  19. template <typename Stream> friend auto operator|(Stream && stream, join) {
  20. return join_view(FWD(stream));
  21. }
  22. };
  23. }
  24. #undef FWD