lean cpp library
A lean C++ library providing efficient utility classes for high-performance C++ applications.
|
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