Skip to content

Commit 397ca53

Browse files
committed
DPL: speedup homogeneous_apply_ref
Adding the requires statement should reduce greatly work done by the compiler to build and then optimise out the if constexprs.
1 parent fe6fa35 commit 397ca53

File tree

1 file changed

+109
-13
lines changed

1 file changed

+109
-13
lines changed

Framework/Foundation/include/Framework/StructToTuple.h

Lines changed: 109 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -163,13 +163,19 @@ consteval auto brace_constructible_size(auto... Members)
163163
return std::array<decltype(l(p0)), d##0>{DPL_FENUM_##d##0(l, p, )}; \
164164
}
165165

166-
template <bool B = false, typename L, class T>
167-
auto homogeneous_apply_refs(L l, T&& object)
166+
template <bool B, typename T>
167+
consteval int nested_brace_constructible_size()
168168
{
169169
using type = std::decay_t<T>;
170170
constexpr int nesting = B ? 1 : 0;
171-
constexpr unsigned long numElements = brace_constructible_size<type>() - nesting;
172-
static_assert(numElements < 99, "Too many elements in the struct");
171+
return brace_constructible_size<type>() - nesting;
172+
}
173+
174+
template <bool B = false, typename L, class T, int D = nested_brace_constructible_size<B, T>() / 10>
175+
requires(D == 9)
176+
auto homogeneous_apply_refs(L l, T&& object)
177+
{
178+
constexpr int numElements = nested_brace_constructible_size<B, T>();
173179
// clang-format off
174180
if DPL_HOMOGENEOUS_APPLY_ENTRY (9, 9)
175181
else if DPL_HOMOGENEOUS_APPLY_ENTRY (9, 8)
@@ -181,7 +187,17 @@ auto homogeneous_apply_refs(L l, T&& object)
181187
else if DPL_HOMOGENEOUS_APPLY_ENTRY (9, 2)
182188
else if DPL_HOMOGENEOUS_APPLY_ENTRY (9, 1)
183189
else if DPL_HOMOGENEOUS_APPLY_ENTRY_TENS (9)
184-
else if DPL_HOMOGENEOUS_APPLY_ENTRY (8, 9)
190+
else { return std::array<bool,0>(); }
191+
// clang-format on
192+
}
193+
194+
template <bool B = false, typename L, class T, int D = nested_brace_constructible_size<B, T>() / 10>
195+
requires(D == 8)
196+
auto homogeneous_apply_refs(L l, T&& object)
197+
{
198+
constexpr int numElements = nested_brace_constructible_size<B, T>();
199+
// clang-format off
200+
if DPL_HOMOGENEOUS_APPLY_ENTRY (8, 9)
185201
else if DPL_HOMOGENEOUS_APPLY_ENTRY (8, 8)
186202
else if DPL_HOMOGENEOUS_APPLY_ENTRY (8, 7)
187203
else if DPL_HOMOGENEOUS_APPLY_ENTRY (8, 6)
@@ -191,7 +207,17 @@ auto homogeneous_apply_refs(L l, T&& object)
191207
else if DPL_HOMOGENEOUS_APPLY_ENTRY (8, 2)
192208
else if DPL_HOMOGENEOUS_APPLY_ENTRY (8, 1)
193209
else if DPL_HOMOGENEOUS_APPLY_ENTRY_TENS (8)
194-
else if DPL_HOMOGENEOUS_APPLY_ENTRY (7, 9)
210+
else { return std::array<bool,0>(); }
211+
// clang-format on
212+
}
213+
214+
template <bool B = false, typename L, class T, int D = nested_brace_constructible_size<B, T>() / 10>
215+
requires(D == 7)
216+
auto homogeneous_apply_refs(L l, T&& object)
217+
{
218+
constexpr int numElements = nested_brace_constructible_size<B, T>();
219+
// clang-format off
220+
if DPL_HOMOGENEOUS_APPLY_ENTRY (7, 9)
195221
else if DPL_HOMOGENEOUS_APPLY_ENTRY (7, 8)
196222
else if DPL_HOMOGENEOUS_APPLY_ENTRY (7, 7)
197223
else if DPL_HOMOGENEOUS_APPLY_ENTRY (7, 6)
@@ -201,7 +227,17 @@ auto homogeneous_apply_refs(L l, T&& object)
201227
else if DPL_HOMOGENEOUS_APPLY_ENTRY (7, 2)
202228
else if DPL_HOMOGENEOUS_APPLY_ENTRY (7, 1)
203229
else if DPL_HOMOGENEOUS_APPLY_ENTRY_TENS (7)
204-
else if DPL_HOMOGENEOUS_APPLY_ENTRY (6, 9)
230+
else { return std::array<bool,0>(); }
231+
// clang-format on
232+
}
233+
234+
template <bool B = false, typename L, class T, int D = nested_brace_constructible_size<B, T>() / 10>
235+
requires(D == 6)
236+
auto homogeneous_apply_refs(L l, T&& object)
237+
{
238+
constexpr int numElements = nested_brace_constructible_size<B, T>();
239+
// clang-format off
240+
if DPL_HOMOGENEOUS_APPLY_ENTRY (6, 9)
205241
else if DPL_HOMOGENEOUS_APPLY_ENTRY (6, 8)
206242
else if DPL_HOMOGENEOUS_APPLY_ENTRY (6, 7)
207243
else if DPL_HOMOGENEOUS_APPLY_ENTRY (6, 6)
@@ -211,7 +247,17 @@ auto homogeneous_apply_refs(L l, T&& object)
211247
else if DPL_HOMOGENEOUS_APPLY_ENTRY (6, 2)
212248
else if DPL_HOMOGENEOUS_APPLY_ENTRY (6, 1)
213249
else if DPL_HOMOGENEOUS_APPLY_ENTRY_TENS (6)
214-
else if DPL_HOMOGENEOUS_APPLY_ENTRY (5, 9)
250+
else { return std::array<bool,0>(); }
251+
// clang-format on
252+
}
253+
254+
template <bool B = false, typename L, class T, int D = nested_brace_constructible_size<B, T>() / 10>
255+
requires(D == 5)
256+
auto homogeneous_apply_refs(L l, T&& object)
257+
{
258+
constexpr int numElements = nested_brace_constructible_size<B, T>();
259+
// clang-format off
260+
if DPL_HOMOGENEOUS_APPLY_ENTRY (5, 9)
215261
else if DPL_HOMOGENEOUS_APPLY_ENTRY (5, 8)
216262
else if DPL_HOMOGENEOUS_APPLY_ENTRY (5, 7)
217263
else if DPL_HOMOGENEOUS_APPLY_ENTRY (5, 6)
@@ -221,7 +267,17 @@ auto homogeneous_apply_refs(L l, T&& object)
221267
else if DPL_HOMOGENEOUS_APPLY_ENTRY (5, 2)
222268
else if DPL_HOMOGENEOUS_APPLY_ENTRY (5, 1)
223269
else if DPL_HOMOGENEOUS_APPLY_ENTRY_TENS (5)
224-
else if DPL_HOMOGENEOUS_APPLY_ENTRY (4, 9)
270+
else { return std::array<bool,0>(); }
271+
// clang-format on
272+
}
273+
274+
template <bool B = false, typename L, class T, int D = nested_brace_constructible_size<B, T>() / 10>
275+
requires(D == 4)
276+
auto homogeneous_apply_refs(L l, T&& object)
277+
{
278+
constexpr int numElements = nested_brace_constructible_size<B, T>();
279+
// clang-format off
280+
if DPL_HOMOGENEOUS_APPLY_ENTRY (4, 9)
225281
else if DPL_HOMOGENEOUS_APPLY_ENTRY (4, 8)
226282
else if DPL_HOMOGENEOUS_APPLY_ENTRY (4, 7)
227283
else if DPL_HOMOGENEOUS_APPLY_ENTRY (4, 6)
@@ -231,7 +287,17 @@ auto homogeneous_apply_refs(L l, T&& object)
231287
else if DPL_HOMOGENEOUS_APPLY_ENTRY (4, 2)
232288
else if DPL_HOMOGENEOUS_APPLY_ENTRY (4, 1)
233289
else if DPL_HOMOGENEOUS_APPLY_ENTRY_TENS (4)
234-
else if DPL_HOMOGENEOUS_APPLY_ENTRY (3, 9)
290+
else { return std::array<bool,0>(); }
291+
// clang-format on
292+
}
293+
294+
template <bool B = false, typename L, class T, int D = nested_brace_constructible_size<B, T>() / 10>
295+
requires(D == 3)
296+
auto homogeneous_apply_refs(L l, T&& object)
297+
{
298+
constexpr int numElements = nested_brace_constructible_size<B, T>();
299+
// clang-format off
300+
if DPL_HOMOGENEOUS_APPLY_ENTRY (3, 9)
235301
else if DPL_HOMOGENEOUS_APPLY_ENTRY (3, 8)
236302
else if DPL_HOMOGENEOUS_APPLY_ENTRY (3, 7)
237303
else if DPL_HOMOGENEOUS_APPLY_ENTRY (3, 6)
@@ -241,7 +307,17 @@ auto homogeneous_apply_refs(L l, T&& object)
241307
else if DPL_HOMOGENEOUS_APPLY_ENTRY (3, 2)
242308
else if DPL_HOMOGENEOUS_APPLY_ENTRY (3, 1)
243309
else if DPL_HOMOGENEOUS_APPLY_ENTRY_TENS (3)
244-
else if DPL_HOMOGENEOUS_APPLY_ENTRY (2, 9)
310+
else { return std::array<bool,0>(); }
311+
// clang-format on
312+
}
313+
314+
template <bool B = false, typename L, class T, int D = nested_brace_constructible_size<B, T>() / 10>
315+
requires(D == 2)
316+
auto homogeneous_apply_refs(L l, T&& object)
317+
{
318+
constexpr int numElements = nested_brace_constructible_size<B, T>();
319+
// clang-format off
320+
if DPL_HOMOGENEOUS_APPLY_ENTRY (2, 9)
245321
else if DPL_HOMOGENEOUS_APPLY_ENTRY (2, 8)
246322
else if DPL_HOMOGENEOUS_APPLY_ENTRY (2, 7)
247323
else if DPL_HOMOGENEOUS_APPLY_ENTRY (2, 6)
@@ -251,7 +327,17 @@ auto homogeneous_apply_refs(L l, T&& object)
251327
else if DPL_HOMOGENEOUS_APPLY_ENTRY (2, 2)
252328
else if DPL_HOMOGENEOUS_APPLY_ENTRY (2, 1)
253329
else if DPL_HOMOGENEOUS_APPLY_ENTRY_TENS (2)
254-
else if DPL_HOMOGENEOUS_APPLY_ENTRY (1, 9)
330+
else { return std::array<bool,0>(); }
331+
// clang-format on
332+
}
333+
334+
template <bool B = false, typename L, class T, int D = nested_brace_constructible_size<B, T>() / 10>
335+
requires(D == 1)
336+
auto homogeneous_apply_refs(L l, T&& object)
337+
{
338+
constexpr int numElements = nested_brace_constructible_size<B, T>();
339+
// clang-format off
340+
if DPL_HOMOGENEOUS_APPLY_ENTRY (1, 9)
255341
else if DPL_HOMOGENEOUS_APPLY_ENTRY (1, 8)
256342
else if DPL_HOMOGENEOUS_APPLY_ENTRY (1, 7)
257343
else if DPL_HOMOGENEOUS_APPLY_ENTRY (1, 6)
@@ -261,7 +347,17 @@ auto homogeneous_apply_refs(L l, T&& object)
261347
else if DPL_HOMOGENEOUS_APPLY_ENTRY (1, 2)
262348
else if DPL_HOMOGENEOUS_APPLY_ENTRY (1, 1)
263349
else if DPL_HOMOGENEOUS_APPLY_ENTRY_TENS (1)
264-
else if DPL_HOMOGENEOUS_APPLY_ENTRY_LOW (9)
350+
else { return std::array<bool,0>(); }
351+
// clang-format on
352+
}
353+
354+
template <bool B = false, typename L, class T, int D = nested_brace_constructible_size<B, T>() / 10>
355+
requires(D == 0)
356+
auto homogeneous_apply_refs(L l, T&& object)
357+
{
358+
constexpr int numElements = nested_brace_constructible_size<B, T>();
359+
// clang-format off
360+
if DPL_HOMOGENEOUS_APPLY_ENTRY_LOW (9)
265361
else if DPL_HOMOGENEOUS_APPLY_ENTRY_LOW (8)
266362
else if DPL_HOMOGENEOUS_APPLY_ENTRY_LOW (7)
267363
else if DPL_HOMOGENEOUS_APPLY_ENTRY_LOW (6)

0 commit comments

Comments
 (0)