OSSIA
Open Scenario System for Interactive Application
for_each_in_tuple.hpp
1 #pragma once
2 #include <tuplet/tuple.hpp>
3 
4 #include <array>
5 #include <tuple>
6 #include <utility>
7 
8 namespace ossia
9 {
10 template <class Tuple, class F>
11 void for_each_in_tuple(Tuple&& tuple, F&& func) {
12  apply([&](auto&&... args) { (func(args), ...); }, static_cast<Tuple&&>(tuple));
13 }
14 
15 template <class F, class T1, std::size_t... I1s, class T2>
16 void 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 
24 template <
25  class F, template <class...> class T1, class... T1s, template <class...> class T2,
26  class... T2s>
27 void 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 
41 template <
42  class F, template <class...> class T1, class... T1s, std::size_t... I1s,
43  template <class...> class T2, class... T2s>
44 void 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 
52 template <
53  class F, template <class...> class T1, class... T1s, template <class...> class T2,
54  class... T2s>
55 void 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 
66 template <
67  template <class...> class T1, class... T1s, std::size_t... I1s,
68  template <class...> class T2, class... T2s>
69 auto 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 
75 template <
76  template <class...> class T1, class... T1s, template <class...> class T2,
77  class... T2s>
78 void 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 
85 template <
86  class F, template <class...> class T1, class... T1s, std::size_t... I1s, typename U,
87  std::size_t N>
88 void 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 
96 template <class F, template <class...> class T1, class... T1s, typename U, std::size_t N>
97 void 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