OSSIA
Open Scenario System for Interactive Application
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
for_each_in_tuple.hpp
1#pragma once
2#include <tuplet/tuple.hpp>
3
4#include <array>
5#include <tuple>
6#include <utility>
7
8namespace ossia
9{
10template <class Tuple, class F>
11void for_each_in_tuple(Tuple&& tuple, F&& func) {
12 apply([&](auto&&... args) { (func(args), ...); }, static_cast<Tuple&&>(tuple));
13}
14
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...>)
17{
18 using namespace std;
19 using namespace tuplet;
20 (std::forward<F>(func)(get<I1s>(std::forward<T1>(t1)), get<I1s>(std::forward<T2>(t2))),
21 ...);
22}
23
24template <
25 class F, template <class...> class T1, class... T1s, template <class...> class T2,
26 class... T2s>
27void for_each_in_tuples(T1<T1s...>&& t1, T2<T2s...>&& t2, F&& func)
28{
29 static_assert(sizeof...(T1s) == sizeof...(T2s));
30
31 if constexpr(sizeof...(T1s) > 0)
32 {
33 using namespace std;
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)>());
38 }
39}
40
41template <
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...>)
46{
47 using namespace std;
48 using namespace tuplet;
49 (std::forward<F>(func)(get<I1s>(t1), get<I1s>(t2)), ...);
50}
51
52template <
53 class F, template <class...> class T1, class... T1s, template <class...> class T2,
54 class... T2s>
55void for_each_in_tuples_ref(T1<T1s...>& t1, T2<T2s...>& t2, F&& func)
56{
57 static_assert(sizeof...(T1s) == sizeof...(T2s));
58
59 if constexpr(sizeof...(T1s) > 0)
60 {
61 for_each_in_tuples_ref_impl(
62 t1, t2, std::forward<F>(func), std::make_index_sequence<sizeof...(T1s)>());
63 }
64}
65
66template <
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...>)
70{
71 using namespace std;
72 return tuplet::make_tuple(make_pair(get<I1s>(t1), std::get<I1s>(t2))...);
73}
74
75template <
76 template <class...> class T1, class... T1s, template <class...> class T2,
77 class... T2s>
78void concat_tuples(T1<T1s...>& t1, T2<T2s...>& t2)
79{
80 static_assert(sizeof...(T1s) == sizeof...(T2s));
81
82 concat_tuples_impl(t1, t2, std::make_index_sequence<sizeof...(T1s)>());
83}
84
85template <
86 class F, template <class...> class T1, class... T1s, std::size_t... I1s, typename U,
87 std::size_t N>
88void tuple_array_func_impl(
89 T1<T1s...>& t1, std::array<U, N>& t2, F&& func, std::index_sequence<I1s...>)
90{
91 using namespace tuplet;
92 using namespace std;
93 (forward<F>(func)(get<I1s>(t1), t2[I1s]), ...);
94}
95
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)
98{
99 static_assert(sizeof...(T1s) == N);
100
101 tuple_array_func_impl(t1, t2, std::forward<F>(func), std::make_index_sequence<N>{});
102}
103
104}
Definition git_info.h:7