allow different return type for octa::map callbacks

master
Daniel Kolesa 2015-05-24 14:34:37 +01:00
parent b2f085b9da
commit 96d2404c0e
1 changed files with 16 additions and 13 deletions

View File

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