From b29b2fc46c30bde7a98c951a4dc31c43730caa7e Mon Sep 17 00:00:00 2001 From: Robear Selwans Date: Tue, 24 May 2022 18:32:58 +0200 Subject: [PATCH] Added more recursive macros Signed-off-by: Robear Selwans --- ev_macros.h | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/ev_macros.h b/ev_macros.h index d339bf8..6d96c83 100644 --- a/ev_macros.h +++ b/ev_macros.h @@ -11,6 +11,7 @@ #define __EV_MACRO_IF_0_ELSE(...) __VA_ARGS__ #define __EV_MACRO_SECOND(a,b,...) b +#define __EV_MACRO_SECOND_INDIRECT() __EV_MACRO_SECOND #define __EV_MACRO_IS_PROBE(...) __EV_MACRO_SECOND(__VA_ARGS__,0) #define __EV_MACRO_PROBE() ~,1 @@ -108,6 +109,11 @@ #define EV_CAT(a, ...) EV_CAT_IMPL(a, __VA_ARGS__) #define EV_CAT_IMPL(a, ...) a##__VA_ARGS__ +/*! + * \brief Macro to concatenate multiple tokens together + */ +#define EV_CATN(...) EV_REDUCE(EV_CAT, __VA_ARGS__) + /*! * \brief Macro to wrap tokens in double quotations. (") */ @@ -187,6 +193,31 @@ OP(UDATA, a) EV_INDIRECT_OP_ELSE_NOP(__EV_INTERNAL_FOREACH_UDATA_IMPL_INDIRECT, __VA_ARGS__)(OP, UDATA, __VA_ARGS__) #define __EV_INTERNAL_FOREACH_UDATA_IMPL_INDIRECT() __EV_INTERNAL_FOREACH_UDATA_IMPL +#define EV_JOIN(...) \ + EV_JOIN_W_DELIM((,),__VA_ARGS__) + +#define EV_JOIN_W_DELIM(delim, ...) \ + EV_VA_OPT(__VA_ARGS__)(EV_EVAL(__EV_INTERNAL_JOIN_W_DELIM_IMPL(delim, __VA_ARGS__))) +#define __EV_INTERNAL_JOIN_W_DELIM_IMPL(delim, a, ...) \ + a EV_INDIRECT_OP_ELSE_NOP(EV_EXPAND delim __EV_INTERNAL_JOIN_W_DELIM_IMPL_INDIRECT, __VA_ARGS__)(delim, __VA_ARGS__) +#define __EV_INTERNAL_JOIN_W_DELIM_IMPL_INDIRECT() __EV_INTERNAL_JOIN_W_DELIM_IMPL + +#define DEFAULT_ZIP_OP(a, b) (a, b) +#define EV_ZIP(list1, list2) \ + EV_ZIP_W_OP(DEFAULT_ZIP_OP, list1, list2) + +#define EV_ZIP_W_OP(OP, list1, list2) \ + EV_VA_OPT(EV_EXPAND list1)(EV_EVAL(__EV_INTERNAL_ZIP_W_OP_IMPL(OP, list1, list2))) +#define __EV_INTERNAL_ZIP_W_OP_IMPL(OP, list1, list2) \ + OP(EV_HEAD list1, EV_HEAD list2) EV_INDIRECT_OP_ELSE_NOP(__EV_INTERNAL_ZIP_W_OP_IMPL_INDIRECT, EV_TAIL list1)(OP, (EV_TAIL list1), (EV_TAIL list2)) +#define __EV_INTERNAL_ZIP_W_OP_IMPL_INDIRECT() , __EV_INTERNAL_ZIP_W_OP_IMPL + +#define EV_REDUCE(OP, ...) \ + EV_VA_OPT(__VA_ARGS__)(EV_EVAL(EV_INDIRECT_OP_ELSE_NOP(__EV_INTERNAL_REDUCE_IMPL_INDIRECT, __VA_ARGS__)(OP, EV_HEAD(__VA_ARGS__), EV_TAIL(__VA_ARGS__)))) +#define __EV_INTERNAL_REDUCE_IMPL(OP, last, ...) \ + EV_DEFER(EV_VA_OPT_ELSE(__VA_ARGS__)(__EV_INTERNAL_REDUCE_IMPL_INDIRECT)(__EV_MACRO_SECOND_INDIRECT))()(OP, EV_VA_OPT_ELSE(__VA_ARGS__)(OP(last, EV_HEAD(__VA_ARGS__)))(last) EV_VA_OPT(__VA_ARGS__)(,EV_TAIL(__VA_ARGS__))) +#define __EV_INTERNAL_REDUCE_IMPL_INDIRECT() __EV_INTERNAL_REDUCE_IMPL + /*! * \brief Macro to get a the hex value of a 4-number as a character */