lean cpp library
A lean C++ library providing efficient utility classes for high-performance C++ applications.
variadic.h
00001 /*****************************************************/
00002 /* lean Functional              (c) Tobias Zirr 2011 */
00003 /*****************************************************/
00004 
00005 #ifndef LEAN_FUNCTIONAL_VARIADIC
00006 #define LEAN_FUNCTIONAL_VARIADIC
00007 
00010 
00012 #define LEAN_NOTHING
00013 
00015 #define LEAN_VARIADIC_NO_PARAMS
00016 
00017 #define LEAN_VARIADIC_HAS_PARAMS ,
00018 
00020 #define LEAN_VARIADIC_PERFECT_FORWARDING_XXL(fun, tparams, has_tparams, params, has_params, modifiers, body, args) \
00021     /* 0 */ \
00022     template <tparams>                              \
00023     fun(params) modifiers                           \
00024     body((args))                                    \
00025     /* 1 */ \
00026     template <tparams has_tparams                   \
00027             class __lean__t1                        \
00028         >                                           \
00029     fun( params has_params                          \
00030             __lean__t1 LEAN_FW_REF __lean__p1       \
00031         ) modifiers                                 \
00032     body(( args has_params                          \
00033             LEAN_FORWARD(__lean__t1, __lean__p1)    \
00034         ))                                          \
00035     /* 2 */ \
00036     template <tparams has_tparams                   \
00037             class __lean__t1,                       \
00038             class __lean__t2                        \
00039         >                                           \
00040     fun( params has_params                          \
00041             __lean__t1 LEAN_FW_REF __lean__p1,      \
00042             __lean__t2 LEAN_FW_REF __lean__p2       \
00043         ) modifiers                                 \
00044     body(( args has_params                          \
00045             LEAN_FORWARD(__lean__t1, __lean__p1),   \
00046             LEAN_FORWARD(__lean__t2, __lean__p2)    \
00047         ))                                          \
00048     /* 3 */ \
00049     template <tparams has_tparams                   \
00050             class __lean__t1,                       \
00051             class __lean__t2,                       \
00052             class __lean__t3                        \
00053         >                                           \
00054     fun( params has_params                          \
00055             __lean__t1 LEAN_FW_REF __lean__p1,      \
00056             __lean__t2 LEAN_FW_REF __lean__p2,      \
00057             __lean__t3 LEAN_FW_REF __lean__p3       \
00058         ) modifiers                                 \
00059     body(( args has_params                          \
00060             LEAN_FORWARD(__lean__t1, __lean__p1),   \
00061             LEAN_FORWARD(__lean__t2, __lean__p2),   \
00062             LEAN_FORWARD(__lean__t3, __lean__p3)    \
00063         ))                                          \
00064     /* 4 */ \
00065     template <tparams has_tparams                   \
00066             class __lean__t1,                       \
00067             class __lean__t2,                       \
00068             class __lean__t3,                       \
00069             class __lean__t4                        \
00070         >                                           \
00071     fun( params has_params                          \
00072             __lean__t1 LEAN_FW_REF __lean__p1,      \
00073             __lean__t2 LEAN_FW_REF __lean__p2,      \
00074             __lean__t3 LEAN_FW_REF __lean__p3,      \
00075             __lean__t4 LEAN_FW_REF __lean__p4       \
00076         ) modifiers                                 \
00077     body(( args has_params                          \
00078             LEAN_FORWARD(__lean__t1, __lean__p1),   \
00079             LEAN_FORWARD(__lean__t2, __lean__p2),   \
00080             LEAN_FORWARD(__lean__t3, __lean__p3),   \
00081             LEAN_FORWARD(__lean__t4, __lean__p4)    \
00082         ))                                          \
00083     /* 5 */ \
00084     template <tparams has_tparams                   \
00085             class __lean__t1,                       \
00086             class __lean__t2,                       \
00087             class __lean__t3,                       \
00088             class __lean__t4,                       \
00089             class __lean__t5                        \
00090         >                                           \
00091     fun( params has_params                          \
00092             __lean__t1 LEAN_FW_REF __lean__p1,      \
00093             __lean__t2 LEAN_FW_REF __lean__p2,      \
00094             __lean__t3 LEAN_FW_REF __lean__p3,      \
00095             __lean__t4 LEAN_FW_REF __lean__p4,      \
00096             __lean__t5 LEAN_FW_REF __lean__p5       \
00097         ) modifiers                                 \
00098     body(( args has_params                          \
00099             LEAN_FORWARD(__lean__t1, __lean__p1),   \
00100             LEAN_FORWARD(__lean__t2, __lean__p2),   \
00101             LEAN_FORWARD(__lean__t3, __lean__p3),   \
00102             LEAN_FORWARD(__lean__t4, __lean__p4),   \
00103             LEAN_FORWARD(__lean__t5, __lean__p5)    \
00104         ))                                          \
00105     /* 6 */ \
00106     template <tparams has_tparams                   \
00107             class __lean__t1,                       \
00108             class __lean__t2,                       \
00109             class __lean__t3,                       \
00110             class __lean__t4,                       \
00111             class __lean__t5,                       \
00112             class __lean__t6                        \
00113         >                                           \
00114     fun( params has_params                          \
00115             __lean__t1 LEAN_FW_REF __lean__p1,      \
00116             __lean__t2 LEAN_FW_REF __lean__p2,      \
00117             __lean__t3 LEAN_FW_REF __lean__p3,      \
00118             __lean__t4 LEAN_FW_REF __lean__p4,      \
00119             __lean__t5 LEAN_FW_REF __lean__p5,      \
00120             __lean__t6 LEAN_FW_REF __lean__p6       \
00121         ) modifiers                                 \
00122     body(( args has_params                          \
00123             LEAN_FORWARD(__lean__t1, __lean__p1),   \
00124             LEAN_FORWARD(__lean__t2, __lean__p2),   \
00125             LEAN_FORWARD(__lean__t3, __lean__p3),   \
00126             LEAN_FORWARD(__lean__t4, __lean__p4),   \
00127             LEAN_FORWARD(__lean__t5, __lean__p5),   \
00128             LEAN_FORWARD(__lean__t6, __lean__p6)    \
00129         ))                                          \
00130     /* 7 */ \
00131     template <tparams has_tparams                   \
00132             class __lean__t1,                       \
00133             class __lean__t2,                       \
00134             class __lean__t3,                       \
00135             class __lean__t4,                       \
00136             class __lean__t5,                       \
00137             class __lean__t6,                       \
00138             class __lean__t7                        \
00139         >                                           \
00140     fun( params has_params                          \
00141             __lean__t1 LEAN_FW_REF __lean__p1,      \
00142             __lean__t2 LEAN_FW_REF __lean__p2,      \
00143             __lean__t3 LEAN_FW_REF __lean__p3,      \
00144             __lean__t4 LEAN_FW_REF __lean__p4,      \
00145             __lean__t5 LEAN_FW_REF __lean__p5,      \
00146             __lean__t6 LEAN_FW_REF __lean__p6,      \
00147             __lean__t7 LEAN_FW_REF __lean__p7       \
00148         ) modifiers                                 \
00149     body(( args has_params                          \
00150             LEAN_FORWARD(__lean__t1, __lean__p1),   \
00151             LEAN_FORWARD(__lean__t2, __lean__p2),   \
00152             LEAN_FORWARD(__lean__t3, __lean__p3),   \
00153             LEAN_FORWARD(__lean__t4, __lean__p4),   \
00154             LEAN_FORWARD(__lean__t5, __lean__p5),   \
00155             LEAN_FORWARD(__lean__t6, __lean__p6),   \
00156             LEAN_FORWARD(__lean__t7, __lean__p7)    \
00157         ))                                          \
00158     /* 8 */ \
00159     template <tparams has_tparams                   \
00160             class __lean__t1,                       \
00161             class __lean__t2,                       \
00162             class __lean__t3,                       \
00163             class __lean__t4,                       \
00164             class __lean__t5,                       \
00165             class __lean__t6,                       \
00166             class __lean__t7,                       \
00167             class __lean__t8                        \
00168         >                                           \
00169     fun( params has_params                          \
00170             __lean__t1 LEAN_FW_REF __lean__p1,      \
00171             __lean__t2 LEAN_FW_REF __lean__p2,      \
00172             __lean__t3 LEAN_FW_REF __lean__p3,      \
00173             __lean__t4 LEAN_FW_REF __lean__p4,      \
00174             __lean__t5 LEAN_FW_REF __lean__p5,      \
00175             __lean__t6 LEAN_FW_REF __lean__p6,      \
00176             __lean__t7 LEAN_FW_REF __lean__p7,      \
00177             __lean__t8 LEAN_FW_REF __lean__p8       \
00178         ) modifiers                                 \
00179     body(( args has_params                          \
00180             LEAN_FORWARD(__lean__t1, __lean__p1),   \
00181             LEAN_FORWARD(__lean__t2, __lean__p2),   \
00182             LEAN_FORWARD(__lean__t3, __lean__p3),   \
00183             LEAN_FORWARD(__lean__t4, __lean__p4),   \
00184             LEAN_FORWARD(__lean__t5, __lean__p5),   \
00185             LEAN_FORWARD(__lean__t6, __lean__p6),   \
00186             LEAN_FORWARD(__lean__t7, __lean__p7),   \
00187             LEAN_FORWARD(__lean__t8, __lean__p8)    \
00188         ))                                          \
00189     /* 9 */ \
00190     template <tparams has_tparams                   \
00191             class __lean__t1,                       \
00192             class __lean__t2,                       \
00193             class __lean__t3,                       \
00194             class __lean__t4,                       \
00195             class __lean__t5,                       \
00196             class __lean__t6,                       \
00197             class __lean__t7,                       \
00198             class __lean__t8,                       \
00199             class __lean__t9                        \
00200         >                                           \
00201     fun( params has_params                          \
00202             __lean__t1 LEAN_FW_REF __lean__p1,      \
00203             __lean__t2 LEAN_FW_REF __lean__p2,      \
00204             __lean__t3 LEAN_FW_REF __lean__p3,      \
00205             __lean__t4 LEAN_FW_REF __lean__p4,      \
00206             __lean__t5 LEAN_FW_REF __lean__p5,      \
00207             __lean__t6 LEAN_FW_REF __lean__p6,      \
00208             __lean__t7 LEAN_FW_REF __lean__p7,      \
00209             __lean__t8 LEAN_FW_REF __lean__p8,      \
00210             __lean__t9 LEAN_FW_REF __lean__p9       \
00211         ) modifiers                                 \
00212     body(( args has_params                          \
00213             LEAN_FORWARD(__lean__t1, __lean__p1),   \
00214             LEAN_FORWARD(__lean__t2, __lean__p2),   \
00215             LEAN_FORWARD(__lean__t3, __lean__p3),   \
00216             LEAN_FORWARD(__lean__t4, __lean__p4),   \
00217             LEAN_FORWARD(__lean__t5, __lean__p5),   \
00218             LEAN_FORWARD(__lean__t6, __lean__p6),   \
00219             LEAN_FORWARD(__lean__t7, __lean__p7),   \
00220             LEAN_FORWARD(__lean__t8, __lean__p8),   \
00221             LEAN_FORWARD(__lean__t9, __lean__p9)    \
00222         ))                                          \
00223     // End
00224 
00226 #define LEAN_VARIADIC_PERFECT_FORWARDING_TP(fun, tparams, params, modifiers, body, args) \
00227     LEAN_VARIADIC_PERFECT_FORWARDING_XXL(fun, tparams, LEAN_VARIADIC_HAS_PARAMS, params, LEAN_VARIADIC_HAS_PARAMS, modifiers, body, args)
00228 
00230 #define LEAN_VARIADIC_PERFECT_FORWARDING_T(fun, tparams, modifiers, body) \
00231     LEAN_VARIADIC_PERFECT_FORWARDING_XXL(fun, tparams, LEAN_VARIADIC_HAS_PARAMS, LEAN_NOTHING, LEAN_VARIADIC_NO_PARAMS, modifiers, body, LEAN_NOTHING)
00232 
00234 #define LEAN_VARIADIC_PERFECT_FORWARDING_P(fun, params, modifiers, body, args) \
00235     LEAN_VARIADIC_PERFECT_FORWARDING_XXL(fun, LEAN_NOTHING, LEAN_VARIADIC_NO_PARAMS, params, LEAN_VARIADIC_HAS_PARAMS, modifiers, body, args)
00236 
00238 #define LEAN_VARIADIC_PERFECT_FORWARDING(fun, modifiers, body) \
00239     LEAN_VARIADIC_PERFECT_FORWARDING_XXL(fun, LEAN_NOTHING, LEAN_VARIADIC_NO_PARAMS, LEAN_NOTHING, LEAN_VARIADIC_NO_PARAMS, modifiers, body, LEAN_NOTHING)
00240 
00242 
00243 #endif