map.hpp 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. #pragma once
  2. namespace stream {
  3. template <typename T, typename R>
  4. struct map_t {
  5. template <typename F>
  6. explicit map_t(F&& f) : func(f) {}
  7. std::function<R(const T&)> func;
  8. };
  9. }
  10. template <typename T, typename R, bool B>
  11. stream::detail::stream_base<R, true> operator|(stream::detail::stream_base<T, B> const&s, stream::map_t<T, R>&& f) {
  12. return s.map(f.func);
  13. }
  14. template <typename T, typename R, bool B>
  15. stream::detail::stream_base<R, true> operator|(stream::detail::stream_base<T, B> &&s, stream::map_t<T, R>&& f) {
  16. return std::move(s).map(f.func);
  17. }
  18. namespace stream {
  19. namespace detail {
  20. template <typename T, typename R, bool B>
  21. class map_stream : public stream_impl<R> {
  22. public:
  23. class iterator : public iterator_impl<R> {
  24. public:
  25. typedef iterator_impl<R> super;
  26. iterator(std::function<R(T const&)> f, ::stream::iterator<T>&& impl)
  27. : fun_(f), impl_(std::forward<::stream::iterator<T>>(impl)) {}
  28. ~iterator() {}
  29. R operator*() override { return fun_(*impl_); }
  30. DELEGATE_ITERATOR_IMPL(impl_)
  31. private:
  32. std::function<R(T const&)> fun_;
  33. ::stream::iterator<T> impl_;
  34. };
  35. template <typename F>
  36. map_stream(F&& func, stream_base<T, B> const& sb) : fun_(func), source_(sb) {}
  37. template <typename F>
  38. map_stream(F&& func, stream_base<T, B> && sb) : fun_(func), source_(std::forward<stream_base<T, B>>(sb)) { }
  39. ~map_stream() override {}
  40. ::stream::iterator<R> begin() override { return new iterator{fun_, source_.begin()};}
  41. ::stream::iterator<R> end() override { return new iterator{fun_, source_.end()}; }
  42. private:
  43. std::function<R(T const&)> fun_;
  44. stream_base<T, B> source_;
  45. };
  46. template <typename T, bool Own>
  47. template <typename F>
  48. auto stream_base<T, Own>::map(F&& func) const& -> stream_base<map_f<F>, true> {
  49. using impl_t = map_stream<T, map_f<F>, false>;
  50. return stream_base<map_f<F>, true>{new impl_t(func, falsify(*this))};
  51. }
  52. template <typename T, bool Own>
  53. template <typename F>
  54. auto stream_base<T, Own>::map(F&& func) && -> stream_base<map_f<F>, true> {
  55. using impl_t = map_stream<T, map_f<F>, Own>;
  56. return stream_base<map_f<F>, true>{new impl_t(func, std::forward<self>(*this))};
  57. }
  58. }
  59. }