source.hpp 1.2 KB

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