join_view.h 682 B

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