Merge branch 'blender2.7'
[blender.git] / source / blender / blenlib / BLI_utildefines_variadic.h
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * ***** END GPL LICENSE BLOCK *****
19  */
20
21 #ifndef __BLI_UTILDEFINES_VARIADIC_H__
22 #define __BLI_UTILDEFINES_VARIADIC_H__
23
24 /** \file BLI_utildefines_variadic.h
25  *  \ingroup bli
26  */
27
28 /* --- internal helpers --- */
29 #define _VA_NARGS_GLUE(x, y) x y
30 #define _VA_NARGS_RETURN_COUNT(\
31         _1_, _2_, _3_, _4_, _5_, _6_, _7_, _8_, _9_, _10_, _11_, _12_, _13_, _14_, _15_, _16_, \
32         _17_, _18_, _19_, _20_, _21_, _22_, _23_, _24_, _25_, _26_, _27_, _28_, _29_, _30_, _31_, _32_, \
33         _33_, _34_, _35_, _36_, _37_, _38_, _39_, _40_, _41_, _42_, _43_, _44_, _45_, _46_, _47_, _48_, \
34         _49_, _50_, _51_, _52_, _53_, _54_, _55_, _56_, _57_, _58_, _59_, _60_, _61_, _62_, _63_, _64_, \
35         count, ...) count
36 #define _VA_NARGS_EXPAND(args) _VA_NARGS_RETURN_COUNT args
37 #define _VA_NARGS_OVERLOAD_MACRO2(name, count) name##count
38 #define _VA_NARGS_OVERLOAD_MACRO1(name, count) _VA_NARGS_OVERLOAD_MACRO2(name, count)
39 #define _VA_NARGS_OVERLOAD_MACRO(name,  count) _VA_NARGS_OVERLOAD_MACRO1(name, count)
40 /* --- expose for re-use --- */
41 /* 64 args max */
42 #define VA_NARGS_COUNT(...) _VA_NARGS_EXPAND((__VA_ARGS__, \
43         64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, \
44         48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, \
45         32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, \
46         16, 15, 14, 13, 12, 11, 10,  9,  8,  7,  6,  5,  4,  3,  2, 1, 0))
47 #define VA_NARGS_CALL_OVERLOAD(name, ...) \
48         _VA_NARGS_GLUE(_VA_NARGS_OVERLOAD_MACRO(name, VA_NARGS_COUNT(__VA_ARGS__)), (__VA_ARGS__))
49
50 #endif  /* __BLI_UTILDEFINES_VARIADIC_H__ */