join.h 609 B

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