Skip to content

Commit 6d74bbb

Browse files
authored
Merge pull request #121 from elbeno/improve-tuple-transform
⚡ Improve compile time for a common transform use case
2 parents 2677ef6 + 030d16c commit 6d74bbb

File tree

1 file changed

+12
-5
lines changed

1 file changed

+12
-5
lines changed

include/stdx/tuple.hpp

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -504,11 +504,18 @@ constexpr auto apply(Op &&op, T &&t) -> decltype(auto) {
504504
return std::forward<T>(t).apply(std::forward<Op>(op));
505505
}
506506

507-
template <typename Op, tuplelike T> constexpr auto transform(Op &&op, T &&t) {
508-
return std::forward<T>(t).apply([&]<typename... Ts>(Ts &&...ts) {
509-
return stdx::tuple<decltype(op(std::forward<Ts>(ts)))...>{
510-
op(std::forward<Ts>(ts))...};
511-
});
507+
template <template <typename> typename... Fs, typename Op, tuplelike T>
508+
constexpr auto transform(Op &&op, T &&t) {
509+
if constexpr (sizeof...(Fs) == 0) {
510+
return std::forward<T>(t).apply([&]<typename... Ts>(Ts &&...ts) {
511+
return stdx::tuple<decltype(op(std::forward<Ts>(ts)))...>{
512+
op(std::forward<Ts>(ts))...};
513+
});
514+
} else {
515+
return std::forward<T>(t).apply([&]<typename... Ts>(Ts &&...ts) {
516+
return stdx::make_indexed_tuple<Fs...>(op(std::forward<Ts>(ts))...);
517+
});
518+
}
512519
}
513520

514521
template <typename Op, tuplelike T>

0 commit comments

Comments
 (0)