Skip to content

Instantly share code, notes, and snippets.

@niXman
Last active March 28, 2024 18:33
Show Gist options
  • Save niXman/afba9d1812d89c0f985fdd5218b3354a to your computer and use it in GitHub Desktop.
Save niXman/afba9d1812d89c0f985fdd5218b3354a to your computer and use it in GitHub Desktop.
#define SOME_PREFIX__CAT_I(a, b) a ## b
#define SOME_PREFIX__CAT(a, b) SOME_PREFIX__CAT_I(a, b)
#define SOME_PREFIX__ARG_N( \
_1 , _2, _3, _4, _5, _6, _7, _8, _9,_10, \
_11,_12,_13,_14,_15,_16,_17,_18,_19,_20, \
_21,_22,_23,_24,_25,_26,_27,_28,_29,_30, \
_31,_32,_33,_34,_35,_36,_37,_38,_39,_40, \
_41,_42,_43,_44,_45,_46,_47,_48,_49,_50, \
_51,_52,_53,_54,_55,_56,_57,_58,_59,_60, \
_61,_62,_63,N,...) N
#define SOME_PREFIX__RSEQ_N() \
63,62,61,60, \
59,58,57,56,55,54,53,52,51,50, \
49,48,47,46,45,44,43,42,41,40, \
39,38,37,36,35,34,33,32,31,30, \
29,28,27,26,25,24,23,22,21,20, \
19,18,17,16,15,14,13,12,11,10, \
9,8,7,6,5,4,3,2,1,0
#define SOME_PREFIX__NARG_IMPL(...) SOME_PREFIX__ARG_N(__VA_ARGS__)
#define SOME_PREFIX__NARG(...) SOME_PREFIX__NARG_IMPL(__VA_ARGS__, SOME_PREFIX__RSEQ_N())
#define SOME_PREFIX__ENUM_ARGS_0(macro, data)
#define SOME_PREFIX__ENUM_ARGS_1(macro, data, _1) macro(data, _1)
#define SOME_PREFIX__ENUM_ARGS_2(macro, data, _1, _2) \
SOME_PREFIX__ENUM_ARGS_1(macro, data, _1) SOME_PREFIX__ENUM_ARGS_1(macro, data, _2)
#define SOME_PREFIX__ENUM_ARGS_3(macro, data, _1, _2, _3) \
SOME_PREFIX__ENUM_ARGS_2(macro, data, _1, _2) SOME_PREFIX__ENUM_ARGS_1(macro, data, _3)
#define SOME_PREFIX__ENUM_ARGS_4(macro, data, _1, _2, _3, _4) \
SOME_PREFIX__ENUM_ARGS_3(macro, data, _1, _2, _3) SOME_PREFIX__ENUM_ARGS_1(macro, data, _4)
#define SOME_PREFIX__ENUM_ARGS_5(macro, data, _1, _2, _3, _4, _5) \
SOME_PREFIX__ENUM_ARGS_4(macro, data, _1, _2, _3, _4) SOME_PREFIX__ENUM_ARGS_1(macro, data, _5)
#define SOME_PREFIX__ENUM_ARGS_6(macro, data, _1, _2, _3, _4, _5, _6) \
SOME_PREFIX__ENUM_ARGS_5(macro, data, _1, _2, _3, _4, _5) SOME_PREFIX__ENUM_ARGS_1(macro, data, _6)
#define SOME_PREFIX__ENUM_ARGS_7(macro, data, _1, _2, _3, _4, _5, _6, _7) \
SOME_PREFIX__ENUM_ARGS_6(macro, data, _1, _2, _3, _4, _5, _6) SOME_PREFIX__ENUM_ARGS_1(macro, data, _7)
#define SOME_PREFIX__ENUM_ARGS_8(macro, data, _1, _2, _3, _4, _5, _6, _7, _8) \
SOME_PREFIX__ENUM_ARGS_7(macro, data, _1, _2, _3, _4, _5, _6, _7) SOME_PREFIX__ENUM_ARGS_1(macro, data, _8)
#define SOME_PREFIX__ENUM_ARGS_9(macro, data, _1, _2, _3, _4, _5, _6, _7, _8, _9) \
SOME_PREFIX__ENUM_ARGS_8(macro, data, _1, _2, _3, _4, _5, _6, _7, _8) SOME_PREFIX__ENUM_ARGS_1(macro, data, _9)
#define SOME_PREFIX__ENUM_ARGS_10(macro, data, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10) \
SOME_PREFIX__ENUM_ARGS_9(macro, data, _1, _2, _3, _4, _5, _6, _7, _8, _9) SOME_PREFIX__ENUM_ARGS_1(macro, data, _10)
#define SOME_PREFIX__ENUM_ARGS_11(macro, data, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11) \
SOME_PREFIX__ENUM_ARGS_10(macro, data, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10) SOME_PREFIX__ENUM_ARGS_1(macro, data, _11)
#define SOME_PREFIX__ENUM_ARGS_12(macro, data, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12) \
SOME_PREFIX__ENUM_ARGS_11(macro, data, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11) SOME_PREFIX__ENUM_ARGS_1(macro, data, _12)
#define SOME_PREFIX__ENUM_ARGS_13(macro, data, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13) \
SOME_PREFIX__ENUM_ARGS_12(macro, data, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12) SOME_PREFIX__ENUM_ARGS_1(macro, data, _13)
#define SOME_PREFIX__ENUM_ARGS_14(macro, data, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) \
SOME_PREFIX__ENUM_ARGS_13(macro, data, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13) SOME_PREFIX__ENUM_ARGS_1(macro, data, _14)
#define SOME_PREFIX__ENUM_ARGS_15(macro, data, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) \
SOME_PREFIX__ENUM_ARGS_14(macro, data, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) SOME_PREFIX__ENUM_ARGS_1(macro, data, _15)
#define SOME_PREFIX__ENUM_ARGS_16(macro, data, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16) \
SOME_PREFIX__ENUM_ARGS_15(macro, data, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) SOME_PREFIX__ENUM_ARGS_1(macro, data, _16)
#define SOME_PREFIX__ENUM_ARGS_IMPL(macro, data, n, ...) \
SOME_PREFIX__CAT(SOME_PREFIX__ENUM_ARGS_, n)(macro, data, __VA_ARGS__)
#define SOME_PREFIX__ENUM_ARGS(macro, data, ...) \
SOME_PREFIX__ENUM_ARGS_IMPL(macro, data, SOME_PREFIX__NARG(__VA_ARGS__), __VA_ARGS__)
/*************************************************************************************************/
// test
#include <iostream>
#include <functional>
#define MY_ENUM_MACRO_FUNC(userdata, elem) \
[m = userdata elem](const mystruct *s, std::ostream &os){ os << #elem << ": " << (s->*m) << std::endl;},
struct mystruct {
int a=0;
short b=1;
long c=2;
float f=3;
double d=4;
};
int main() {
static const std::function<void(const mystruct *, std::ostream &)> funcs[] = {
SOME_PREFIX__ENUM_ARGS(MY_ENUM_MACRO_FUNC, &mystruct::, a, b, c, f, d)
};
const mystruct str;
for ( const auto &it: funcs )
it(&str, std::cout);
}
// a: 0
// b: 1
// c: 2
// f: 3
// d: 4
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment