1#ifndef TATOOINE_VARIADIC_HELPERS_H
2#define TATOOINE_VARIADIC_HELPERS_H
11template <std::size_t I, std::size_t... Is>
13 static auto constexpr value = I;
16template <std::size_t... Is>
19template <std::size_t... I>
22template <std::
size_t I>
24 static auto constexpr value = I;
27template <std::size_t I, std::size_t... Is>
32template <std::size_t... Is>
35template <
typename T,
typename... Ts>
40template <
typename... Ts>
43template <
typename... T>
51template <
typename T,
typename... Ts>
56template <
typename... Ts>
59template <std::size_t I, std::size_t CurNum, std::size_t... RestNums>
63template <std::size_t CurNum, std::size_t... RestNums>
65 static auto constexpr value = CurNum;
67template <std::size_t I, std::size_t... Nums>
71template <std::size_t X, std::size_t... Rest>
73template <std::size_t X, std::size_t I, std::size_t... Rest>
75 : std::integral_constant<bool, contains_impl<X, Rest...>::value> {};
76template <std::size_t X, std::size_t... Rest>
78template <std::
size_t X>
80template <std::size_t X, std::size_t... Is>
84template <std::
size_t I, std::
size_t Begin, std::
size_t End>
86 return extracted_data;
90template <std::size_t I, std::size_t Begin, std::size_t End,
91 typename T,
typename... Ts>
92requires(Begin < End) && (I <= End)
94 T&& t, [[maybe_unused]] Ts&&... ts) -> auto& {
95 if constexpr (I == End) {
96 return extracted_data;
98 if constexpr (I >= Begin) {
99 extracted_data[I - Begin] = std::forward<T>(t);
101 return extract_to_array<I + 1, Begin, End>(extracted_data, std::forward<Ts>(ts)...);
106template <std::
size_t I, std::
size_t Begin, std::
size_t End>
108 return extracted_data;
112template <std::size_t I, std::size_t Begin, std::size_t End,
113 typename T,
typename... Ts>
114requires(Begin < End) && (I == End)
116 return extracted_data;
120template <std::size_t I, std::size_t Begin, std::size_t End,
121 typename T,
typename... Ts>
122requires(Begin < End) && (I <= End)
124 T&& t, [[maybe_unused]] Ts&&... ts) -> auto& {
125 if constexpr (I == End) {
126 return extracted_data;
128 if constexpr (I >= Begin) {
129 extracted_data.template at<I - Begin>() = std::forward<T>(t);
131 return extract_to_tuple<I + 1, Begin, End>(extracted_data, std::forward<Ts>(ts)...);
135template <std::size_t I, std::size_t Begin, std::size_t End,
typename... Ts>
139template <std::size_t I, std::size_t Begin, std::size_t End,
typename T,
148template <std::size_t I, std::size_t Begin, std::size_t End,
typename T0,
typename T1,
150requires(I >= Begin && I < End-1)
158template <std::size_t I, std::size_t Begin, std::size_t End,
typename T,
160requires(I == End - 1)
165template <std::size_t Begin, std::size_t End,
typename... Ts>
170template <std::size_t Begin, std::size_t End,
typename T,
typename... Ts>
171requires (Begin < End)
173 if constexpr ((std::is_same_v<std::decay_t<T>, std::decay_t<Ts>>&&...)) {
174 auto extracted_data =
175 std::array<std::decay_t<T>, End - Begin>{};
176 return extract_to_array<0, Begin, End>(extracted_data,
178 std::forward<Ts>(ts)...);
181 return extract_to_tuple<0, Begin, End>(extracted_data,
183 std::forward<Ts>(ts)...);
Definition: variadic_helpers.h:9
static auto constexpr front_number
Definition: variadic_helpers.h:17
typename front_type_impl< Ts... >::type front_type
Definition: variadic_helpers.h:41
constexpr auto extract(T &&t, Ts &&... ts)
Extracts variadic data into an array in the Range of Begin and End.
Definition: variadic_helpers.h:172
constexpr auto extract_to_tuple(auto &extracted_data) -> auto &
Extracts variadic data into an array in the Range of Begin and End.
Definition: variadic_helpers.h:107
typename extract_helper_tuple_impl< 0, Begin, End, Ts... >::type extract_helper_tuple
Definition: variadic_helpers.h:167
static auto constexpr back_number
Definition: variadic_helpers.h:33
constexpr auto extract_to_array(auto &extracted_data) -> auto &
Extracts variadic data into an array in the Range of Begin and End.
Definition: variadic_helpers.h:85
static constexpr auto contains
Definition: variadic_helpers.h:81
static auto constexpr ith_number
Definition: variadic_helpers.h:68
typename back_type_impl< Ts... >::type back_type
Definition: variadic_helpers.h:57
typename tuple_concat_types_impl< Tuple1, Tuple2 >::type tuple_concat_types
Definition: tuple.h:139
Definition: variadic_helpers.h:20
typename back_type_impl< Ts... >::type type
Definition: variadic_helpers.h:53
T type
Definition: variadic_helpers.h:48
Definition: variadic_helpers.h:44
Definition: variadic_helpers.h:72
Definition: variadic_helpers.h:12
static auto constexpr value
Definition: variadic_helpers.h:13
Definition: variadic_helpers.h:36
T type
Definition: variadic_helpers.h:37
Definition: variadic_helpers.h:60
static auto constexpr value
Definition: variadic_helpers.h:61