source.hpp 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. #pragma once
  2. namespace stream {
  3. namespace detail {
  4. namespace source {
  5. template <typename Iter>
  6. class iterator : public iterator_impl<typename std::iterator_traits<Iter>::reference> {
  7. public:
  8. using value_type = typename std::iterator_traits<Iter>::reference;
  9. typedef iterator_impl<value_type> super;
  10. explicit iterator(Iter it) : impl_(it) {}
  11. ~iterator() {}
  12. value_type operator*() override { return *impl_; }
  13. DELEGATE_ITERATOR_IMPL(impl_)
  14. private:
  15. Iter impl_;
  16. };
  17. template <typename C>
  18. using reference = decltype(*std::declval<C>().begin());
  19. }
  20. template <typename C>
  21. class source_stream : public stream_impl<source::reference<C>> {
  22. public:
  23. typedef source::reference<C> reference;
  24. typedef decltype(std::declval<C>().begin()) _iterator;
  25. explicit source_stream(C && cont) : source_(std::forward<C>(cont)) {}
  26. ~source_stream() override {}
  27. iterator<reference> begin() override { return {new source::iterator<_iterator>{source_.begin()}}; }
  28. iterator<reference> end() override { return {new source::iterator<_iterator>{source_.end()}}; }
  29. private:
  30. C source_;
  31. };
  32. template <typename It, typename V = typename It::value_type>
  33. class range_stream : public stream_impl<V &> {
  34. public:
  35. typedef V & reference;
  36. explicit range_stream(It b, It e) : begin_(b), end_(e) {}
  37. ~range_stream() override {}
  38. iterator<reference> begin() override { return {new source::iterator<It>{begin_}}; }
  39. iterator<reference> end() override { return {new source::iterator<It>{end_}}; }
  40. private:
  41. It begin_, end_;
  42. };
  43. }
  44. template <typename C>
  45. detail::stream_base<detail::source::reference<C>> make_stream(C && cont) {
  46. return {std::make_shared<detail::source_stream<C>>(cont)};
  47. }
  48. template <typename T>
  49. detail::stream_base<T&> make_stream(T * ptr) {
  50. return {std::make_shared<detail::range_stream<T*, T>>(ptr, ptr+1)};
  51. }
  52. template <typename It>
  53. detail::stream_base<typename It::reference> make_stream(It begin, It end) {
  54. return {std::make_shared<detail::range_stream<It>>(begin, end)};
  55. }
  56. }