Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/tutorial/src/libraries/util/VA_NARGS.h @ 10181

Last change on this file since 10181 was 7401, checked in by landauf, 14 years ago

merged doc branch back to trunk

  • Property svn:eol-style set to native
File size: 4.1 KB
Line 
1/*
2 *   ORXONOX - the hottest 3D action shooter ever to exist
3 *                    > www.orxonox.net <
4 *
5 *
6 *   License notice:
7 *
8 *   This program is free software; you can redistribute it and/or
9 *   modify it under the terms of the GNU General Public License
10 *   as published by the Free Software Foundation; either version 2
11 *   of the License, or (at your option) any later version.
12 *
13 *   This program is distributed in the hope that it will be useful,
14 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
15 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 *   GNU General Public License for more details.
17 *
18 *   You should have received a copy of the GNU General Public License
19 *   along with this program; if not, write to the Free Software
20 *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
21 *
22 *   Author:
23 *      Fabian 'x3n' Landau
24 *   Co-authors:
25 *      ...
26 *
27 */
28
29/**
30    @file
31    @ingroup Util
32    @brief Declaration of the ORXONOX_VA_NARGS macro which returns the number of arguments passed to a variadic macro.
33
34    With this utility you can overload a macro for different numbers of arguments
35    (of course overloading is not possible for different types, as macros are not
36    type aware, but for different numbers of arguments is still very powerful).
37
38    Example: A macro to call functions
39    @code
40    myfunction();                                           // A static function
41    MyClass::myStaticFunction();                            // A static class function
42    MyClass::myFunction();                                  // A member function
43
44    #define CallFunction(...) \                             // Define a variadic macro that passes the arguments to the overloaded implementations
45        BOOST_PP_EXPAND(BOOST_PP_CAT(CallFunction, ORXONOX_VA_NARGS(__VA_ARGS__))(__VA_ARGS__))
46
47    #define CallFunction1(function) \                       // Overloaded macro for 1 argument
48        function()                                          // Calls the static function
49
50    #define CallFunction2(class, function) \                // Overloaded macro for 2 arguments
51        class::function()                                   // Calls the static class function
52
53    #define CallFunction3(class, function, object) \        // Overloaded macro for 3 arguments
54        object->class::function()                           // Calls the function on the object
55
56
57    CallFunction(myFunction);                               // Call the macro with 1 argument
58    CallFunction(MyClass, myStaticFunction);                // Call the macro with 2 arguments
59    CallFunction(MyClass, myFunction, new MyClass());       // Call the macro with 3 arguments
60    @endcode
61
62    Note that the first (variadic) macro concatenates the name "CallFunction" with
63    the number of arguments ("1" - "N"). Then all arguments are passed to the right macro.
64*/
65
66#include <boost/preprocessor/facilities/expand.hpp>
67
68/**
69    @brief Returns the number of arguments passed to a variadic macro. Important: The number of arguments must be greater than zero (ORXONOX_VA_NARGS() returns 1).
70*/
71#define ORXONOX_VA_NARGS(...) \
72    ORXONOX_VA_NARGS_CONCAT(__VA_ARGS__, ORXONOX_VA_NARGS_NUMBERS)
73
74
75// some helper macros //
76
77#define ORXONOX_VA_NARGS_CONCAT(...) \
78    BOOST_PP_EXPAND(ORXONOX_VA_NARGS_INTERN(__VA_ARGS__))
79
80#define ORXONOX_VA_NARGS_INTERN( \
81    arg1,  arg2,  arg3,  arg4,  arg5,  arg6,  arg7,  arg8,  arg9,  arg10, \
82    arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19, arg20, \
83    arg21, arg22, arg23, arg24, arg25, arg26, arg27, arg28, arg29, arg30, \
84    arg31, arg32, arg33, arg34, arg35, arg36, arg37, arg38, arg39, arg40, \
85    arg41, arg42, arg43, arg44, arg45, arg46, arg47, arg48, arg49, arg50, \
86    arg51, arg52, arg53, arg54, arg55, arg56, arg57, arg58, arg59, arg60, \
87    arg61, arg62, arg63, argn, ...) argn
88
89#define ORXONOX_VA_NARGS_NUMBERS \
90    63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, \
91    47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, \
92    31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, \
93    15, 14, 13, 12, 11, 10,  9,  8,  7,  6,  5,  4,  3,  2,  1,  0
Note: See TracBrowser for help on using the repository browser.