Skip to content

Commit 1af007d

Browse files
authored
Updated for_each to use a fold over recurssion (#2872)
# Checklist - [x] The title and commit message(s) are descriptive. - [x] Small commits made to fix your PR have been squashed to avoid history pollution. - [x] Tests have been added for new features or bug fixes. - [x] API of new functions and classes are documented. # Description <!--- Give any relevant description here. If your PR fixes an issue, please include "Fixes #ISSUE" (substituting the relevant issue ID). -->
1 parent 3f986cf commit 1af007d

File tree

1 file changed

+18
-33
lines changed

1 file changed

+18
-33
lines changed

include/xtensor/utils/xutils.hpp

Lines changed: 18 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -163,52 +163,37 @@ namespace xt
163163

164164
namespace detail
165165
{
166-
template <std::size_t I, class F, class... T>
167-
inline typename std::enable_if<I == sizeof...(T), void>::type
168-
for_each_impl(F&& /*f*/, std::tuple<T...>& /*t*/) noexcept
166+
template <class F, size_t... I, class... Ts>
167+
void for_each(F&& f, std::tuple<Ts...>& t, std::index_sequence<I...>) noexcept(
168+
(noexcept(f(std::get<I>(t))) && ...)
169+
)
169170
{
171+
(f(std::get<I>(t)), ...);
170172
}
171173

172-
template <std::size_t I, class F, class... T>
173-
inline typename std::enable_if < I<sizeof...(T), void>::type
174-
for_each_impl(F&& f, std::tuple<T...>& t) noexcept(noexcept(f(std::get<I>(t))))
174+
template <class F, size_t... I, class... Ts>
175+
void for_each(F&& f, const std::tuple<Ts...>& t, std::index_sequence<I...>) noexcept(
176+
(noexcept(f(std::get<I>(t))) && ...)
177+
)
175178
{
176-
f(std::get<I>(t));
177-
for_each_impl<I + 1, F, T...>(std::forward<F>(f), t);
179+
(f(std::get<I>(t)), ...);
178180
}
179181
}
180182

181-
template <class F, class... T>
182-
inline void for_each(F&& f, std::tuple<T...>& t) noexcept(
183-
noexcept(detail::for_each_impl<0, F, T...>(std::forward<F>(f), t))
183+
template <class F, class... Ts>
184+
inline void for_each(F&& f, std::tuple<Ts...>& t) noexcept(
185+
noexcept(detail::for_each(std::forward<F>(f), t, std::make_index_sequence<sizeof...(Ts)>{}))
184186
)
185187
{
186-
detail::for_each_impl<0, F, T...>(std::forward<F>(f), t);
188+
detail::for_each(std::forward<F>(f), t, std::make_index_sequence<sizeof...(Ts)>{});
187189
}
188190

189-
namespace detail
190-
{
191-
template <std::size_t I, class F, class... T>
192-
inline typename std::enable_if<I == sizeof...(T), void>::type
193-
for_each_impl(F&& /*f*/, const std::tuple<T...>& /*t*/) noexcept
194-
{
195-
}
196-
197-
template <std::size_t I, class F, class... T>
198-
inline typename std::enable_if < I<sizeof...(T), void>::type
199-
for_each_impl(F&& f, const std::tuple<T...>& t) noexcept(noexcept(f(std::get<I>(t))))
200-
{
201-
f(std::get<I>(t));
202-
for_each_impl<I + 1, F, T...>(std::forward<F>(f), t);
203-
}
204-
}
205-
206-
template <class F, class... T>
207-
inline void for_each(F&& f, const std::tuple<T...>& t) noexcept(
208-
noexcept(detail::for_each_impl<0, F, T...>(std::forward<F>(f), t))
191+
template <class F, class... Ts>
192+
inline void for_each(F&& f, const std::tuple<Ts...>& t) noexcept(
193+
noexcept(detail::for_each(std::forward<F>(f), t, std::make_index_sequence<sizeof...(Ts)>{}))
209194
)
210195
{
211-
detail::for_each_impl<0, F, T...>(std::forward<F>(f), t);
196+
detail::for_each(std::forward<F>(f), t, std::make_index_sequence<sizeof...(Ts)>{});
212197
}
213198

214199
/*****************************

0 commit comments

Comments
 (0)