Skip to content

Instantly share code, notes, and snippets.

@bbuecherl
Last active August 29, 2015 14:22
Show Gist options
  • Select an option

  • Save bbuecherl/e74b8629c1578a916df9 to your computer and use it in GitHub Desktop.

Select an option

Save bbuecherl/e74b8629c1578a916df9 to your computer and use it in GitHub Desktop.
some utility macros for c++
#ifndef INCLUDE_MACROS_H_
#define INCLUDE_MACROS_H_
// concat arguments
#define CONCAT(a, b) a ## b
// macro to count passed arguments (maximum 63 arguments)
#define NUM_ARGS(...) NUM_ARGS_(,__VA_ARGS__, 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);
#define NUM_ARGS_(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, \
_15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, \
_30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, \
_45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, \
_60, _61, _62, _63, N, ...) N
// get argument (maximum 63 arguments)
#define GET_ARG(i, ...) CONCAT(GET_ARG_, i)(__VA_ARGS__)
#define GET_ARG_0(e0, ...) e0
#define GET_ARG_1(e0, e1, ...) e1
#define GET_ARG_2(e0, e1, e2, ...) e2
#define GET_ARG_3(e0, e1, e2, e3, ...) e3
#define GET_ARG_4(e0, e1, e2, e3, e4, ...) e4
#define GET_ARG_5(e0, e1, e2, e3, e4, e5, ...) e5
#define GET_ARG_6(e0, e1, e2, e3, e4, e5, e6, ...) e6
#define GET_ARG_7(e0, e1, e2, e3, e4, e5, e6, e7, ...) e7
#define GET_ARG_8(e0, e1, e2, e3, e4, e5, e6, e7, e8, ...) e8
#define GET_ARG_9(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, ...) e9
#define GET_ARG_10(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, ...) e10
#define GET_ARG_11(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, ...) e11
#define GET_ARG_12(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, ...) e12
#define GET_ARG_13(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, ...) e13
#define GET_ARG_14(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, ...) e14
#define GET_ARG_15(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, ...) e15
#define GET_ARG_16(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, ...) e16
#define GET_ARG_17(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, ...) e17
#define GET_ARG_18(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, ...) e18
#define GET_ARG_19(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, ...) e19
#define GET_ARG_20(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, ...) e20
#define GET_ARG_21(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, ...) e21
#define GET_ARG_22(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, ...) e22
#define GET_ARG_23(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, ...) e23
#define GET_ARG_24(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, ...) e24
#define GET_ARG_25(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, ...) e25
#define GET_ARG_26(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, ...) e26
#define GET_ARG_27(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, ...) e27
#define GET_ARG_28(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, ...) e28
#define GET_ARG_29(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, ...) e29
#define GET_ARG_30(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, ...) e30
#define GET_ARG_31(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, ...) e31
#define GET_ARG_32(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, ...) e32
#define GET_ARG_33(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, ...) e33
#define GET_ARG_34(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, ...) e34
#define GET_ARG_35(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, ...) e35
#define GET_ARG_36(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, ...) e36
#define GET_ARG_37(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, ...) e37
#define GET_ARG_38(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, ...) e38
#define GET_ARG_39(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, ...) e39
#define GET_ARG_40(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, ...) e40
#define GET_ARG_41(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, ...) e41
#define GET_ARG_42(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, ...) e42
#define GET_ARG_43(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, ...) e43
#define GET_ARG_44(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, ...) e44
#define GET_ARG_45(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, ...) e45
#define GET_ARG_46(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, ...) e46
#define GET_ARG_47(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, ...) e47
#define GET_ARG_48(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, ...) e48
#define GET_ARG_49(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, ...) e49
#define GET_ARG_50(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, ...) e50
#define GET_ARG_51(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, ...) e51
#define GET_ARG_52(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, ...) e52
#define GET_ARG_53(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, ...) e53
#define GET_ARG_54(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, ...) e54
#define GET_ARG_55(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, ...) e55
#define GET_ARG_56(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, ...) e56
#define GET_ARG_57(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, ...) e57
#define GET_ARG_58(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, ...) e58
#define GET_ARG_59(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, ...) e59
#define GET_ARG_60(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, ...) e60
#define GET_ARG_61(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, ...) e61
#define GET_ARG_62(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, ...) e62
#define GET_ARG_63(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, ...) e63
// for each loop over arguments
#define FOREACH_ARG(c, ...) FOREACH_ARG_(0, __VA_ARGS__, FOREACH_ARG_63, \
FOREACH_ARG_62, FOREACH_ARG_61, FOREACH_ARG_60, FOREACH_ARG_59, \
FOREACH_ARG_58, FOREACH_ARG_57, FOREACH_ARG_56, FOREACH_ARG_55, \
FOREACH_ARG_54, FOREACH_ARG_53, FOREACH_ARG_52, FOREACH_ARG_51, \
FOREACH_ARG_50, FOREACH_ARG_49, FOREACH_ARG_48, FOREACH_ARG_47, \
FOREACH_ARG_46, FOREACH_ARG_45, FOREACH_ARG_44, FOREACH_ARG_43, \
FOREACH_ARG_42, FOREACH_ARG_41, FOREACH_ARG_40, FOREACH_ARG_39, \
FOREACH_ARG_38, FOREACH_ARG_37, FOREACH_ARG_36, FOREACH_ARG_35, \
FOREACH_ARG_34, FOREACH_ARG_33, FOREACH_ARG_32, FOREACH_ARG_31, \
FOREACH_ARG_30, FOREACH_ARG_29, FOREACH_ARG_28, FOREACH_ARG_27, \
FOREACH_ARG_26, FOREACH_ARG_25, FOREACH_ARG_24, FOREACH_ARG_23, \
FOREACH_ARG_22, FOREACH_ARG_21, FOREACH_ARG_20, FOREACH_ARG_19, \
FOREACH_ARG_18, FOREACH_ARG_17, FOREACH_ARG_16, FOREACH_ARG_15, \
FOREACH_ARG_14, FOREACH_ARG_13, FOREACH_ARG_12, FOREACH_ARG_11, \
FOREACH_ARG_10, FOREACH_ARG_9, FOREACH_ARG_8, FOREACH_ARG_7, FOREACH_ARG_6, \
FOREACH_ARG_5, FOREACH_ARG_4, FOREACH_ARG_3, FOREACH_ARG_2, FOREACH_ARG_1, \
FOREACH_ARG_0)(c, __VA_ARGS__)
#define FOREACH_ARG_(_, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13,\
_14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, \
_29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, \
_44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, \
_59, _60, _61, _62, _63, N, ...) N
#define FOREACH_ARG_0(_call, ...)
#define FOREACH_ARG_1(_call, x, ...) _call(x)
#define FOREACH_ARG_2(_call, x, ...) _call(x) \
FOREACH_ARG_1(_call, __VA_ARGS__)
#define FOREACH_ARG_3(_call, x, ...) _call(x) \
FOREACH_ARG_2(_call, __VA_ARGS__)
#define FOREACH_ARG_4(_call, x, ...) _call(x) \
FOREACH_ARG_3(_call, __VA_ARGS__)
#define FOREACH_ARG_5(_call, x, ...) _call(x) \
FOREACH_ARG_4(_call, __VA_ARGS__)
#define FOREACH_ARG_6(_call, x, ...) _call(x) \
FOREACH_ARG_5(_call, __VA_ARGS__)
#define FOREACH_ARG_7(_call, x, ...) _call(x) \
FOREACH_ARG_6(_call, __VA_ARGS__)
#define FOREACH_ARG_8(_call, x, ...) _call(x) \
FOREACH_ARG_7(_call, __VA_ARGS__)
#define FOREACH_ARG_9(_call, x, ...) _call(x) \
FOREACH_ARG_8(_call, __VA_ARGS__)
#define FOREACH_ARG_10(_call, x, ...) _call(x) \
FOREACH_ARG_9(_call, __VA_ARGS__)
#define FOREACH_ARG_11(_call, x, ...) _call(x) \
FOREACH_ARG_10(_call, __VA_ARGS__)
#define FOREACH_ARG_12(_call, x, ...) _call(x) \
FOREACH_ARG_11(_call, __VA_ARGS__)
#define FOREACH_ARG_13(_call, x, ...) _call(x) \
FOREACH_ARG_12(_call, __VA_ARGS__)
#define FOREACH_ARG_14(_call, x, ...) _call(x) \
FOREACH_ARG_13(_call, __VA_ARGS__)
#define FOREACH_ARG_15(_call, x, ...) _call(x) \
FOREACH_ARG_14(_call, __VA_ARGS__)
#define FOREACH_ARG_16(_call, x, ...) _call(x) \
FOREACH_ARG_15(_call, __VA_ARGS__)
#define FOREACH_ARG_17(_call, x, ...) _call(x) \
FOREACH_ARG_16(_call, __VA_ARGS__)
#define FOREACH_ARG_18(_call, x, ...) _call(x) \
FOREACH_ARG_17(_call, __VA_ARGS__)
#define FOREACH_ARG_19(_call, x, ...) _call(x) \
FOREACH_ARG_18(_call, __VA_ARGS__)
#define FOREACH_ARG_20(_call, x, ...) _call(x) \
FOREACH_ARG_19(_call, __VA_ARGS__)
#define FOREACH_ARG_21(_call, x, ...) _call(x) \
FOREACH_ARG_20(_call, __VA_ARGS__)
#define FOREACH_ARG_22(_call, x, ...) _call(x) \
FOREACH_ARG_21(_call, __VA_ARGS__)
#define FOREACH_ARG_23(_call, x, ...) _call(x) \
FOREACH_ARG_22(_call, __VA_ARGS__)
#define FOREACH_ARG_24(_call, x, ...) _call(x) \
FOREACH_ARG_23(_call, __VA_ARGS__)
#define FOREACH_ARG_25(_call, x, ...) _call(x) \
FOREACH_ARG_24(_call, __VA_ARGS__)
#define FOREACH_ARG_26(_call, x, ...) _call(x) \
FOREACH_ARG_25(_call, __VA_ARGS__)
#define FOREACH_ARG_27(_call, x, ...) _call(x) \
FOREACH_ARG_26(_call, __VA_ARGS__)
#define FOREACH_ARG_28(_call, x, ...) _call(x) \
FOREACH_ARG_27(_call, __VA_ARGS__)
#define FOREACH_ARG_29(_call, x, ...) _call(x) \
FOREACH_ARG_28(_call, __VA_ARGS__)
#define FOREACH_ARG_30(_call, x, ...) _call(x) \
FOREACH_ARG_29(_call, __VA_ARGS__)
#define FOREACH_ARG_31(_call, x, ...) _call(x) \
FOREACH_ARG_30(_call, __VA_ARGS__)
#define FOREACH_ARG_32(_call, x, ...) _call(x) \
FOREACH_ARG_31(_call, __VA_ARGS__)
#define FOREACH_ARG_33(_call, x, ...) _call(x) \
FOREACH_ARG_32(_call, __VA_ARGS__)
#define FOREACH_ARG_34(_call, x, ...) _call(x) \
FOREACH_ARG_33(_call, __VA_ARGS__)
#define FOREACH_ARG_35(_call, x, ...) _call(x) \
FOREACH_ARG_34(_call, __VA_ARGS__)
#define FOREACH_ARG_36(_call, x, ...) _call(x) \
FOREACH_ARG_35(_call, __VA_ARGS__)
#define FOREACH_ARG_37(_call, x, ...) _call(x) \
FOREACH_ARG_36(_call, __VA_ARGS__)
#define FOREACH_ARG_38(_call, x, ...) _call(x) \
FOREACH_ARG_37(_call, __VA_ARGS__)
#define FOREACH_ARG_39(_call, x, ...) _call(x) \
FOREACH_ARG_38(_call, __VA_ARGS__)
#define FOREACH_ARG_40(_call, x, ...) _call(x) \
FOREACH_ARG_39(_call, __VA_ARGS__)
#define FOREACH_ARG_41(_call, x, ...) _call(x) \
FOREACH_ARG_40(_call, __VA_ARGS__)
#define FOREACH_ARG_42(_call, x, ...) _call(x) \
FOREACH_ARG_41(_call, __VA_ARGS__)
#define FOREACH_ARG_43(_call, x, ...) _call(x) \
FOREACH_ARG_42(_call, __VA_ARGS__)
#define FOREACH_ARG_44(_call, x, ...) _call(x) \
FOREACH_ARG_43(_call, __VA_ARGS__)
#define FOREACH_ARG_45(_call, x, ...) _call(x) \
FOREACH_ARG_44(_call, __VA_ARGS__)
#define FOREACH_ARG_46(_call, x, ...) _call(x) \
FOREACH_ARG_45(_call, __VA_ARGS__)
#define FOREACH_ARG_47(_call, x, ...) _call(x) \
FOREACH_ARG_46(_call, __VA_ARGS__)
#define FOREACH_ARG_48(_call, x, ...) _call(x) \
FOREACH_ARG_47(_call, __VA_ARGS__)
#define FOREACH_ARG_49(_call, x, ...) _call(x) \
FOREACH_ARG_48(_call, __VA_ARGS__)
#define FOREACH_ARG_50(_call, x, ...) _call(x) \
FOREACH_ARG_49(_call, __VA_ARGS__)
#define FOREACH_ARG_51(_call, x, ...) _call(x) \
FOREACH_ARG_50(_call, __VA_ARGS__)
#define FOREACH_ARG_52(_call, x, ...) _call(x) \
FOREACH_ARG_51(_call, __VA_ARGS__)
#define FOREACH_ARG_53(_call, x, ...) _call(x) \
FOREACH_ARG_52(_call, __VA_ARGS__)
#define FOREACH_ARG_54(_call, x, ...) _call(x) \
FOREACH_ARG_53(_call, __VA_ARGS__)
#define FOREACH_ARG_55(_call, x, ...) _call(x) \
FOREACH_ARG_54(_call, __VA_ARGS__)
#define FOREACH_ARG_56(_call, x, ...) _call(x) \
FOREACH_ARG_55(_call, __VA_ARGS__)
#define FOREACH_ARG_57(_call, x, ...) _call(x) \
FOREACH_ARG_56(_call, __VA_ARGS__)
#define FOREACH_ARG_58(_call, x, ...) _call(x) \
FOREACH_ARG_57(_call, __VA_ARGS__)
#define FOREACH_ARG_59(_call, x, ...) _call(x) \
FOREACH_ARG_58(_call, __VA_ARGS__)
#define FOREACH_ARG_60(_call, x, ...) _call(x) \
FOREACH_ARG_59(_call, __VA_ARGS__)
#define FOREACH_ARG_61(_call, x, ...) _call(x) \
FOREACH_ARG_60(_call, __VA_ARGS__)
#define FOREACH_ARG_62(_call, x, ...) _call(x) \
FOREACH_ARG_61(_call, __VA_ARGS__)
#define FOREACH_ARG_63(_call, x, ...) _call(x) \
FOREACH_ARG_62(_call, __VA_ARGS__)
// compare type
#define TYPECHECK(var, type) ({ \
type __dummy; \
typeof(var) __dummy2; \
(void)(&__dummy == &__dummy2); \
1; \
})
#endif // INCLUDE_MACROS_H_
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment