#include #include #include #include #include #include #include #include #include #include #include #include #define IS_REGISTERED(x) CHAOS_PP_IS_UNARY(CHAOS_PP_PRIMITIVE_CAT(REGISTER_, x)) #define EXTRACT(x) CHAOS_PP_SPLIT(0, CHAOS_PP_EXPAND(EXTRACT_I CHAOS_PP_PRIMITIVE_CAT(REGISTER_, x))) #define EXTRACT_I(str) str, ~ #define REMOVE(x) CHAOS_PP_EXPAND(CHAOS_PP_TUPLE_EAT(1) CHAOS_PP_PRIMITIVE_CAT(REGISTER_, x)) #define COMPARE(x, y) COMPARE_BYPASS(CHAOS_PP_LIMIT_EXPR, x, y) #define COMPARE_BYPASS(s, x, y) \ CHAOS_PP_EXPR_S(s)(COMPARE_I( \ CHAOS_PP_OBSTRUCT(), CHAOS_PP_PREV(s), x(), y() \ )) \ /**/ #define COMPARE_INDIRECT() COMPARE_I #define COMPARE_I(_, s, x, y) \ CHAOS_PP_IIF _(CHAOS_PP_IS_NULLARY(x))( \ CHAOS_PP_IS_NULLARY _(y), \ CHAOS_PP_IIF _(CHAOS_PP_IS_NULLARY _(y))( \ 0, \ CHAOS_PP_IIF _( \ CHAOS_PP_BITAND _(IS_REGISTERED _(x))( \ CHAOS_PP_BITAND _(IS_REGISTERED _(y))( \ CHAOS_PP_STRING_COMPARE_BYPASS _(s, EXTRACT _(x), EXTRACT _(y)) \ ) \ ) \ )( \ CHAOS_PP_EXPR_S _(s)(COMPARE_INDIRECT _()( \ CHAOS_PP_OBSTRUCT _(), CHAOS_PP_PREV(s), REMOVE _(x), REMOVE _(y) \ )), \ 0 \ ) \ ) \ ) \ /**/ #define REGISTER_bool (b o o l) #define REGISTER_char (c h a r) #define REGISTER_double (d o u b l e) #define REGISTER_float (f l o a t) #define REGISTER_int (i n t) #define REGISTER_long (l o n g) #define REGISTER_short (s h o r t) #define REGISTER_signed (s i g n e d) #define REGISTER_unsigned (u n s i g n e d) #define REGISTER_wchar_t (w c h a r _ t) COMPARE(unsigned char, unsigned char)