@@ -140,39 +140,40 @@ template <std::size_t I, typename... Ts>
140140constexpr auto invoke_at (auto &&op, Ts &&...ts) -> decltype(auto ) {
141141 return op (std::forward<Ts>(ts)[index<I>]...);
142142}
143+
144+ template <typename ... Ts>
145+ constexpr std::size_t zip_length_for =
146+ sizeof ...(Ts) == 0
147+ ? 0
148+ : std::min({stdx::tuple_size_v<std::remove_cvref_t <Ts>>...});
143149} // namespace detail
144150
145- template <template <typename > typename ... Fs, typename Op, tuplelike T,
146- tuplelike... Ts>
147- constexpr auto transform (Op &&op, T &&t, Ts &&...ts) {
151+ template <template <typename > typename ... Fs, typename Op, tuplelike... Ts>
152+ constexpr auto transform (Op &&op, Ts &&...ts) {
148153 return [&]<std::size_t ... Is>(std::index_sequence<Is...>) {
149154 if constexpr (sizeof ...(Fs) == 0 ) {
150155 return stdx::tuple<decltype (detail::invoke_at<Is>(
151- std::forward<Op>(op), std::forward<T>(t),
152- std::forward<Ts>(ts)...))...>{
153- detail::invoke_at<Is>(std::forward<Op>(op), std::forward<T>(t),
156+ std::forward<Op>(op), std::forward<Ts>(ts)...))...>{
157+ detail::invoke_at<Is>(std::forward<Op>(op),
154158 std::forward<Ts>(ts)...)...};
155159 } else {
156- return stdx::make_indexed_tuple<Fs...>(
157- detail::invoke_at<Is>(std::forward<Op>(op), std::forward<T>(t),
158- std::forward<Ts>(ts)...)...);
160+ return stdx::make_indexed_tuple<Fs...>(detail::invoke_at<Is>(
161+ std::forward<Op>(op), std::forward<Ts>(ts)...)...);
159162 }
160- }(std::make_index_sequence<stdx::tuple_size_v<std:: remove_cvref_t <T> >>{});
163+ }(std::make_index_sequence<detail::zip_length_for<Ts... >>{});
161164}
162165
163- template <typename Op, typename T, typename ... Ts>
164- constexpr auto unrolled_for_each (Op &&op, T &&t, Ts &&...ts) -> Op {
166+ template <typename Op, typename ... Ts>
167+ constexpr auto unrolled_for_each (Op &&op, Ts &&...ts) -> Op {
165168 [&]<std::size_t ... Is>(std::index_sequence<Is...>) {
166- (detail::invoke_at<Is>(op, std::forward<T>(t), std::forward<Ts>(ts)...),
167- ...);
168- }(std::make_index_sequence<stdx::tuple_size_v<std::remove_cvref_t <T>>>{});
169+ (detail::invoke_at<Is>(op, std::forward<Ts>(ts)...), ...);
170+ }(std::make_index_sequence<detail::zip_length_for<Ts...>>{});
169171 return op;
170172}
171173
172- template <typename Op, tuplelike T, tuplelike... Ts>
173- constexpr auto for_each (Op &&op, T &&t, Ts &&...ts) -> Op {
174- return unrolled_for_each (std::forward<Op>(op), std::forward<T>(t),
175- std::forward<Ts>(ts)...);
174+ template <typename Op, tuplelike... Ts>
175+ constexpr auto for_each (Op &&op, Ts &&...ts) -> Op {
176+ return unrolled_for_each (std::forward<Op>(op), std::forward<Ts>(ts)...);
176177}
177178
178179namespace detail {
@@ -182,36 +183,31 @@ constexpr auto invoke_with_idx_at(auto &&op, Ts &&...ts) -> decltype(auto) {
182183}
183184} // namespace detail
184185
185- template <typename Op, typename T, typename ... Ts>
186- constexpr auto unrolled_enumerate (Op &&op, T &&t, Ts &&...ts) -> Op {
186+ template <typename Op, typename ... Ts>
187+ constexpr auto unrolled_enumerate (Op &&op, Ts &&...ts) -> Op {
187188 [&]<std::size_t ... Is>(std::index_sequence<Is...>) {
188- (detail::invoke_with_idx_at<Is>(op, std::forward<T>(t),
189- std::forward<Ts>(ts)...),
190- ...);
191- }(std::make_index_sequence<stdx::tuple_size_v<std::remove_cvref_t <T>>>{});
189+ (detail::invoke_with_idx_at<Is>(op, std::forward<Ts>(ts)...), ...);
190+ }(std::make_index_sequence<detail::zip_length_for<Ts...>>{});
192191 return op;
193192}
194193
195- template <typename Op, tuplelike T, tuplelike... Ts>
196- constexpr auto enumerate(Op &&op, T &&t, Ts &&...ts) -> Op {
197- return unrolled_enumerate (std::forward<Op>(op), std::forward<T>(t),
198- std::forward<Ts>(ts)...);
194+ template <typename Op, tuplelike... Ts>
195+ constexpr auto enumerate(Op &&op, Ts &&...ts) -> Op {
196+ return unrolled_enumerate (std::forward<Op>(op), std::forward<Ts>(ts)...);
199197}
200198
201- template <typename F, tuplelike T, tuplelike ... Ts>
202- constexpr auto all_of (F &&f, T &&t, Ts &&...ts) -> bool {
199+ template <typename F, tuplelike... Ts>
200+ constexpr auto all_of (F &&f, Ts &&...ts) -> bool {
203201 return [&]<std::size_t ... Is>(std::index_sequence<Is...>) {
204- return (... and detail::invoke_at<Is>(f, std::forward<T>(t),
205- std::forward<Ts>(ts)...));
206- }(std::make_index_sequence<stdx::tuple_size_v<std::remove_cvref_t <T>>>{});
202+ return (... and detail::invoke_at<Is>(f, std::forward<Ts>(ts)...));
203+ }(std::make_index_sequence<detail::zip_length_for<Ts...>>{});
207204}
208205
209- template <typename F, tuplelike T, tuplelike ... Ts>
210- constexpr auto any_of (F &&f, T &&t, Ts &&...ts) -> bool {
206+ template <typename F, tuplelike... Ts>
207+ constexpr auto any_of (F &&f, Ts &&...ts) -> bool {
211208 return [&]<std::size_t ... Is>(std::index_sequence<Is...>) {
212- return (... or detail::invoke_at<Is>(f, std::forward<T>(t),
213- std::forward<Ts>(ts)...));
214- }(std::make_index_sequence<stdx::tuple_size_v<std::remove_cvref_t <T>>>{});
209+ return (... or detail::invoke_at<Is>(f, std::forward<Ts>(ts)...));
210+ }(std::make_index_sequence<detail::zip_length_for<Ts...>>{});
215211}
216212
217213template <typename ... Ts> constexpr auto none_of (Ts &&...ts) -> bool {
0 commit comments