Plasma Engine  2.0
Loading...
Searching...
No Matches
BlackMagic.h
1#pragma once
2
4
8#ifndef PL_VA_NUM_ARGS
9# define PL_VA_NUM_ARGS(...) PL_VA_NUM_ARGS_HELPER(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1)
10
11# define PL_VA_NUM_ARGS_HELPER(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, N, ...) N
12#endif
13
14
15#define PL_CALL_MACRO(macro, args) macro args
16
17
18#define PL_EXPAND_ARGS_1(op, a0) op(a0)
19#define PL_EXPAND_ARGS_2(op, a0, a1) op(a0) op(a1)
20#define PL_EXPAND_ARGS_3(op, a0, a1, a2) op(a0) op(a1) op(a2)
21#define PL_EXPAND_ARGS_4(op, a0, a1, a2, a3) op(a0) op(a1) op(a2) op(a3)
22#define PL_EXPAND_ARGS_5(op, a0, a1, a2, a3, a4) op(a0) op(a1) op(a2) op(a3) op(a4)
23#define PL_EXPAND_ARGS_6(op, a0, a1, a2, a3, a4, a5) op(a0) op(a1) op(a2) op(a3) op(a4) op(a5)
24#define PL_EXPAND_ARGS_7(op, a0, a1, a2, a3, a4, a5, a6) op(a0) op(a1) op(a2) op(a3) op(a4) op(a5) op(a6)
25#define PL_EXPAND_ARGS_8(op, a0, a1, a2, a3, a4, a5, a6, a7) op(a0) op(a1) op(a2) op(a3) op(a4) op(a5) op(a6) op(a7)
26#define PL_EXPAND_ARGS_9(op, a0, a1, a2, a3, a4, a5, a6, a7, a8) op(a0) op(a1) op(a2) op(a3) op(a4) op(a5) op(a6) op(a7) op(a8)
27#define PL_EXPAND_ARGS_10(op, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) op(a0) op(a1) op(a2) op(a3) op(a4) op(a5) op(a6) op(a7) op(a8) op(a9)
28#define PL_EXPAND_ARGS_11(op, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) \
29 op(a0) op(a1) op(a2) op(a3) op(a4) op(a5) op(a6) op(a7) op(a8) op(a9) op(a10)
30#define PL_EXPAND_ARGS_12(op, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) \
31 op(a0) op(a1) op(a2) op(a3) op(a4) op(a5) op(a6) op(a7) op(a8) op(a9) op(a10) op(a11)
32
35#define PL_EXPAND_ARGS(op, ...) PL_CALL_MACRO(PL_PP_CONCAT(PL_EXPAND_ARGS_, PL_VA_NUM_ARGS(__VA_ARGS__)), (op, __VA_ARGS__))
36
38
39#define PL_EXPAND_ARGS_COMMA_1(a0) a0
40#define PL_EXPAND_ARGS_COMMA_2(a0, a1) a0, a1
41#define PL_EXPAND_ARGS_COMMA_3(a0, a1, a2) a0, a1, a2
42#define PL_EXPAND_ARGS_COMMA_4(a0, a1, a2, a3) a0, a1, a2, a3
43#define PL_EXPAND_ARGS_COMMA_5(a0, a1, a2, a3, a4) a0, a1, a2, a3, a4
44#define PL_EXPAND_ARGS_COMMA_6(a0, a1, a2, a3, a4, a5) a0, a1, a2, a3, a4, a5
45#define PL_EXPAND_ARGS_COMMA_7(a0, a1, a2, a3, a4, a5, a6) a0 a1, a2, a3, a4, a5, a6
46#define PL_EXPAND_ARGS_COMMA_8(a0, a1, a2, a3, a4, a5, a6, a7) a0, a1, a2, a3, a4, a5, a6, a7
47#define PL_EXPAND_ARGS_COMMA_9(a0, a1, a2, a3, a4, a5, a6, a7, a8) a0, a1, a2, a3, a4, a5, a6, a7, a8
48#define PL_EXPAND_ARGS_COMMA_10(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) a0, a1, a2, a3, a4, a5, a6, a7, a8, a9
49#define PL_EXPAND_ARGS_COMMA_11(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10
50#define PL_EXPAND_ARGS_COMMA_12(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11
51
54#define PL_EXPAND_ARGS_COMMA(...) PL_CALL_MACRO(PL_PP_CONCAT(PL_EXPAND_ARGS_COMMA_, PL_VA_NUM_ARGS(__VA_ARGS__)), (__VA_ARGS__))
55
57#define PL_EXPAND_ARGS_WITH_INDEX_1(op, a0) op(a0, 0)
58#define PL_EXPAND_ARGS_WITH_INDEX_2(op, a0, a1) op(a0, 0) op(a1, 1)
59#define PL_EXPAND_ARGS_WITH_INDEX_3(op, a0, a1, a2) op(a0, 0) op(a1, 1) op(a2, 2)
60#define PL_EXPAND_ARGS_WITH_INDEX_4(op, a0, a1, a2, a3) op(a0, 0) op(a1, 1) op(a2, 2) op(a3, 3)
61#define PL_EXPAND_ARGS_WITH_INDEX_5(op, a0, a1, a2, a3, a4) op(a0, 0) op(a1, 1) op(a2, 2) op(a3, 3) op(a4, 4)
62#define PL_EXPAND_ARGS_WITH_INDEX_6(op, a0, a1, a2, a3, a4, a5) op(a0, 0) op(a1, 1) op(a2, 2) op(a3, 3) op(a4, 4) op(a5, 5)
63#define PL_EXPAND_ARGS_WITH_INDEX_7(op, a0, a1, a2, a3, a4, a5, a6) op(a0, 0) op(a1, 1) op(a2, 2) op(a3, 3) op(a4, 4) op(a5, 5) op(a6, 6)
64#define PL_EXPAND_ARGS_WITH_INDEX_8(op, a0, a1, a2, a3, a4, a5, a6, a7) \
65 op(a0, 0) op(a1, 1) op(a2, 2) op(a3, 3) op(a4, 4) op(a5, 5) op(a6, 6) op(a7, 7)
66#define PL_EXPAND_ARGS_WITH_INDEX_9(op, a0, a1, a2, a3, a4, a5, a6, a7, a8) \
67 op(a0, 0) op(a1, 1) op(a2, 2) op(a3, 3) op(a4, 4) op(a5, 5) op(a6, 6) op(a7, 7) op(a8, 8)
68#define PL_EXPAND_ARGS_WITH_INDEX_10(op, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) \
69 op(a0, 0) op(a1, 1) op(a2, 2) op(a3, 3) op(a4, 4) op(a5, 5) op(a6, 6) op(a7, 7) op(a8, 8) op(a9, 9)
70
71#define PL_EXPAND_ARGS_WITH_INDEX(op, ...) PL_CALL_MACRO(PL_PP_CONCAT(PL_EXPAND_ARGS_WITH_INDEX_, PL_VA_NUM_ARGS(__VA_ARGS__)), (op, __VA_ARGS__))
72
74
75#define PL_EXPAND_ARGS_PAIR_1(...)
76#define PL_EXPAND_ARGS_PAIR_2(op, a0, a1) op(a0, a1)
77#define PL_EXPAND_ARGS_PAIR_3(op, a0, a1, ...) op(a0, a1)
78#define PL_EXPAND_ARGS_PAIR_4(op, a0, a1, a2, a3) op(a0, a1) op(a2, a3)
79#define PL_EXPAND_ARGS_PAIR_6(op, a0, a1, a2, a3, a4, a5) op(a0, a1) op(a2, a3) op(a4, a5)
80#define PL_EXPAND_ARGS_PAIR_8(op, a0, a1, a2, a3, a4, a5, a6, a7) op(a0, a1) op(a2, a3) op(a4, a5) op(a6, a7)
81#define PL_EXPAND_ARGS_PAIR_10(op, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) op(a0, a1) op(a2, a3) op(a4, a5) op(a6, a7) op(a8, a9)
82#define PL_EXPAND_ARGS_PAIR_12(op, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) \
83 op(a0, a1) op(a2, a3) op(a4, a5) op(a6, a7) op(a8, a9) op(a10, a11)
84#define PL_EXPAND_ARGS_PAIR_14(op, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13) \
85 op(a0, a1) op(a2, a3) op(a4, a5) op(a6, a7) op(a8, a9) op(a10, a11) op(a12, a13)
86#define PL_EXPAND_ARGS_PAIR_16(op, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15) \
87 op(a0, a1) op(a2, a3) op(a4, a5) op(a6, a7) op(a8, a9) op(a10, a11) op(a12, a13) op(a14, a15)
88#define PL_EXPAND_ARGS_PAIR_18(op, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17) \
89 op(a0, a1) op(a2, a3) op(a4, a5) op(a6, a7) op(a8, a9) op(a10, a11) op(a12, a13) op(a14, a15) op(a16, a17)
90#define PL_EXPAND_ARGS_PAIR_20(op, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19) \
91 op(a0, a1) op(a2, a3) op(a4, a5) op(a6, a7) op(a8, a9) op(a10, a11) op(a12, a13) op(a14, a15) op(a16, a17) op(a18, a19)
92
93#define PL_EXPAND_ARGS_PAIR(op, ...) PL_CALL_MACRO(PL_PP_CONCAT(PL_EXPAND_ARGS_PAIR_, PL_VA_NUM_ARGS(__VA_ARGS__)), (op, __VA_ARGS__))
94
96
97#define PL_EXPAND_ARGS_PAIR_COMMA_1(...) /* handles the case of zero parameters (e.g. an empty __VA_ARGS__) */
98#define PL_EXPAND_ARGS_PAIR_COMMA_2(op, a0, a1) op(a0, a1)
99#define PL_EXPAND_ARGS_PAIR_COMMA_3(op, a0, a1, ...) op(a0, a1)
100#define PL_EXPAND_ARGS_PAIR_COMMA_4(op, a0, a1, a2, a3) op(a0, a1), op(a2, a3)
101#define PL_EXPAND_ARGS_PAIR_COMMA_6(op, a0, a1, a2, a3, a4, a5) op(a0, a1), op(a2, a3), op(a4, a5)
102#define PL_EXPAND_ARGS_PAIR_COMMA_8(op, a0, a1, a2, a3, a4, a5, a6, a7) op(a0, a1), op(a2, a3), op(a4, a5), op(a6, a7)
103#define PL_EXPAND_ARGS_PAIR_COMMA_10(op, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) op(a0, a1), op(a2, a3), op(a4, a5), op(a6, a7), op(a8, a9)
104#define PL_EXPAND_ARGS_PAIR_COMMA_12(op, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) \
105 op(a0, a1), op(a2, a3), op(a4, a5), op(a6, a7), op(a8, a9), op(a10, a11)
106#define PL_EXPAND_ARGS_PAIR_COMMA_14(op, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13) \
107 op(a0, a1), op(a2, a3), op(a4, a5), op(a6, a7), op(a8, a9), op(a10, a11), op(a12, a13)
108#define PL_EXPAND_ARGS_PAIR_COMMA_16(op, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15) \
109 op(a0, a1), op(a2, a3), op(a4, a5), op(a6, a7), op(a8, a9), op(a10, a11), op(a12, a13), op(a14, a15)
110#define PL_EXPAND_ARGS_PAIR_COMMA_18(op, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17) \
111 op(a0, a1), op(a2, a3), op(a4, a5), op(a6, a7), op(a8, a9), op(a10, a11), op(a12, a13), op(a14, a15), op(a16, a17)
112#define PL_EXPAND_ARGS_PAIR_COMMA_20(op, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19) \
113 op(a0, a1), op(a2, a3), op(a4, a5), op(a6, a7), op(a8, a9), op(a10, a11), op(a12, a13), op(a14, a15), op(a16, a17), op(a18, a19)
114
115#define PL_EXPAND_ARGS_PAIR_COMMA(op, ...) PL_CALL_MACRO(PL_PP_CONCAT(PL_EXPAND_ARGS_PAIR_COMMA_, PL_VA_NUM_ARGS(__VA_ARGS__)), (op, __VA_ARGS__))
116
118
119#define PL_TO_BOOL_0 0
120#define PL_TO_BOOL_1 1
121#define PL_TO_BOOL_2 1
122#define PL_TO_BOOL_3 1
123#define PL_TO_BOOL_4 1
124#define PL_TO_BOOL_5 1
125#define PL_TO_BOOL_6 1
126#define PL_TO_BOOL_7 1
127#define PL_TO_BOOL_8 1
128#define PL_TO_BOOL_9 1
129
130#define PL_TO_BOOL(x) PL_PP_CONCAT(PL_TO_BOOL_, x)
131
133
134#define PL_IF_0(x)
135#define PL_IF_1(x) x
136#define PL_IF(cond, x) \
137 PL_PP_CONCAT(PL_IF_, PL_TO_BOOL(cond)) \
138 (x)
139
140#define PL_IF_ELSE_0(x, y) y
141#define PL_IF_ELSE_1(x, y) x
142#define PL_IF_ELSE(cond, x, y) \
143 PL_PP_CONCAT(PL_IF_ELSE_, PL_TO_BOOL(cond)) \
144 (x, y)
145
147
148#define PL_COMMA_MARK_0
149#define PL_COMMA_MARK_1 ,
150#define PL_COMMA_IF(cond) PL_PP_CONCAT(PL_COMMA_MARK_, PL_TO_BOOL(cond))
151
153
154#define PL_LIST_0(x)
155#define PL_LIST_1(x) PL_PP_CONCAT(x, 0)
156#define PL_LIST_2(x) PL_LIST_1(x), PL_PP_CONCAT(x, 1)
157#define PL_LIST_3(x) PL_LIST_2(x), PL_PP_CONCAT(x, 2)
158#define PL_LIST_4(x) PL_LIST_3(x), PL_PP_CONCAT(x, 3)
159#define PL_LIST_5(x) PL_LIST_4(x), PL_PP_CONCAT(x, 4)
160#define PL_LIST_6(x) PL_LIST_5(x), PL_PP_CONCAT(x, 5)
161#define PL_LIST_7(x) PL_LIST_6(x), PL_PP_CONCAT(x, 6)
162#define PL_LIST_8(x) PL_LIST_7(x), PL_PP_CONCAT(x, 7)
163#define PL_LIST_9(x) PL_LIST_8(x), PL_PP_CONCAT(x, 8)
164#define PL_LIST_10(x) PL_LIST_9(x), PL_PP_CONCAT(x, 9)
165
166#define PL_LIST(x, count) \
167 PL_PP_CONCAT(PL_LIST_, count) \
168 (x)
169
171
172#define PL_PAIR_LIST_0(x, y)
173#define PL_PAIR_LIST_1(x, y) \
174 PL_PP_CONCAT(x, 0) \
175 PL_PP_CONCAT(y, 0)
176#define PL_PAIR_LIST_2(x, y) PL_PAIR_LIST_1(x, y), PL_PP_CONCAT(x, 1) PL_PP_CONCAT(y, 1)
177#define PL_PAIR_LIST_3(x, y) PL_PAIR_LIST_2(x, y), PL_PP_CONCAT(x, 2) PL_PP_CONCAT(y, 2)
178#define PL_PAIR_LIST_4(x, y) PL_PAIR_LIST_3(x, y), PL_PP_CONCAT(x, 3) PL_PP_CONCAT(y, 3)
179#define PL_PAIR_LIST_5(x, y) PL_PAIR_LIST_4(x, y), PL_PP_CONCAT(x, 4) PL_PP_CONCAT(y, 4)
180#define PL_PAIR_LIST_6(x, y) PL_PAIR_LIST_5(x, y), PL_PP_CONCAT(x, 5) PL_PP_CONCAT(y, 5)
181#define PL_PAIR_LIST_7(x, y) PL_PAIR_LIST_6(x, y), PL_PP_CONCAT(x, 6) PL_PP_CONCAT(y, 6)
182#define PL_PAIR_LIST_8(x, y) PL_PAIR_LIST_7(x, y), PL_PP_CONCAT(x, 7) PL_PP_CONCAT(y, 7)
183#define PL_PAIR_LIST_9(x, y) PL_PAIR_LIST_8(x, y), PL_PP_CONCAT(x, 8) PL_PP_CONCAT(y, 8)
184#define PL_PAIR_LIST_10(x, y) PL_PAIR_LIST_9(x, y), PL_PP_CONCAT(x, 9) PL_PP_CONCAT(y, 9)
185
186#define PL_PAIR_LIST(x, y, count) \
187 PL_PP_CONCAT(PL_PAIR_LIST_, count) \
188 (x, y)