// === detail/va_defs.hpp === #pragma once #define VA_CONCAT(_1, _2) VA_CONCAT_IMPL(_1, _2) #define VA_NUM_ARGS(...) VA_NUM_ARGS_IMPL(__VA_ARGS__) #define VA_CONCAT_IMPL_IMPL(_1, _2) _1##_2 #define VA_CONCAT_IMPL(_1, _2) VA_CONCAT_IMPL_IMPL(_1, _2) #define VA_NUM_ARGS_IMPL_IMPL(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, \ _12, _13, _14, _15, _16, _17, _18, _19, _20, N, ...) N #define VA_NUM_ARGS_IMPL(...) VA_NUM_ARGS_IMPL_IMPL(__VA_ARGS__, \ 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0) #define VA_NUM_MACRO_CALL_IMPL(name, N, ...) VA_CONCAT(name, N)(__VA_ARGS__) #define VA_NUM_MACRO_CALL(name, ...) \ VA_NUM_MACRO_CALL_IMPL(name, VA_NUM_ARGS(__VA_ARGS__), __VA_ARGS__) #define VA_NUM_MACRO_CALL_IMPL2(name, N, ...) VA_CONCAT(name, N)(__VA_ARGS__) #define VA_NUM_MACRO_CALL2(name, ...) \ VA_NUM_MACRO_CALL_IMPL2(name, VA_NUM_ARGS(__VA_ARGS__), __VA_ARGS__)