forwarding join/zip

This commit is contained in:
q66 2016-05-01 00:34:00 +01:00
parent b16e72fa16
commit f46ffa53fd

View file

@ -606,16 +606,48 @@ inline auto chunks(T n) {
return [n](auto &&obj) { return obj.chunks(n); }; return [n](auto &&obj) { return obj.chunks(n); };
} }
namespace detail {
template<typename T, typename ...R, Size ...I>
inline auto join_proxy(T &&obj, Tuple<R &&...> &tup, TupleIndices<I...>) {
return obj.join(forward<R>(get<I>(tup))...);
}
template<typename T, typename ...R, Size ...I>
inline auto zip_proxy(T &&obj, Tuple<R &&...> &tup, TupleIndices<I...>) {
return obj.zip(forward<R>(get<I>(tup))...);
}
}
template<typename R>
inline auto join(R &&range) {
return [range = forward<R>(range)](auto &&obj) mutable {
return obj.join(forward<R>(range));
};
}
template<typename R1, typename ...R> template<typename R1, typename ...R>
inline auto join(R1 &&r1, R &&...rr) { inline auto join(R1 &&r1, R &&...rr) {
/* TODO find a way to avoid a copy here with varargs */ return [ranges = forward_as_tuple(forward<R1>(r1), forward<R>(rr)...)]
return [=](auto &&obj) { return obj.join(move(r1), move(rr)...); }; (auto &&obj) mutable {
using Index = detail::MakeTupleIndices<sizeof...(R) + 1>;
return detail::join_proxy(forward<decltype(obj)>(obj), ranges, Index());
};
}
template<typename R>
inline auto zip(R &&range) {
return [range = forward<R>(range)](auto &&obj) mutable {
return obj.zip(forward<R>(range));
};
} }
template<typename R1, typename ...R> template<typename R1, typename ...R>
inline auto zip(R1 &&r1, R &&...rr) { inline auto zip(R1 &&r1, R &&...rr) {
/* TODO find a way to avoid a copy here with varargs */ return [ranges = forward_as_tuple(forward<R1>(r1), forward<R>(rr)...)]
return [=](auto &&obj) { return obj.zip(move(r1), move(rr)...); }; (auto &&obj) mutable {
using Index = detail::MakeTupleIndices<sizeof...(R) + 1>;
return detail::zip_proxy(forward<decltype(obj)>(obj), ranges, Index());
};
} }
template<typename T> template<typename T>