map.hpp 1.3 KB

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