OS  v1.7.5
Documentation
Loading...
Searching...
No Matches
macro_overload.hpp
1#ifndef QOS_CPP_MACRO_OVERLOAD
2#define QOS_CPP_MACRO_OVERLOAD
3
4 #define QOS_MO_CAT(a, ...) QOS_MO_PRIMITIVE_CAT( a, __VA_ARGS__ )
5 #define QOS_MO_PRIMITIVE_CAT(a, ...) a ## __VA_ARGS__
6 #define QOS_MO_SPLIT(i, ...) QOS_MO_PRIMITIVE_CAT( QOS_MO_SPLIT_, i )( __VA_ARGS__ )
7 #define QOS_MO_SPLIT_0(a, ...) a
8 #define QOS_MO_SPLIT_1(a, ...) __VA_ARGS__
9 #define QOS_IS_VARIADIC(...) QOS_MO_SPLIT( 0, QOS_MO_CAT( QOS_IS_VARIADIC_R_, QOS_IS_VARIADIC_C __VA_ARGS__ ) )
10 #define QOS_IS_VARIADIC_C(...) 1
11 #define QOS_IS_VARIADIC_R_1 1,
12 #define QOS_IS_VARIADIC_R_QOS_IS_VARIADIC_C 0,
13 #define QOS_MO_IIF(bit) QOS_MO_PRIMITIVE_CAT( QOS_MO_IIF_, bit )
14 #define QOS_MO_IIF_0(t, ...) __VA_ARGS__
15 #define QOS_MO_IIF_1(t, ...) t
16 #define QOS_MO_IS_EMPTY_NON_FUNCTION(...) QOS_MO_IIF( QOS_IS_VARIADIC( __VA_ARGS__ ) )( 0, QOS_IS_VARIADIC( QOS_MO_IS_EMPTY_NON_FUNCTION_C __VA_ARGS__ () ) )
17 #define QOS_MO_IS_EMPTY_NON_FUNCTION_C() ()
18 #define QOS_MO_COMMA() ,
19 #define QOS_MO_REM(...) __VA_ARGS__
20 #define QOS_MO_SIZE(...) QOS_MO_SPLIT( 0, QOS_MO_SPLIT( 1, QOS_MO_SIZE_A( QOS_MO_COMMA, QOS_MO_REM( __VA_ARGS__ ) ),, ) )
21 #define QOS_MO_SIZE_A(_, im) QOS_MO_SIZE_B( im, _() 5, _() 4, _() 3, _() 2, _() 1,)
22 #define QOS_MO_SIZE_B(a, b, c, d, e, _, ...) _
23 #define QOS_MO_GTZ_OVERLOAD(prefix, ...) QOS_MO_CAT( prefix, QOS_MO_SIZE( __VA_ARGS__) )
24 #define QOS_MO_SELECT(bit, t, f) QOS_MO_SELECT_I( bit, t, f )
25 #define QOS_MO_SELECT_I(bit, t, f) QOS_MO_SELECT_ ## bit( t, f )
26 #define QOS_MO_SELECT_0(t, f) f
27 #define QOS_MO_SELECT_1(t, f) t
28
29 #define MACRO_OVERLOAD( prefix, ... ) \
30 QOS_MO_SELECT( QOS_MO_IS_EMPTY_NON_FUNCTION( __VA_ARGS__ ), QOS_MO_CAT( prefix , 0() ), QOS_MO_GTZ_OVERLOAD( prefix , __VA_ARGS__ )( __VA_ARGS__ ) )
31
32#endif