Spaces:
Build error
Build error
// STL includes | |
namespace cl { | |
namespace util { | |
namespace detail { | |
// Borrowed from: | |
// https://www.fluentcpp.com/2019/03/05/for_each_arg-applying-a-function-to-each-argument-of-a-function-in-cpp/ | |
template <class F, class... Args> F for_each_arg(F f, Args&&... args) | |
{ | |
(void)std::initializer_list<int>{ ( | |
(void)f(std::forward<Args>(args)), 0)... }; | |
return f; | |
} | |
namespace impl { | |
// Borrowed from: https://stackoverflow.com/a/16387374/1476661 | |
template <typename T, typename F, int... Is> | |
void for_each_in_tuple(T&& t, F&& f, | |
std::integer_sequence<int, Is...>) | |
{ | |
auto l = { | |
(std::forward<F>(f)(std::get<Is>(std::forward<T>(t))), 0)... | |
}; | |
(void)l; | |
} | |
} | |
template <typename... Ts, typename F> | |
void for_each_in_tuple(std::tuple<Ts...> const& t, F&& f) | |
{ | |
impl::for_each_in_tuple( | |
t, std::forward<F>(f), | |
std::make_integer_sequence<int, sizeof...(Ts)>()); | |
} | |
namespace impl { | |
// Borrowed from | |
// https://codereview.stackexchange.com/questions/193420/apply-a-function-to-each-element-of-a-tuple-map-a-tuple | |
template <class F, typename Tuple, std::size_t... Is> | |
auto transform_tuple(Tuple&& t, F&& f, std::index_sequence<Is...>) | |
{ | |
return std::make_tuple(std::forward<F>(f)(std::get<Is>(t))...); | |
} | |
} | |
template <class F, typename... Args> | |
auto transform_tuple(const std::tuple<Args...>& t, F&& f) | |
{ | |
return impl::transform_tuple( | |
t, std::forward<F>(f), | |
std::make_index_sequence<sizeof...(Args)>{}); | |
} | |
namespace impl { | |
// Borrowed from | |
// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3658.html | |
// with modifications of Casey Carter at | |
// https://stackoverflow.com/a/51365112/1476661 | |
template <typename F, typename Tuple, std::size_t... I> | |
auto apply(F&& f, Tuple&& args, std::index_sequence<I...>) | |
-> decltype(std::forward<F>(f)( | |
std::get<I>(std::forward<Tuple>(args))...)) | |
{ | |
return std::forward<F>(f)( | |
std::get<I>(std::forward<Tuple>(args))...); | |
} | |
} | |
template <typename F, typename Tuple, | |
typename Indices = std::make_index_sequence< | |
std::tuple_size<std::remove_reference_t<Tuple>>::value>> | |
auto apply(F&& f, Tuple&& args) | |
-> decltype(impl::apply(std::forward<F>(f), | |
std::forward<Tuple>(args), Indices())) | |
{ | |
return impl::apply(std::forward<F>(f), std::forward<Tuple>(args), | |
Indices()); | |
} | |
} | |
} | |
} | |