join.h 877 B

123456789101112131415161718192021222324252627282930313233343536373839
  1. #pragma once
  2. #include <iterator/join_iterator.h>
  3. #include <stream/forward.h>
  4. #include <stream/detail/traits.h>
  5. #include <stream/view/interface.h>
  6. #include <stream/detail/macro.h>
  7. namespace stream::ranges {
  8. template <typename S>
  9. struct join_view
  10. : public view_interface<join_view<S>,
  11. iterator::joining_iterator<detail::begin_t<S>>,
  12. sentinel_t> {
  13. private:
  14. S stream_;
  15. public:
  16. join_view(S && stream) : stream_(FWD(stream)) {}
  17. auto begin() const { return iterator::joining_iterator(stream_); }
  18. auto end() const { return iterator::sentinel; }
  19. };
  20. template <typename S> join_view(S &&) -> join_view<S>;
  21. }
  22. namespace stream::ranges::views {
  23. struct join {
  24. template <typename Stream> friend auto operator|(Stream && stream, join) {
  25. return join_view(FWD(stream));
  26. }
  27. };
  28. }
  29. #include <stream/detail/undef.h>