source.hpp 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  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() {
  25. return {source_iterator<_iterator>{source_.begin()}};
  26. }
  27. iterator<reference> end() {
  28. return {source_iterator<_iterator>{source_.end()}};
  29. }
  30. private:
  31. C source_;
  32. };
  33. template <typename It, typename V = typename It::value_type>
  34. class range_stream {
  35. public:
  36. typedef typename It::reference reference;
  37. explicit range_stream(It b, It e) : begin_(b), end_(e) {}
  38. iterator<reference> begin() { return {source_iterator<It>{begin_}}; }
  39. iterator<reference> end() { return {source_iterator<It>{end_}}; }
  40. private:
  41. It begin_, end_;
  42. };
  43. }}