20#ifndef REALM_DYNAMIC_TEMPLATES_H
21#define REALM_DYNAMIC_TEMPLATES_H
26 namespace DynamicTemplates {
40 template <
typename _HEAD,
typename _TAIL>
45 template <
typename T1 = void,
typename T2 = void,
typename T3 = void,
46 typename T4 = void,
typename T5 = void,
typename T6 =
void>
52 struct TypeList<void, void, void, void, void, void> {
56 template <
typename _HEAD,
typename _TAIL>
62 template <
typename T,
typename ORIG = TypeListElem<HEAD, TAIL>>
66 template <
typename ORIG>
72 template <
typename T,
typename ORIG = TypeListElem<HEAD, TAIL>>
76 template <
typename ORIG>
82 template <
int N,
typename ORIG = TypeListElem<HEAD, TAIL>>
86 template <
typename ORIG>
95 sizeof(_HEAD) < _TAIL::MaxSize::value ? _TAIL::MaxSize::value : sizeof(_HEAD);
99 template <
size_t SIZE>
102 typename std::conditional<SIZE ==
sizeof(_HEAD), _HEAD,
108 template <
typename TARGET,
int N>
110 template <
typename T1>
111 static void demux(
int index, T1 arg1);
113 template <
typename T1,
typename T2>
114 static void demux(
int index, T1 arg1, T2 arg2);
116 template <
typename T1,
typename T2,
typename T3>
117 static void demux(
int index, T1 arg1, T2 arg2, T3 arg3);
119 template <
typename T1,
typename T2,
typename T3,
typename T4>
120 static void demux(
int index, T1 arg1, T2 arg2, T3 arg3, T4 arg4);
123 template <
typename TARGET,
typename T1>
124 static void demux(
int index, T1 arg1);
126 template <
typename TARGET,
typename T1,
typename T2>
127 static void demux(
int index, T1 arg1, T2 arg2);
129 template <
typename TARGET,
typename T1,
typename T2,
typename T3>
130 static void demux(
int index, T1 arg1, T2 arg2, T3 arg3);
132 template <
typename TARGET,
typename T1,
typename T2,
typename T3,
typename T4>
133 static void demux(
int index, T1 arg1, T2 arg2, T3 arg3, T4 arg4);
138 template <
typename T,
typename ORIG>
144 template <
typename T,
typename ORIG>
147 template <
typename T,
typename ORIG>
153 template <
typename ORIG>
155 template <
int N,
typename ORIG>
167 template <
size_t SIZE>
173 template <
typename TARGET,
int N>
175 template <
typename T1>
176 static void demux(
int index, T1 arg1);
178 template <
typename T1,
typename T2>
179 static void demux(
int index, T1 arg1, T2 arg2);
181 template <
typename T1,
typename T2,
typename T3>
182 static void demux(
int index, T1 arg1, T2 arg2, T3 arg3);
184 template <
typename T1,
typename T2,
typename T3,
typename T4>
185 static void demux(
int index, T1 arg1, T2 arg2, T3 arg3, T4 arg4);
204 static const int N = _N;
207 template <
typename TARGET,
int BASE,
int DELTA>
209 template <
typename T1>
210 static void demux(
int index, T1 arg1)
212 if(index == (BASE + DELTA))
213 TARGET::template demux<Int<BASE + DELTA>>(arg1);
215 IntDemuxHelper<TARGET, BASE, DELTA - 1>::template demux<T1>(index, arg1);
218 template <
typename T1,
typename T2>
219 static void demux(
int index, T1 arg1, T2 arg2)
221 if(index == (BASE + DELTA))
222 TARGET::template demux<Int<BASE + DELTA>>(arg1, arg2);
224 IntDemuxHelper<TARGET, BASE, DELTA - 1>::template demux<T1, T2>(index, arg1,
228 template <
typename T1,
typename T2,
typename T3>
229 static void demux(
int index, T1 arg1, T2 arg2, T3 arg3)
231 if(index == (BASE + DELTA))
232 TARGET::template demux<Int<BASE + DELTA>>(arg1, arg2, arg3);
234 IntDemuxHelper<TARGET, BASE, DELTA - 1>::template demux<T1, T2, T3>(index, arg1,
238 template <
typename T1,
typename T2,
typename T3,
typename T4>
239 static void demux(
int index, T1 arg1, T2 arg2, T3 arg3, T4 arg4)
241 if(index == (BASE + DELTA))
242 TARGET::template demux<Int<BASE + DELTA>>(arg1, arg2, arg3, arg4);
244 IntDemuxHelper<TARGET, BASE, DELTA - 1>::template demux<T1, T2, T3, T4>(
245 index, arg1, arg2, arg3, arg4);
249 template <
typename TARGET,
int BASE>
251 template <
typename T1>
252 static void demux(
int index, T1 arg1)
254 TARGET::template demux<Int<BASE>>(arg1);
257 template <
typename T1,
typename T2>
258 static void demux(
int index, T1 arg1, T2 arg2)
260 TARGET::template demux<Int<BASE>>(arg1, arg2);
263 template <
typename T1,
typename T2,
typename T3>
264 static void demux(
int index, T1 arg1, T2 arg2, T3 arg3)
266 TARGET::template demux<Int<BASE>>(arg1, arg2, arg3);
269 template <
typename T1,
typename T2,
typename T3,
typename T4>
270 static void demux(
int index, T1 arg1, T2 arg2, T3 arg3, T4 arg4)
272 TARGET::template demux<Int<BASE>>(arg1, arg2, arg3, arg4);
276 template <
int MIN,
int MAX>
280 static const bool value = (MIN <= N) && (N <= MAX);
286 template <
int N,
bool OK>
297 template <
typename T>
307 template <
typename TARGET,
typename T1>
308 static void demux(
int index, T1 arg1);
310 template <
typename TARGET,
typename T1,
typename T2>
311 static void demux(
int index, T1 arg1, T2 arg2);
313 template <
typename TARGET,
typename T1,
typename T2,
typename T3>
314 static void demux(
int index, T1 arg1, T2 arg2, T3 arg3);
316 template <
typename TARGET,
typename T1,
typename T2,
typename T3,
typename T4>
317 static void demux(
int index, T1 arg1, T2 arg2, T3 arg3, T4 arg4);
331 template <
typename L1,
typename L2>
333 template <
typename T1,
typename T2>
336 template <
typename TARGET,
typename T1>
338 template <
typename T2,
typename A1>
341 template <
typename T2,
typename A1,
typename A2>
342 static void demux(A1 arg1, A2 arg2);
344 template <
typename T2,
typename A1,
typename A2,
typename A3>
345 static void demux(A1 arg1, A2 arg2, A3 arg3);
348 template <
typename TARGET>
350 template <
typename T1,
typename A1>
353 template <
typename T1,
typename A1,
typename A2>
356 template <
typename T1,
typename A1,
typename A2,
typename A3>
360 template <
typename TARGET,
typename A1>
363 template <
typename TARGET,
typename A1,
typename A2>
366 template <
typename TARGET,
typename A1,
typename A2,
typename A3>
370 template <
typename L1,
typename L2,
typename L3>
372 template <
typename T1,
typename T2,
typename T3>
375 template <
typename TARGET,
typename T1,
typename T2>
377 template <
typename T3,
typename A1>
380 template <
typename T3,
typename A1,
typename A2>
381 static void demux(A1 arg1, A2 arg2);
383 template <
typename T3,
typename A1,
typename A2,
typename A3>
384 static void demux(A1 arg1, A2 arg2, A3 arg3);
387 template <
typename TARGET,
typename T1>
389 template <
typename T2,
typename A1>
392 template <
typename T2,
typename A1,
typename A2>
395 template <
typename T2,
typename A1,
typename A2,
typename A3>
399 template <
typename TARGET>
401 template <
typename T1,
typename A1>
404 template <
typename T1,
typename A1,
typename A2>
407 template <
typename T1,
typename A1,
typename A2,
typename A3>
411 template <
typename TARGET,
typename A1>
414 template <
typename TARGET,
typename A1,
typename A2>
417 template <
typename TARGET,
typename A1,
typename A2,
typename A3>
421 template <
typename L1,
typename L2,
typename L3,
typename L4>
423 template <
typename T1,
typename T2,
typename T3,
typename T4>
426 template <
typename TARGET,
typename T1,
typename T2,
typename T3>
428 template <
typename T4,
typename A1>
431 template <
typename T4,
typename A1,
typename A2>
432 static void demux(A1 arg1, A2 arg2);
434 template <
typename T4,
typename A1,
typename A2,
typename A3>
435 static void demux(A1 arg1, A2 arg2, A3 arg3);
438 template <
typename TARGET,
typename T1,
typename T2>
440 template <
typename T3,
typename A1>
443 template <
typename T3,
typename A1,
typename A2>
446 template <
typename T3,
typename A1,
typename A2,
typename A3>
450 template <
typename TARGET,
typename T1>
452 template <
typename T2,
typename A1>
455 template <
typename T2,
typename A1,
typename A2>
458 template <
typename T2,
typename A1,
typename A2,
typename A3>
462 template <
typename TARGET>
464 template <
typename T1,
typename A1>
467 template <
typename T1,
typename A1,
typename A2>
470 template <
typename T1,
typename A1,
typename A2,
typename A3>
474 template <
typename TARGET,
typename A1>
477 template <
typename TARGET,
typename A1,
typename A2>
480 template <
typename TARGET,
typename A1,
typename A2,
typename A3>
488#include "realm/dynamic_templates.inl"
#define REALM_CUDA_HD
Definition compiler_support.h:95
unsigned TagType
Definition dynamic_templates.h:329
Definition activemsg.h:38
static void demux(int index, T1 arg1, T2 arg2, T3 arg3)
Definition dynamic_templates.h:264
static void demux(int index, T1 arg1, T2 arg2, T3 arg3, T4 arg4)
Definition dynamic_templates.h:270
static void demux(int index, T1 arg1, T2 arg2)
Definition dynamic_templates.h:258
static void demux(int index, T1 arg1)
Definition dynamic_templates.h:252
Definition dynamic_templates.h:208
static void demux(int index, T1 arg1, T2 arg2, T3 arg3, T4 arg4)
Definition dynamic_templates.h:239
static void demux(int index, T1 arg1, T2 arg2)
Definition dynamic_templates.h:219
static void demux(int index, T1 arg1)
Definition dynamic_templates.h:210
static void demux(int index, T1 arg1, T2 arg2, T3 arg3)
Definition dynamic_templates.h:229
Definition dynamic_templates.h:284
Definition dynamic_templates.h:303
TypeIndexHelper< N, TypePresent< N >::value >::TYPE TYPE
Definition dynamic_templates.h:304
Int< N > TYPE
Definition dynamic_templates.h:294
Definition dynamic_templates.h:287
ERROR_INT_NOT_IN_LIST< N >::TYPE TYPE
Definition dynamic_templates.h:289
static const int INDEX
Definition dynamic_templates.h:288
Definition dynamic_templates.h:279
static const bool value
Definition dynamic_templates.h:280
Definition dynamic_templates.h:298
static const int INDEX
Definition dynamic_templates.h:299
Definition dynamic_templates.h:277
static void demux(int index, T1 arg1)
static void demux(int index, T1 arg1, T2 arg2, T3 arg3)
static void demux(int index, T1 arg1, T2 arg2, T3 arg3, T4 arg4)
static void demux(int index, T1 arg1, T2 arg2)
Definition dynamic_templates.h:203
static const int N
Definition dynamic_templates.h:204
Definition dynamic_templates.h:349
static void demux(TagType tag, A1 arg1, A2 arg2, A3 arg3)
static void demux(TagType tag, A1 arg1, A2 arg2)
static void demux(TagType tag, A1 arg1)
Definition dynamic_templates.h:337
static void demux(A1 arg1, A2 arg2)
static void demux(A1 arg1)
static void demux(A1 arg1, A2 arg2, A3 arg3)
Definition dynamic_templates.h:332
static void demux(TagType tag, A1 arg1, A2 arg2, A3 arg3)
static void demux(TagType tag, A1 arg1)
static void demux(TagType tag, A1 arg1, A2 arg2)
static REALM_CUDA_HD constexpr TagType encode_tag(void)
Definition dynamic_templates.h:400
static void demux(TagType tag, A1 arg1, A2 arg2)
static void demux(TagType tag, A1 arg1)
static void demux(TagType tag, A1 arg1, A2 arg2, A3 arg3)
Definition dynamic_templates.h:388
static void demux(TagType tag, A1 arg1, A2 arg2)
static void demux(TagType tag, A1 arg1)
static void demux(TagType tag, A1 arg1, A2 arg2, A3 arg3)
Definition dynamic_templates.h:376
static void demux(A1 arg1)
static void demux(A1 arg1, A2 arg2, A3 arg3)
static void demux(A1 arg1, A2 arg2)
Definition dynamic_templates.h:371
static void demux(TagType tag, A1 arg1, A2 arg2)
static REALM_CUDA_HD constexpr TagType encode_tag(void)
static void demux(TagType tag, A1 arg1, A2 arg2, A3 arg3)
static void demux(TagType tag, A1 arg1)
Definition dynamic_templates.h:463
static void demux(TagType tag, A1 arg1, A2 arg2, A3 arg3)
static void demux(TagType tag, A1 arg1, A2 arg2)
static void demux(TagType tag, A1 arg1)
Definition dynamic_templates.h:451
static void demux(TagType tag, A1 arg1, A2 arg2)
static void demux(TagType tag, A1 arg1, A2 arg2, A3 arg3)
static void demux(TagType tag, A1 arg1)
Definition dynamic_templates.h:439
static void demux(TagType tag, A1 arg1)
static void demux(TagType tag, A1 arg1, A2 arg2)
static void demux(TagType tag, A1 arg1, A2 arg2, A3 arg3)
Definition dynamic_templates.h:427
static void demux(A1 arg1, A2 arg2, A3 arg3)
static void demux(A1 arg1)
static void demux(A1 arg1, A2 arg2)
Definition dynamic_templates.h:422
static void demux(TagType tag, A1 arg1)
static REALM_CUDA_HD constexpr TagType encode_tag(void)
static void demux(TagType tag, A1 arg1, A2 arg2, A3 arg3)
static void demux(TagType tag, A1 arg1, A2 arg2)
Definition dynamic_templates.h:109
static void demux(int index, T1 arg1)
static void demux(int index, T1 arg1, T2 arg2)
static void demux(int index, T1 arg1, T2 arg2, T3 arg3, T4 arg4)
static void demux(int index, T1 arg1, T2 arg2, T3 arg3)
_HEAD TYPE
Definition dynamic_templates.h:88
Definition dynamic_templates.h:83
_TAIL::template IndexToType< N-1, ORIG >::TYPE TYPE
Definition dynamic_templates.h:84
Definition dynamic_templates.h:100
std::conditional< SIZE==sizeof(_HEAD), _HEAD, typename_TAIL::templateMaxSizeType< SIZE > >::type TYPE
Definition dynamic_templates.h:104
Definition dynamic_templates.h:92
static constexpr size_t value
Definition dynamic_templates.h:94
Definition dynamic_templates.h:63
static const bool value
Definition dynamic_templates.h:64
Definition dynamic_templates.h:73
static const int INDEX
Definition dynamic_templates.h:74
Definition dynamic_templates.h:57
_TAIL TAIL
Definition dynamic_templates.h:59
static void demux(int index, T1 arg1, T2 arg2, T3 arg3, T4 arg4)
static void demux(int index, T1 arg1, T2 arg2, T3 arg3)
static void demux(int index, T1 arg1)
_HEAD HEAD
Definition dynamic_templates.h:58
static void demux(int index, T1 arg1, T2 arg2)
Definition dynamic_templates.h:174
static void demux(int index, T1 arg1, T2 arg2, T3 arg3, T4 arg4)
static void demux(int index, T1 arg1, T2 arg2, T3 arg3)
static void demux(int index, T1 arg1)
static void demux(int index, T1 arg1, T2 arg2)
Definition dynamic_templates.h:154
Definition dynamic_templates.h:165
Definition dynamic_templates.h:145
Definition dynamic_templates.h:156
static const int INDEX
Definition dynamic_templates.h:157
Definition dynamic_templates.h:168
ERROR_SIZE_NOT_IN_LIST TYPE
Definition dynamic_templates.h:169
Definition dynamic_templates.h:161
static constexpr size_t value
Definition dynamic_templates.h:162
Definition dynamic_templates.h:139
static const bool value
Definition dynamic_templates.h:140
Definition dynamic_templates.h:148
static const int INDEX
Definition dynamic_templates.h:149
Definition dynamic_templates.h:136
TypeListTerm TL
Definition dynamic_templates.h:53
Definition dynamic_templates.h:47
TypeListElem< T1, typename TypeList< T2, T3, T4, T5, T6 >::TL > TL
Definition dynamic_templates.h:48