source.hpp 1.3 KB

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