11#ifndef O2_FRAMEWORK_STRUCTTOTUPLE_H_
12#define O2_FRAMEWORK_STRUCTTOTUPLE_H_
20#if defined(__cpp_structured_bindings) && __cpp_structured_bindings >= 202411L
21#define DPL_STRUCTURED_BINDING_PACKS 1
24#ifndef DPL_STRUCTURED_BINDING_PACKS
27template <
class T,
typename... Args>
28decltype(
void(T{std::declval<Args>()...}), std::true_type())
31template <
class T,
typename... Args>
39#ifndef DPL_STRUCTURED_BINDING_PACKS
42 constexpr operator T();
45template <
class T,
typename... Args>
60 if constexpr (
requires { T{Members...}; } ==
false) {
61 static_assert(
sizeof...(Members) != 0,
"You need to make sure that you have implicit constructors or that you call the explicit constructor correctly.");
62 return sizeof...(Members) - 1;
64 return brace_constructible_size<T>(Members...,
UniversalType{});
68template <
bool B,
typename T>
71 using type = std::decay_t<T>;
72 constexpr int nesting =
B ? 1 : 0;
73 return brace_constructible_size<type>() - nesting;
79template <
bool B,
typename T>
82#ifdef DPL_STRUCTURED_BINDING_PACKS
85 return nested_brace_constructible_size<B, T>() / 10;
89#ifdef DPL_STRUCTURED_BINDING_PACKS
91#pragma clang diagnostic push
92#pragma clang diagnostic ignored "-Wc++26-extensions"
94template <
bool B = false,
class T,
int D = 0,
typename L>
98 if constexpr (
sizeof...(members) == 0) {
99 return std::array<bool, 0>();
101 return std::array{l(
members)...};
105#pragma clang diagnostic pop
110#define DPL_ENUM_0(pre, post)
111#define DPL_ENUM_1(pre, post) pre##0##post
112#define DPL_ENUM_2(pre, post) pre##0##post, pre##1##post
113#define DPL_ENUM_3(pre, post) pre##0##post, pre##1##post, pre##2##post
114#define DPL_ENUM_4(pre, post) pre##0##post, pre##1##post, pre##2##post, pre##3##post
115#define DPL_ENUM_5(pre, post) pre##0##post, pre##1##post, pre##2##post, pre##3##post, pre##4##post
116#define DPL_ENUM_6(pre, post) pre##0##post, pre##1##post, pre##2##post, pre##3##post, pre##4##post, pre##5##post
117#define DPL_ENUM_7(pre, post) pre##0##post, pre##1##post, pre##2##post, pre##3##post, pre##4##post, pre##5##post, pre##6##post
118#define DPL_ENUM_8(pre, post) pre##0##post, pre##1##post, pre##2##post, pre##3##post, pre##4##post, pre##5##post, pre##6##post, pre##7##post
119#define DPL_ENUM_9(pre, post) pre##0##post, pre##1##post, pre##2##post, pre##3##post, pre##4##post, pre##5##post, pre##6##post, pre##7##post, pre##8##post
120#define DPL_ENUM_10(pre, post) pre##0##post, pre##1##post, pre##2##post, pre##3##post, pre##4##post, pre##5##post, pre##6##post, pre##7##post, pre##8##post, pre##9##post
122#define DPL_ENUM_20(pre, post) DPL_ENUM_10(pre, post), DPL_ENUM_10(pre##1, post)
123#define DPL_ENUM_30(pre, post) DPL_ENUM_20(pre, post), DPL_ENUM_10(pre##2, post)
124#define DPL_ENUM_40(pre, post) DPL_ENUM_30(pre, post), DPL_ENUM_10(pre##3, post)
125#define DPL_ENUM_50(pre, post) DPL_ENUM_40(pre, post), DPL_ENUM_10(pre##4, post)
126#define DPL_ENUM_60(pre, post) DPL_ENUM_50(pre, post), DPL_ENUM_10(pre##5, post)
127#define DPL_ENUM_70(pre, post) DPL_ENUM_60(pre, post), DPL_ENUM_10(pre##6, post)
128#define DPL_ENUM_80(pre, post) DPL_ENUM_70(pre, post), DPL_ENUM_10(pre##7, post)
129#define DPL_ENUM_90(pre, post) DPL_ENUM_80(pre, post), DPL_ENUM_10(pre##8, post)
130#define DPL_ENUM_100(pre, post) DPL_ENUM_90(pre, post), DPL_ENUM_10(pre##9, post)
132#define DPL_ENUM(pre, post, d, u) DPL_ENUM_##d##0(pre, post), DPL_ENUM_##u(pre##d, post)
134#define DPL_FENUM_0(f, pre, post)
135#define DPL_FENUM_1(f, pre, post) f(pre##0##post)
136#define DPL_FENUM_2(f, pre, post) f(pre##0##post), f(pre##1##post)
137#define DPL_FENUM_3(f, pre, post) f(pre##0##post), f(pre##1##post), f(pre##2##post)
138#define DPL_FENUM_4(f, pre, post) f(pre##0##post), f(pre##1##post), f(pre##2##post), f(pre##3##post)
139#define DPL_FENUM_5(f, pre, post) f(pre##0##post), f(pre##1##post), f(pre##2##post), f(pre##3##post), f(pre##4##post)
140#define DPL_FENUM_6(f, pre, post) f(pre##0##post), f(pre##1##post), f(pre##2##post), f(pre##3##post), f(pre##4##post), f(pre##5##post)
141#define DPL_FENUM_7(f, pre, post) f(pre##0##post), f(pre##1##post), f(pre##2##post), f(pre##3##post), f(pre##4##post), f(pre##5##post), f(pre##6##post)
142#define DPL_FENUM_8(f, pre, post) f(pre##0##post), f(pre##1##post), f(pre##2##post), f(pre##3##post), f(pre##4##post), f(pre##5##post), f(pre##6##post), f(pre##7##post)
143#define DPL_FENUM_9(f, pre, post) f(pre##0##post), f(pre##1##post), f(pre##2##post), f(pre##3##post), f(pre##4##post), f(pre##5##post), f(pre##6##post), f(pre##7##post), f(pre##8##post)
144#define DPL_FENUM_10(f, pre, post) f(pre##0##post), f(pre##1##post), f(pre##2##post), f(pre##3##post), f(pre##4##post), f(pre##5##post), f(pre##6##post), f(pre##7##post), f(pre##8##post), f(pre##9##post)
146#define DPL_FENUM_20(f, pre, post) DPL_FENUM_10(f, pre, post), DPL_FENUM_10(f, pre##1, post)
147#define DPL_FENUM_30(f, pre, post) DPL_FENUM_20(f, pre, post), DPL_FENUM_10(f, pre##2, post)
148#define DPL_FENUM_40(f, pre, post) DPL_FENUM_30(f, pre, post), DPL_FENUM_10(f, pre##3, post)
149#define DPL_FENUM_50(f, pre, post) DPL_FENUM_40(f, pre, post), DPL_FENUM_10(f, pre##4, post)
150#define DPL_FENUM_60(f, pre, post) DPL_FENUM_50(f, pre, post), DPL_FENUM_10(f, pre##5, post)
151#define DPL_FENUM_70(f, pre, post) DPL_FENUM_60(f, pre, post), DPL_FENUM_10(f, pre##6, post)
152#define DPL_FENUM_80(f, pre, post) DPL_FENUM_70(f, pre, post), DPL_FENUM_10(f, pre##7, post)
153#define DPL_FENUM_90(f, pre, post) DPL_FENUM_80(f, pre, post), DPL_FENUM_10(f, pre##8, post)
154#define DPL_FENUM_100(f, pre, post) DPL_FENUM_90(f, pre, post), DPL_FENUM_10(f, pre##9, post)
156#define DPL_FENUM(f, pre, post, d, u) DPL_FENUM_##d##0(f, pre, post), DPL_FENUM_##u(f, pre##d, post)
158#define DPL_HOMOGENEOUS_APPLY_ENTRY_LOW(u) \
159 constexpr(numElements == u) \
161 auto&& [DPL_ENUM_##u(p, )] = object; \
162 return std::array<decltype(l(p0)), u>{DPL_FENUM_##u(l, p, )}; \
165#define DPL_HOMOGENEOUS_APPLY_ENTRY(d, u) \
166 constexpr(numElements == d##u) \
168 auto&& [DPL_ENUM(p, , d, u)] = object; \
169 return std::array<decltype(l(p0)), d##u>{DPL_FENUM(l, p, , d, u)}; \
172#define DPL_HOMOGENEOUS_APPLY_ENTRY_TENS(d) \
173 constexpr(numElements == d##0) \
175 auto&& [DPL_ENUM_##d##0(p, )] = object; \
176 return std::array<decltype(l(p0)), d##0>{DPL_FENUM_##d##0(l, p, )}; \
179template <bool B = false, class T, int D = nested_brace_constructible_size<B, T>() / 10,
typename L>
183 constexpr int numElements = nested_brace_constructible_size<B, T>();
195 else {
return std::array<bool,0>(); }
199template <bool B = false, class T, int D = nested_brace_constructible_size<B, T>() / 10,
typename L>
203 constexpr int numElements = nested_brace_constructible_size<B, T>();
215 else {
return std::array<bool,0>(); }
219template <bool B = false, class T, int D = nested_brace_constructible_size<B, T>() / 10,
typename L>
223 constexpr int numElements = nested_brace_constructible_size<B, T>();
235 else {
return std::array<bool,0>(); }
239template <bool B = false, class T, int D = nested_brace_constructible_size<B, T>() / 10,
typename L>
243 constexpr int numElements = nested_brace_constructible_size<B, T>();
255 else {
return std::array<bool,0>(); }
259template <bool B = false, class T, int D = nested_brace_constructible_size<B, T>() / 10,
typename L>
263 constexpr int numElements = nested_brace_constructible_size<B, T>();
275 else {
return std::array<bool,0>(); }
279template <bool B = false, class T, int D = nested_brace_constructible_size<B, T>() / 10,
typename L>
283 constexpr int numElements = nested_brace_constructible_size<B, T>();
295 else {
return std::array<bool,0>(); }
299template <bool B = false, class T, int D = nested_brace_constructible_size<B, T>() / 10,
typename L>
303 constexpr int numElements = nested_brace_constructible_size<B, T>();
315 else {
return std::array<bool,0>(); }
319template <bool B = false, class T, int D = nested_brace_constructible_size<B, T>() / 10,
typename L>
323 constexpr int numElements = nested_brace_constructible_size<B, T>();
335 else {
return std::array<bool,0>(); }
339template <bool B = false, class T, int D = nested_brace_constructible_size<B, T>() / 10,
typename L>
343 constexpr int numElements = nested_brace_constructible_size<B, T>();
355 else {
return std::array<bool,0>(); }
359template <bool B = false, class T, int D = nested_brace_constructible_size<B, T>() / 10,
typename L>
363 constexpr int numElements = nested_brace_constructible_size<B, T>();
374 else {
return std::array<bool,0>(); }
380template <
int D,
typename T,
typename L>
383 return homogeneous_apply_refs<false, T, D, L>(l,
object);
bounded_vector< int > members
#define DPL_HOMOGENEOUS_APPLY_ENTRY_TENS(d)
#define DPL_HOMOGENEOUS_APPLY_ENTRY(d, u)
#define DPL_HOMOGENEOUS_APPLY_ENTRY_LOW(u)
GLint GLint GLsizei GLint GLenum GLenum type
typedef void(APIENTRYP PFNGLCULLFACEPROC)(GLenum mode)
Defining ITS Vertex explicitly as messageable.
consteval int homogeneous_apply_refs_size()
consteval int nested_brace_constructible_size()
consteval auto brace_constructible_size(auto... Members)
constexpr auto homogeneous_apply_refs_sized(L l, T &&object)
constexpr auto homogeneous_apply_refs(L l, T &&object)