source.hpp 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. #pragma once
  2. namespace stream { namespace detail {
  3. namespace source {
  4. template <typename Iter> class iterator {
  5. public:
  6. using value_type = typename std::iterator_traits<Iter>::reference;
  7. explicit iterator(Iter it) : impl_(it) {}
  8. value_type operator*() { return *impl_; }
  9. DELEGATE_ITERATOR_IMPL(impl_)
  10. private:
  11. Iter impl_;
  12. };
  13. template <typename C>
  14. using reference = decltype(*std::declval<C>().begin());
  15. }
  16. template <typename C> class source_stream {
  17. public:
  18. typedef source::reference<C> reference;
  19. typedef decltype(std::declval<C>().begin()) _iterator;
  20. explicit source_stream(C && cont) : source_(std::forward<C>(cont)) {}
  21. iterator<reference> begin() {
  22. return {source::iterator<_iterator>{source_.begin()}};
  23. }
  24. iterator<reference> end() {
  25. return {source::iterator<_iterator>{source_.end()}};
  26. }
  27. private:
  28. C source_;
  29. };
  30. template <typename It, typename V = typename It::value_type>
  31. class range_stream {
  32. public:
  33. typedef V & reference;
  34. explicit range_stream(It b, It e) : begin_(b), end_(e) {}
  35. iterator<reference> begin() { return {source::iterator<It>{begin_}}; }
  36. iterator<reference> end() { return {source::iterator<It>{end_}}; }
  37. private:
  38. It begin_, end_;
  39. };
  40. }}