Loading...
Searching...
No Matches
40#define LMP_CAT(a, ...) LMP_PRIMITIVE_CAT(a, __VA_ARGS__)
41#define LMP_PRIMITIVE_CAT(a, ...) a##__VA_ARGS__
46#define LMP_IS_EXACTLY_TWO_ARGS(...) \
47 LMP_GET_FIRST_ARG(__VA_OPT__(LMP_IS_TWO_ARGS_IMPL1(__VA_ARGS__), ) 0)
48#define LMP_GET_FIRST_ARG(a, ...) a
49#define LMP_IS_TWO_ARGS_IMPL1(p1, ...) \
50 LMP_GET_FIRST_ARG(__VA_OPT__(LMP_IS_TWO_ARGS_IMPL2(__VA_ARGS__), ) 0)
51#define LMP_IS_TWO_ARGS_IMPL2(p1, ...) LMP_GET_FIRST_ARG(__VA_OPT__(0, ) 1)
55#define LMP_IS_ZERO(x) \
56 LMP_IS_EXACTLY_TWO_ARGS(LMP_PRIMITIVE_CAT(LMP_IS_ZERO_IMPL_, x))
57#define LMP_IS_ZERO_IMPL_0 0, 0
61#define LMP_EXPAND_LIST_IMPL(...) __VA_ARGS__
62#define LMP_EXPAND_LIST(...) LMP_EXPAND_LIST_IMPL __VA_ARGS__
63#define LMP_ADD_COMMA_IF_NONEMPTY(...) __VA_OPT__(__VA_ARGS__, )
64#define LMP_EXPAND_LIST_TRAIL_COMMA(...) \
65 LMP_ADD_COMMA_IF_NONEMPTY(LMP_EXPAND_LIST_IMPL __VA_ARGS__)
70#define LMP_IF_EQUAL_ZERO(cond) \
71 LMP_CAT(LMP_IF_EQUAL_ZERO_IMPL_, LMP_IS_ZERO(cond))
72#define LMP_IF_EQUAL_ZERO_IMPL_1(truebr, falsebr) LMP_EXPAND_LIST(truebr)
73#define LMP_IF_EQUAL_ZERO_IMPL_0(truebr, falsebr) LMP_EXPAND_LIST(falsebr)
77#define LMP_INC(x) LMP_PRIMITIVE_CAT(LMP_INC_, x)
101#define LMP_DEC(x) LMP_PRIMITIVE_CAT(LMP_DEC_, x)
126#define LMP_COUNT_ARGS(...) \
127 LMP_COUNT_ARGS_IMPL(__VA_ARGS__ __VA_OPT__(, ) LMP_COUNT_ARGS_IMPL_SEQ())
128#define LMP_COUNT_ARGS_IMPL(...) LMP_COUNT_ARGS_IMPL_GET_64TH_ARG(__VA_ARGS__)
129#define LMP_COUNT_ARGS_IMPL_GET_64TH_ARG( \
130 a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, \
131 a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, \
132 a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, a45, a46, \
133 a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, a59, a60, a61, \
136#define LMP_COUNT_ARGS_IMPL_SEQ() \
137 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, \
138 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, \
139 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, \
140 8, 7, 6, 5, 4, 3, 2, 1, 0
145#define LMP_LIST_ROTATION(a, b) LMP_LIST_ROTATION_IMPL1(LMP_EXPAND_LIST(a), b)
146#define LMP_LIST_ROTATION_IMPL1(...) LMP_LIST_ROTATION_IMPL2(__VA_ARGS__)
147#define LMP_LIST_ROTATION_IMPL2(a, ...) (__VA_ARGS__), LMP_EXPAND_LIST(a)
151#define LMP_CARTESIAN_IMPL_ENTRY(dimLeft, macro, vpack, ...) \
152 __VA_OPT__(LMP_CARTESIAN_IMPL_AGAIN_2 LMP_PARENS(dimLeft, macro, vpack, \
155#define LMP_CARTESIAN_EMIT_ONE(macro, ...) macro(__VA_ARGS__)
156#define LMP_CARTESIAN_EMIT_ONE_PARAMS(vpack, vfirst) \
157 LMP_EXPAND_LIST_TRAIL_COMMA(vpack) vfirst
159#define LMP_CARTESIAN_IMPL(dimLeft, macro, vpack, vfirst, ...) \
160 LMP_IF_EQUAL_ZERO(dimLeft) \
161 ((LMP_CARTESIAN_EMIT_ONE(macro, \
162 LMP_CARTESIAN_EMIT_ONE_PARAMS(vpack, vfirst))), \
163 (LMP_CARTESIAN_IMPL_ENTRY_AGAIN_2 LMP_PARENS( \
164 LMP_DEC(dimLeft), macro, LMP_LIST_ROTATION(vpack, vfirst)))) \
165 __VA_OPT__(LMP_CARTESIAN_IMPL_AGAIN LMP_PARENS(dimLeft, macro, vpack, \
168#define LMP_CARTESIAN_IMPL_AGAIN_2() LMP_CARTESIAN_IMPL_AGAIN LMP_PARENS
169#define LMP_CARTESIAN_IMPL_AGAIN() LMP_CARTESIAN_IMPL
170#define LMP_CARTESIAN_IMPL_ENTRY_AGAIN_2() \
171 LMP_CARTESIAN_IMPL_ENTRY_AGAIN LMP_PARENS
172#define LMP_CARTESIAN_IMPL_ENTRY_AGAIN() LMP_CARTESIAN_IMPL_ENTRY
174#define LMP_EXPAND(...) \
175 LMP_EXPAND4(LMP_EXPAND4(LMP_EXPAND4(LMP_EXPAND4(__VA_ARGS__))))
176#define LMP_EXPAND4(...) \
177 LMP_EXPAND3(LMP_EXPAND3(LMP_EXPAND3(LMP_EXPAND3(__VA_ARGS__))))
178#define LMP_EXPAND3(...) \
179 LMP_EXPAND2(LMP_EXPAND2(LMP_EXPAND2(LMP_EXPAND2(__VA_ARGS__))))
180#define LMP_EXPAND2(...) \
181 LMP_EXPAND1(LMP_EXPAND1(LMP_EXPAND1(LMP_EXPAND1(__VA_ARGS__))))
182#define LMP_EXPAND1(...) __VA_ARGS__
187#define LMP_FOR_EACH(macro, ...) \
188 __VA_OPT__(LMP_EXPAND(LMP_FOR_EACH_HELPER(macro, __VA_ARGS__)))
189#define LMP_FOR_EACH_HELPER(macro, a1, ...) \
190 macro(a1) __VA_OPT__(LMP_FOR_EACH_AGAIN LMP_PARENS(macro, __VA_ARGS__))
191#define LMP_FOR_EACH_AGAIN() LMP_FOR_EACH_HELPER
192#define LMP_FOR_EACH_INDIRECTION(...) LMP_FOR_EACH(__VA_ARGS__)
197#define LMP_FOR_EACH_CARTESIAN_PRODUCT(macro, list1, ...) \
198 LMP_EXPAND(LMP_CARTESIAN_IMPL_ENTRY(LMP_COUNT_ARGS(__VA_ARGS__), macro, \
199 (__VA_ARGS__), LMP_EXPAND_LIST(list1)))