map.hpp 1.3 KB

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