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