72 lines
3.3 KiB
C++
72 lines
3.3 KiB
C++
// 2020/08/30 - Created by netcan: https://github.com/netcan
|
|
// ref https://github.com/Erlkoenig90/map-macro/
|
|
#pragma once
|
|
#ifdef _MSC_VER
|
|
#define TF_EMPTY()
|
|
#define TF_GET_ARG_COUNT_(...) \
|
|
TF_PASTE(TF_GET_ARG_COUNT_I(__VA_ARGS__, 64, 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, ), \
|
|
TF_EMPTY())
|
|
|
|
#else
|
|
#define TF_GET_ARG_COUNT_(...) \
|
|
TF_GET_ARG_COUNT_I(__VA_ARGS__, 64, 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, )
|
|
#endif
|
|
|
|
#define TF_GET_ARG_COUNT(...) TF_GET_ARG_COUNT_(__dummy__, ##__VA_ARGS__)
|
|
#define TF_GET_ARG_COUNT_I( \
|
|
e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, \
|
|
e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, \
|
|
e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, \
|
|
e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, \
|
|
e62, e63, e64, size, ...) \
|
|
size
|
|
|
|
#define TF_GET_FIRST(a, ...) a
|
|
#define TF_GET_SECOND(a, b, ...) b
|
|
#define TF_CONCATE(x, y) x##y
|
|
#define TF_PASTE(x, y) TF_CONCATE(x, y)
|
|
|
|
#define TF_EVAL0(...) __VA_ARGS__
|
|
#define TF_EVAL1(...) TF_EVAL0(TF_EVAL0(TF_EVAL0(__VA_ARGS__)))
|
|
#define TF_EVAL2(...) TF_EVAL1(TF_EVAL1(TF_EVAL1(__VA_ARGS__)))
|
|
#define TF_EVAL3(...) TF_EVAL2(TF_EVAL2(TF_EVAL2(__VA_ARGS__)))
|
|
#define TF_EVAL4(...) TF_EVAL3(TF_EVAL3(TF_EVAL3(__VA_ARGS__)))
|
|
#define TF_EVAL5(...) TF_EVAL4(TF_EVAL4(TF_EVAL4(__VA_ARGS__)))
|
|
|
|
#ifdef _MSC_VER
|
|
// MSVC needs more evaluations
|
|
#define TF_EVAL6(...) TF_EVAL5(TF_EVAL5(TF_EVAL5(__VA_ARGS__)))
|
|
#define TF_EVAL(...) TF_EVAL6(TF_EVAL6(__VA_ARGS__))
|
|
#else
|
|
#define TF_EVAL(...) TF_EVAL5(__VA_ARGS__)
|
|
#endif
|
|
|
|
#define TF_MAP_END(...)
|
|
#define TF_MAP_OUT
|
|
|
|
#define EMPTY()
|
|
#define DEFER(id) id EMPTY()
|
|
|
|
#define TF_MAP_GET_END2() 0, TF_MAP_END
|
|
#define TF_MAP_GET_END1(...) TF_MAP_GET_END2
|
|
#define TF_MAP_GET_END(...) TF_MAP_GET_END1
|
|
#define TF_MAP_NEXT0(test, next, ...) next TF_MAP_OUT
|
|
#define TF_MAP_NEXT1(test, next) DEFER(TF_MAP_NEXT0)(test, next, 0)
|
|
#define TF_MAP_NEXT(test, next) TF_MAP_NEXT1(TF_MAP_GET_END test, next)
|
|
|
|
#define TF_MAP0(f, x, peek, ...) \
|
|
f(x) DEFER(TF_MAP_NEXT(peek, TF_MAP1))(f, peek, __VA_ARGS__)
|
|
#define TF_MAP1(f, x, peek, ...) \
|
|
f(x) DEFER(TF_MAP_NEXT(peek, TF_MAP0))(f, peek, __VA_ARGS__)
|
|
|
|
#define TF_MAP(f, ...) \
|
|
TF_EVAL(TF_MAP1(f, __VA_ARGS__, ()()(), ()()(), ()()(), 0))
|