map.hpp 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. #pragma once
  2. namespace stream { namespace detail {
  3. namespace map {
  4. template <typename T, typename R>
  5. class iterator : public iterator_impl<R> {
  6. public:
  7. typedef iterator_impl<R> super;
  8. iterator(std::function<R(T const&)> f, ::stream::iterator<T>&& impl)
  9. : fun_(f), impl_(std::forward<::stream::iterator<T>>(impl)) {}
  10. ~iterator() {}
  11. R operator*() override { return fun_(*impl_); }
  12. DELEGATE_ITERATOR_IMPL(impl_)
  13. private:
  14. std::function<R(T const&)> fun_;
  15. ::stream::iterator<T> impl_;
  16. };
  17. }
  18. template <typename T, typename R>
  19. class map_stream : public stream_impl<R> {
  20. public:
  21. template <typename F>
  22. map_stream(F&& func, stream_base<T> const& sb) : fun_(func), source_(sb) {}
  23. ~map_stream() override {}
  24. iterator<R> begin() override {
  25. return {new map::iterator<T, R>{fun_, source_.begin()}};
  26. }
  27. iterator<R> end() override {
  28. return {new map::iterator<T, R>{fun_, source_.end()}};
  29. }
  30. private:
  31. std::function<R(T const&)> fun_;
  32. stream_base<T> source_;
  33. };
  34. template <typename T>
  35. template <typename F>
  36. auto stream_base<T>::map(F&& func) const -> stream_base<map_f<F>> {
  37. using impl_t = map_stream<T, map_f<F>>;
  38. return {std::make_shared<impl_t>(func, *this)};
  39. }
  40. } }