00001
00013 #ifndef BS_CLOSURE_IMPL_H_
00014 #define BS_CLOSURE_IMPL_H_
00015
00016 namespace blue_sky {
00017
00022 template <typename R, typename T, typename M>
00023 struct closure0
00024 {
00025 closure0 (M m)
00026 : m (m)
00027 {
00028 }
00029
00030 R
00031 operator () (T &t)
00032 {
00033 return (t.*m) ();
00034 }
00035
00036 M m;
00037 };
00042 template <typename T, typename M>
00043 struct closure0 <void, T, M>
00044 {
00045 typedef void R;
00046
00047 closure0 (M m)
00048 : m (m)
00049 {
00050 }
00051
00052 R
00053 operator () (T &t)
00054 {
00055 (t.*m) ();
00056 }
00057
00058 M m;
00059 };
00060
00065 template <typename R, typename T, typename M, typename A1>
00066 struct closure1
00067 {
00068 closure1 (M m, A1 a1)
00069 : m (m)
00070 , a1 (a1)
00071 {
00072 }
00073
00074 R
00075 operator () (T &t)
00076 {
00077 return (t.*m) (a1);
00078 }
00079
00080 M m;
00081 A1 a1;
00082 };
00087 template <typename T, typename M, typename A1>
00088 struct closure1 <void, T, M, A1>
00089 {
00090 closure1 (M m, A1 a1)
00091 : m (m)
00092 , a1 (a1)
00093 {
00094 }
00095
00096 void
00097 operator () (T &t)
00098 {
00099 return (t.*m) (a1);
00100 }
00101
00102 M m;
00103 A1 a1;
00104 };
00105
00110 template <typename R, typename T, typename M, typename A1, typename A2>
00111 struct closure2
00112 {
00113 closure2 (M m, A1 a1, A2 a2)
00114 : m (m)
00115 , a1 (a1)
00116 , a2 (a2)
00117 {
00118 }
00119
00120 R
00121 operator () (T &t)
00122 {
00123 return (t.*m) (a1, a2);
00124 }
00125
00126 M m;
00127 A1 a1;
00128 A2 a2;
00129 };
00134 template <typename T, typename M, typename A1, typename A2>
00135 struct closure2 <void, T, M, A1, A2>
00136 {
00137 closure2 (M m, A1 a1, A2 a2)
00138 : m (m)
00139 , a1 (a1)
00140 , a2 (a2)
00141 {
00142 }
00143
00144 void
00145 operator () (T &t)
00146 {
00147 return (t.*m) (a1, a2);
00148 }
00149
00150 M m;
00151 A1 a1;
00152 A2 a2;
00153 };
00154
00159 template <typename R, typename T, typename M, typename A1, typename A2, typename A3>
00160 struct closure3
00161 {
00162 closure3 (M m, A1 a1, A2 a2, A3 a3)
00163 : m (m)
00164 , a1 (a1)
00165 , a2 (a2)
00166 , a3 (a3)
00167 {
00168 }
00169
00170 R
00171 operator () (T &t)
00172 {
00173 return (t.*m) (a1, a2, a3);
00174 }
00175
00176 M m;
00177 A1 a1;
00178 A2 a2;
00179 A3 a3;
00180 };
00185 template <typename T, typename M, typename A1, typename A2, typename A3>
00186 struct closure3 <void, T, M, A1, A2, A3>
00187 {
00188 closure3 (M m, A1 a1, A2 a2, A3 a3)
00189 : m (m)
00190 , a1 (a1)
00191 , a2 (a2)
00192 , a3 (a3)
00193 {
00194 }
00195
00196 void
00197 operator () (T &t)
00198 {
00199 return (t.*m) (a1, a2, a3);
00200 }
00201
00202 M m;
00203 A1 a1;
00204 A2 a2;
00205 A3 a3;
00206 };
00207
00212 template <typename R, typename T, typename M, typename A1, typename A2, typename A3, typename A4>
00213 struct closure4
00214 {
00215 closure4 (M m, A1 a1, A2 a2, A3 a3, A4 a4)
00216 : m (m)
00217 , a1 (a1)
00218 , a2 (a2)
00219 , a3 (a3)
00220 , a4 (a4)
00221 {
00222 }
00223
00224 R
00225 operator () (T &t)
00226 {
00227 return (t.*m) (a1, a2, a3, a4);
00228 }
00229
00230 M m;
00231 A1 a1;
00232 A2 a2;
00233 A3 a3;
00234 A4 a4;
00235 };
00240 template <typename T, typename M, typename A1, typename A2, typename A3, typename A4>
00241 struct closure4 <void, T, M, A1, A2, A3, A4>
00242 {
00243 closure4 (M m, A1 a1, A2 a2, A3 a3, A4 a4)
00244 : m (m)
00245 , a1 (a1)
00246 , a2 (a2)
00247 , a3 (a3)
00248 , a4 (a4)
00249 {
00250 }
00251
00252 void
00253 operator () (T &t)
00254 {
00255 return (t.*m) (a1, a2, a3, a4);
00256 }
00257
00258 M m;
00259 A1 a1;
00260 A2 a2;
00261 A3 a3;
00262 A4 a4;
00263 };
00268 template <typename R, typename T, typename M, typename A1, typename A2, typename A3, typename A4, typename A5>
00269 struct closure5
00270 {
00271 closure5 (M m, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5)
00272 : m (m)
00273 , a1 (a1)
00274 , a2 (a2)
00275 , a3 (a3)
00276 , a4 (a4)
00277 , a5 (a5)
00278 {
00279 }
00280
00281 R
00282 operator () (T &t)
00283 {
00284 return (t.*m) (a1, a2, a3, a4, a5);
00285 }
00286
00287 M m;
00288 A1 a1;
00289 A2 a2;
00290 A3 a3;
00291 A4 a4;
00292 A5 a5;
00293 };
00298 template <typename T, typename M, typename A1, typename A2, typename A3, typename A4, typename A5>
00299 struct closure5 <void, T, M, A1, A2, A3, A4, A5>
00300 {
00301 closure5 (M m, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5)
00302 : m (m)
00303 , a1 (a1)
00304 , a2 (a2)
00305 , a3 (a3)
00306 , a4 (a4)
00307 , a5 (a5)
00308 {
00309 }
00310
00311 void
00312 operator () (T &t)
00313 {
00314 return (t.*m) (a1, a2, a3, a4, a5);
00315 }
00316
00317 M m;
00318 A1 a1;
00319 A2 a2;
00320 A3 a3;
00321 A4 a4;
00322 A5 a5;
00323 };
00324
00329 template <typename R, typename T, typename M, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6>
00330 struct closure6
00331 {
00332 closure6 (M m, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6)
00333 : m (m), a1 (a1), a2 (a2), a3 (a3), a4 (a4), a5 (a5), a6 (a6)
00334 {
00335 }
00336
00337 R
00338 operator () (T &t)
00339 {
00340 return (t.*m) (a1, a2, a3, a4, a5, a6);
00341 }
00342
00343 private:
00344 M m;
00345 A1 a1;
00346 A2 a2;
00347 A3 a3;
00348 A4 a4;
00349 A5 a5;
00350 A6 a6;
00351 };
00356 template <typename T, typename M, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6>
00357 struct closure6<void, T, M, A1, A2, A3, A4, A5, A6>
00358 {
00359 closure6 (M m, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6)
00360 : m (m), a1 (a1), a2 (a2), a3 (a3), a4 (a4), a5 (a5), a6 (a6)
00361 {
00362 }
00363
00364 void
00365 operator () (T &t)
00366 {
00367 (t.*m) (a1, a2, a3, a4, a5, a6);
00368 }
00369
00370 private:
00371 M m;
00372 A1 a1;
00373 A2 a2;
00374 A3 a3;
00375 A4 a4;
00376 A5 a5;
00377 A6 a6;
00378 };
00379
00381 template <typename R, typename T>
00382 closure0 <R, T, R (T::*) () const>
00383 closure (R (T::*m) () const)
00384 {
00385 return closure0 <R, T, R (T::*) () const> (m);
00386 }
00387 template <typename R, typename T>
00388 closure0 <R, T, R (T::*) ()>
00389 closure (R (T::*m) ())
00390 {
00391 return closure0 <R, T, R (T::*) ()> (m);
00392 }
00393
00395 template <typename R, typename T, typename A1>
00396 closure1 <R, T, R (T::*) (A1) const, A1>
00397 closure (R (T::*m) (A1) const, A1 a1)
00398 {
00399 return closure1 <R, T, R (T::*) (A1) const, A1> (m, a1);
00400 }
00401 template <typename R, typename T, typename A1>
00402 closure1 <R, T, R (T::*) (A1), A1>
00403 closure (R (T::*m) (A1), A1 a1)
00404 {
00405 return closure1 <R, T, R (T::*) (A1), A1> (m, a1);
00406 }
00407
00409 template <typename R, typename T, typename A1, typename A2>
00410 closure2 <R, T, R (T::*) (A1, A2), A1, A2>
00411 closure (R (T::*m) (A1, A2), A1 a1, A2 a2)
00412 {
00413 return closure2 <R, T, R (T::*) (A1, A2), A1, A2> (m, a1, a2);
00414 }
00415 template <typename R, typename T, typename A1, typename A2>
00416 closure2 <R, T, R (T::*) (A1, A2) const, A1, A2>
00417 closure (R (T::*m) (A1, A2) const, A1 a1, A2 a2)
00418 {
00419 return closure2 <R, T, R (T::*) (A1, A2) const, A1, A2> (m, a1, a2);
00420 }
00421
00423 template <typename R, typename T, typename A1, typename A2, typename A3>
00424 closure3 <R, T, R (T::*) (A1, A2, A3), A1, A2, A3>
00425 closure (R (T::*m) (A1, A2, A3), A1 a1, A2 a2, A3 a3)
00426 {
00427 return closure3 <R, T, R (T::*) (A1, A2, A3), A1, A2, A3> (m, a1, a2, a3);
00428 }
00429
00431 template <typename R, typename T, typename A1, typename A2, typename A3, typename A4>
00432 closure4 <R, T, R (T::*) (A1, A2, A3, A4), A1, A2, A3, A4>
00433 closure (R (T::*m) (A1, A2, A3, A4), A1 a1, A2 a2, A3 a3, A4 a4)
00434 {
00435 return closure4 <R, T, R (T::*) (A1, A2, A3, A4), A1, A2, A3, A4> (m, a1, a2, a3, a4);
00436 }
00437 template <typename R, typename T, typename A1, typename A2, typename A3, typename A4>
00438 closure4 <R, T, R (T::*) (A1, A2, A3, A4) const, A1, A2, A3, A4>
00439 closure (R (T::*m) (A1, A2, A3, A4) const, A1 a1, A2 a2, A3 a3, A4 a4)
00440 {
00441 return closure4 <R, T, R (T::*) (A1, A2, A3, A4) const, A1, A2, A3, A4> (m, a1, a2, a3, a4);
00442 }
00443
00445 template <typename R, typename T, typename A1, typename A2, typename A3, typename A4, typename A5>
00446 closure5 <R, T, R (T::*) (A1, A2, A3, A4, A5) const, A1, A2, A3, A4, A5>
00447 closure (R (T::*m) (A1, A2, A3, A4, A5) const, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5)
00448 {
00449 return closure5 <R, T, R (T::*) (A1, A2, A3, A4, A5) const, A1, A2, A3, A4, A5> (m, a1, a2, a3, a4, a5);
00450 }
00451 template <typename R, typename T, typename A1, typename A2, typename A3, typename A4, typename A5>
00452 closure5 <R, T, R (T::*) (A1, A2, A3, A4, A5), A1, A2, A3, A4, A5>
00453 closure (R (T::*m) (A1, A2, A3, A4, A5), A1 a1, A2 a2, A3 a3, A4 a4, A5 a5)
00454 {
00455 return closure5 <R, T, R (T::*) (A1, A2, A3, A4, A5), A1, A2, A3, A4, A5> (m, a1, a2, a3, a4, a5);
00456 }
00457
00459 template <typename R, typename T, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6>
00460 closure6 <R, T, R (T::*) (A1, A2, A3, A4, A5, A6) const, A1, A2, A3, A4, A5, A6>
00461 closure (R (T::*m) (A1, A2, A3, A4, A5, A6) const, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6)
00462 {
00463 return closure6 <R, T, R (T::*) (A1, A2, A3, A4, A5, A6) const, A1, A2, A3, A4, A5, A6> (m, a1, a2, a3, a4, a5, a6);
00464 }
00465 template <typename R, typename T, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6>
00466 closure6 <R, T, R (T::*) (A1, A2, A3, A4, A5, A6), A1, A2, A3, A4, A5, A6>
00467 closure (R (T::*m) (A1, A2, A3, A4, A5, A6), A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6)
00468 {
00469 return closure6 <R, T, R (T::*) (A1, A2, A3, A4, A5, A6), A1, A2, A3, A4, A5, A6> (m, a1, a2, a3, a4, a5, a6);
00470 }
00471
00472 }
00473
00474
00475 #endif // #ifndef BS_CLOSURE_IMPL_H_
00476