2#include <tuplet/tuple.hpp>
10template <
class Tuple,
class F>
11void for_each_in_tuple(Tuple&& tuple, F&& func) {
12 apply([&](
auto&&... args) { (func(args), ...); },
static_cast<Tuple&&
>(tuple));
15template <
class F,
class T1, std::size_t... I1s,
class T2>
16void for_each_in_tuples_impl(T1&& t1, T2&& t2, F&& func, std::index_sequence<I1s...>)
19 using namespace tuplet;
20 (std::forward<F>(func)(get<I1s>(std::forward<T1>(t1)), get<I1s>(std::forward<T2>(t2))),
25 class F,
template <
class...>
class T1,
class... T1s,
template <
class...>
class T2,
27void for_each_in_tuples(T1<T1s...>&& t1, T2<T2s...>&& t2, F&& func)
29 static_assert(
sizeof...(T1s) ==
sizeof...(T2s));
31 if constexpr(
sizeof...(T1s) > 0)
34 using namespace tuplet;
35 for_each_in_tuples_impl(
36 move<T1<T1s...>>(t1), move<T2<T2s...>>(t2), std::forward<F>(func),
37 make_index_sequence<
sizeof...(T1s)>());
42 class F,
template <
class...>
class T1,
class... T1s, std::size_t... I1s,
43 template <
class...>
class T2,
class... T2s>
44void for_each_in_tuples_ref_impl(
45 T1<T1s...>& t1, T2<T2s...>& t2, F&& func, std::index_sequence<I1s...>)
48 using namespace tuplet;
49 (std::forward<F>(func)(get<I1s>(t1), get<I1s>(t2)), ...);
53 class F,
template <
class...>
class T1,
class... T1s,
template <
class...>
class T2,
55void for_each_in_tuples_ref(T1<T1s...>& t1, T2<T2s...>& t2, F&& func)
57 static_assert(
sizeof...(T1s) ==
sizeof...(T2s));
59 if constexpr(
sizeof...(T1s) > 0)
61 for_each_in_tuples_ref_impl(
62 t1, t2, std::forward<F>(func), std::make_index_sequence<
sizeof...(T1s)>());
67 template <
class...>
class T1,
class... T1s, std::size_t... I1s,
68 template <
class...>
class T2,
class... T2s>
69auto concat_tuples_impl(T1<T1s...>& t1, T2<T2s...>& t2, std::index_sequence<I1s...>)
72 return tuplet::make_tuple(make_pair(get<I1s>(t1), std::get<I1s>(t2))...);
76 template <
class...>
class T1,
class... T1s,
template <
class...>
class T2,
78void concat_tuples(T1<T1s...>& t1, T2<T2s...>& t2)
80 static_assert(
sizeof...(T1s) ==
sizeof...(T2s));
82 concat_tuples_impl(t1, t2, std::make_index_sequence<
sizeof...(T1s)>());
86 class F,
template <
class...>
class T1,
class... T1s, std::size_t... I1s,
typename U,
88void tuple_array_func_impl(
89 T1<T1s...>& t1, std::array<U, N>& t2, F&& func, std::index_sequence<I1s...>)
91 using namespace tuplet;
93 (forward<F>(func)(get<I1s>(t1), t2[I1s]), ...);
96template <
class F,
template <
class...>
class T1,
class... T1s,
typename U, std::size_t N>
97void tuple_array_func(T1<T1s...>&& t1, std::array<U, N>& t2, F&& func)
99 static_assert(
sizeof...(T1s) == N);
101 tuple_array_func_impl(t1, t2, std::forward<F>(func), std::make_index_sequence<N>{});