diff --git a/octa/algorithm.h b/octa/algorithm.h index bab826b..942c57e 100644 --- a/octa/algorithm.h +++ b/octa/algorithm.h @@ -386,13 +386,13 @@ namespace octa { range.first() = value++; } - template + template struct MapRange: InputRange< - MapRange, RangeCategory, RangeValue, RangeValue, RangeSize + MapRange, RangeCategory, R, R, RangeSize > { private: T p_range; - Function(RangeReference)> p_func; + Function)> p_func; public: MapRange(): p_range(), p_func() {} @@ -421,21 +421,21 @@ namespace octa { RangeSize pop_first_n(RangeSize n) { p_range.pop_first_n(n); } RangeSize pop_last_n(RangeSize n) { p_range.pop_last_n(n); } - RangeValue first() const { return p_func(p_range.first()); } - RangeValue last() const { return p_func(p_range.last()); } + R first() const { return p_func(p_range.first()); } + R last() const { return p_func(p_range.last()); } - RangeValue first() { return p_func(p_range.first()); } - RangeValue last() { return p_func(p_range.last()); } + R first() { return p_func(p_range.first()); } + R last() { return p_func(p_range.last()); } - RangeValue operator[](RangeSize idx) const { + R operator[](RangeSize idx) const { return p_func(p_range[idx]); } - RangeValue operator[](RangeSize idx) { + R operator[](RangeSize idx) { return p_func(p_range[idx]); } - MapRange slice(RangeSize start, RangeSize end) { - return MapRange(p_range.slice(start, end), p_func); + MapRange slice(RangeSize start, RangeSize end) { + return MapRange(p_range.slice(start, end), p_func); } bool operator==(const MapRange &v) const { @@ -447,8 +447,11 @@ namespace octa { }; template - MapRange map(R range, F func) { - return MapRange(range, func); + using __OctaMapReturnType = decltype(declval()(declval>())); + + template + MapRange> map(R range, F func) { + return MapRange>(range, func); } template