]> git.neil.brown.name Git - edlib.git/blob - vfunc.h
TODO: clean out done items.
[edlib.git] / vfunc.h
1 #ifndef __VFUNC_H__
2 #define __VFUNC_H__
3
4 /* Macro magic taken from
5  * https://stackoverflow.com/questions/11761703/overloading-macro-on-number-of-arguments
6  */
7 // get number of arguments with __NARG__
8 #define __NARG__(...)  __NARG_I_(__VA_ARGS__,__RSEQ_N())
9 #define __NARG_I_(...) __ARG_N(__VA_ARGS__)
10 #define __ARG_N( \
11                  _1, _2, _3, _4, _5, _6, _7, _8, _9,_10, \
12                 _11,_12,_13,_14,_15,_16,_17,_18,_19,_20, \
13                 _21,_22,_23,_24,_25,_26,_27,_28,_29,_30, \
14                 _31,_32,_33,_34,_35,_36,_37,_38,_39,_40, \
15                 _41,_42,_43,_44,_45,_46,_47,_48,_49,_50, \
16                 _51,_52,_53,_54,_55,_56,_57,_58,_59,_60, \
17                 _61,_62,_63,N,...) N
18 #define __RSEQ_N() \
19         63,62,61,60,                    \
20         59,58,57,56,55,54,53,52,51,50,  \
21         49,48,47,46,45,44,43,42,41,40,  \
22         39,38,37,36,35,34,33,32,31,30,  \
23         29,28,27,26,25,24,23,22,21,20,  \
24         19,18,17,16,15,14,13,12,11,10,  \
25         9,8,7,6,5,4,3,2,1,0
26
27 // general definition for any function name
28 #define _vFUNC_(name, n) name##n
29 #define _vFUNC(name, n) _vFUNC_(name, n)
30 #define VFUNC(func, ...) _vFUNC(func, __NARG__(__VA_ARGS__)) (__VA_ARGS__)
31
32 #endif