Loading...
Searching...
No Matches
overload.hpp
1
5#pragma once
6
8
30#define BY_OVERLOAD(NAME, ...) BY_CONCAT(NAME##_, __OVERLOAD_VA_NUM_ARGS(__VA_ARGS__))(__VA_ARGS__)
31
32#define _ARG16(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, ...) _15
33#define __OVERLOAD_HAS_COMMA(...) _ARG16(__VA_ARGS__, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0)
34#define __OVERLOAD_HAS_NO_COMMA(...) _ARG16(__VA_ARGS__, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1)
35#define _TRIGGER_PARENTHESIS_(...) ,
36
37#define __OVERLOAD_HAS_ZERO_OR_ONE_ARG(...) \
38 ___OVERLOAD_HAS_ZERO_OR_ONE_ARG( /* test if there is just one argument, \
39 * eventually an empty one \
40 */ \
41 __OVERLOAD_HAS_COMMA(__VA_ARGS__), /* test if \
42 _TRIGGER_PARENTHESIS_ \
43 together with the \
44 argument adds a comma \
45 */ \
46 __OVERLOAD_HAS_COMMA(_TRIGGER_PARENTHESIS_ __VA_ARGS__), /* test if the \
47 argument together \
48 with a parenthesis \
49 adds a comma */ \
50 __OVERLOAD_HAS_COMMA(__VA_ARGS__(~)), /* test if placing it between \
51 _TRIGGER_PARENTHESIS_ and the \
52 parenthesis adds a comma */ \
53 __OVERLOAD_HAS_COMMA(_TRIGGER_PARENTHESIS_ __VA_ARGS__(~)))
54
55#define __OVERLOAD_PASTE5(_0, _1, _2, _3, _4) _0##_1##_2##_3##_4
56#define ___OVERLOAD_HAS_ZERO_OR_ONE_ARG(_0, _1, _2, _3) \
57 __OVERLOAD_HAS_NO_COMMA(__OVERLOAD_PASTE5(_IS_EMPTY_CASE_, _0, _1, _2, _3))
58#define _IS_EMPTY_CASE_0001 ,
59
60#define _VA0(...) __OVERLOAD_HAS_ZERO_OR_ONE_ARG(__VA_ARGS__)
61#define _VA1(...) __OVERLOAD_HAS_ZERO_OR_ONE_ARG(__VA_ARGS__)
62#define _VA2(...) 2
63#define _VA3(...) 3
64#define _VA4(...) 4
65#define _VA5(...) 5
66#define _VA6(...) 6
67#define _VA7(...) 7
68#define _VA8(...) 8
69#define _VA9(...) 9
70#define _VA10(...) 10
71#define _VA11(...) 11
72#define _VA12(...) 12
73#define _VA13(...) 13
74#define _VA14(...) 14
75#define _VA15(...) 15
76#define _VA16(...) 16
77
78#define __OVERLOAD_VA_NUM_ARGS(...) __OVERLOAD_VA_NUM_ARGS_IMPL(__VA_ARGS__, __OVERLOAD_RSEQ_N(__VA_ARGS__))
79#define __OVERLOAD_VA_NUM_ARGS_IMPL(...) __OVERLOAD_VA_NUM_ARGS_N(__VA_ARGS__)
80
81#define __OVERLOAD_VA_NUM_ARGS_N(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, N, ...) N
82
83#define __OVERLOAD_RSEQ_N(...) \
84 _VA16(__VA_ARGS__), _VA15(__VA_ARGS__), _VA14(__VA_ARGS__), _VA13(__VA_ARGS__), _VA12(__VA_ARGS__), \
85 _VA11(__VA_ARGS__), _VA10(__VA_ARGS__), _VA9(__VA_ARGS__), _VA8(__VA_ARGS__), _VA7(__VA_ARGS__), \
86 _VA6(__VA_ARGS__), _VA5(__VA_ARGS__), _VA4(__VA_ARGS__), _VA3(__VA_ARGS__), _VA2(__VA_ARGS__), \
87 _VA1(__VA_ARGS__), _VA0(__VA_ARGS__)
to Top