From 8c96179bd6867c3692319195a1fd64aa2b9bbb09 Mon Sep 17 00:00:00 2001 From: q66 Date: Sat, 23 May 2015 18:44:06 +0100 Subject: [PATCH] add octa::algorithm::map --- octa/algorithm.h | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/octa/algorithm.h b/octa/algorithm.h index a0a39f0..a2b5b96 100644 --- a/octa/algorithm.h +++ b/octa/algorithm.h @@ -385,6 +385,51 @@ namespace octa { for (; !range.empty(); range.pop_first()) range.first() = value++; } + + template + struct MapRange: InputRange< + MapRange, InputRangeTag, RangeValue, RangeValue, RangeSize + > { + private: + T p_range; + Function(RangeReference)> p_func; + + public: + MapRange(): p_range(), p_func() {} + template + MapRange(const T &range, const F &func): p_range(range), p_func(func) {} + MapRange(const MapRange &it): p_range(it.p_range), p_func(it.p_func) {} + MapRange(MapRange &&it): p_range(move(it.p_range)), p_func(move(it.p_func)) {} + + MapRange &operator=(const MapRange &v) { + p_range = v.p_range; + p_func = v.p_func; + return *this; + } + MapRange &operator=(MapRange &&v) { + p_range = mpve(v.p_range); + p_func = move(v.p_func); + return *this; + } + + bool empty() const { return p_range.empty(); } + void pop_first() { p_range.pop_first(); } + RangeSize pop_first_n(RangeSize n) { p_range.pop_first_n(n); } + + RangeValue first() { return p_func(p_range.first()); } + + bool operator==(const MapRange &v) const { + return (p_range == v.p_range) && (p_func == v.p_func); + } + bool operator!=(const MapRange &v) const { + return (p_range != v.p_range) || (p_func != v.p_func); + } + }; + + template + MapRange map(R range, F func) { + return MapRange(range, func); + } } #endif \ No newline at end of file