00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00045 #ifndef RC_MEMBER_FUNC_H_
00046 #define RC_MEMBER_FUNC_H_
00047
00048 namespace ReChannel {
00049
00050 template<typename METHOD_PTR> struct rc_member_func;
00051
00052 template<class R, class T>
00053 struct rc_member_func<R (T::*)()>
00054 {
00055 typedef R (T::*method_ptr_type)();
00056 rc_member_func(T& obj, method_ptr_type mp)
00057 : p_obj(obj), p_mp(mp)
00058 { }
00059 inline R operator()() const
00060 { return (p_obj.*p_mp)(); }
00061 private:
00062 T& p_obj;
00063 method_ptr_type p_mp;
00064 };
00065
00066 template<class R, class T>
00067 struct rc_member_func<R (T::*)() const>
00068 {
00069 typedef R (T::*method_ptr_type)() const;
00070 rc_member_func(T& obj, method_ptr_type mp)
00071 : p_obj(obj), p_mp(mp)
00072 { }
00073 inline R operator()() const
00074 { return (p_obj.*p_mp)(); }
00075 private:
00076 T& p_obj;
00077 method_ptr_type p_mp;
00078 };
00079
00080 template<class R, class T, class A1>
00081 struct rc_member_func<R (T::*)(A1)>
00082 {
00083 typedef R (T::*method_ptr_type)(A1);
00084 rc_member_func(T& obj, method_ptr_type mp)
00085 : p_obj(obj), p_mp(mp)
00086 { }
00087 inline R operator()(A1 a1) const
00088 { return (p_obj.*p_mp)(a1); }
00089 private:
00090 T& p_obj;
00091 method_ptr_type p_mp;
00092 };
00093
00094 template<class R, class T, class A1>
00095 struct rc_member_func<R (T::*)(A1) const>
00096 {
00097 typedef R (T::*method_ptr_type)(A1) const;
00098 rc_member_func(T& obj, method_ptr_type mp)
00099 : p_obj(obj), p_mp(mp)
00100 { }
00101 inline R operator()(A1 a1) const
00102 { return (p_obj.*p_mp)(a1); }
00103 private:
00104 T& p_obj;
00105 method_ptr_type p_mp;
00106 };
00107
00108 template<class R, class T, class A1, class A2>
00109 struct rc_member_func<R (T::*)(A1, A2)>
00110 {
00111 typedef R (T::*method_ptr_type)(A1, A2);
00112 rc_member_func(T& obj, method_ptr_type mp)
00113 : p_obj(obj), p_mp(mp)
00114 { }
00115 inline R operator()(A1 a1, A2 a2) const
00116 { return (p_obj.*p_mp)(a1, a2); }
00117 private:
00118 T& p_obj;
00119 method_ptr_type p_mp;
00120 };
00121
00122 template<class R, class T, class A1, class A2>
00123 struct rc_member_func<R (T::*)(A1, A2) const>
00124 {
00125 typedef R (T::*method_ptr_type)(A1, A2) const;
00126 rc_member_func(T& obj, method_ptr_type mp)
00127 : p_obj(obj), p_mp(mp)
00128 { }
00129 inline R operator()(A1 a1, A2 a2) const
00130 { return (p_obj.*p_mp)(a1, a2); }
00131 private:
00132 T& p_obj;
00133 method_ptr_type p_mp;
00134 };
00135
00136 template<class R, class T, class A1, class A2, class A3>
00137 struct rc_member_func<R (T::*)(A1, A2, A3)>
00138 {
00139 typedef R (T::*method_ptr_type)(A1, A2, A3);
00140 rc_member_func(T& obj, method_ptr_type mp)
00141 : p_obj(obj), p_mp(mp)
00142 { }
00143 inline R operator()(
00144 A1 a1, A2 a2, A3 a3) const
00145 { return (p_obj.*p_mp)(a1, a2, a3); }
00146 private:
00147 T& p_obj;
00148 method_ptr_type p_mp;
00149 };
00150
00151 template<class R, class T, class A1, class A2, class A3>
00152 struct rc_member_func<R (T::*)(A1, A2, A3) const>
00153 {
00154 typedef R (T::*method_ptr_type)(A1, A2, A3) const;
00155 rc_member_func(T& obj, method_ptr_type mp)
00156 : p_obj(obj), p_mp(mp)
00157 { }
00158 inline R operator()(
00159 A1 a1, A2 a2, A3 a3) const
00160 { return (p_obj.*p_mp)(a1, a2, a3); }
00161 private:
00162 T& p_obj;
00163 method_ptr_type p_mp;
00164 };
00165
00166 template<class R, class T, class A1, class A2, class A3, class A4>
00167 struct rc_member_func<R (T::*)(A1, A2, A3, A4)>
00168 {
00169 typedef R (T::*method_ptr_type)(A1, A2, A3, A4);
00170 rc_member_func(T& obj, method_ptr_type mp)
00171 : p_obj(obj), p_mp(mp)
00172 { }
00173 inline R operator()(A1 a1, A2 a2, A3 a3, A4 a4) const
00174 { return (p_obj.*p_mp)(a1, a2, a3, a4); }
00175 private:
00176 T& p_obj;
00177 method_ptr_type p_mp;
00178 };
00179
00180 template<class R, class T, class A1, class A2, class A3, class A4>
00181 struct rc_member_func<R (T::*)(A1, A2, A3, A4) const>
00182 {
00183 typedef R (T::*method_ptr_type)(A1, A2, A3, A4) const;
00184 rc_member_func(T& obj, method_ptr_type mp)
00185 : p_obj(obj), p_mp(mp)
00186 { }
00187 inline R operator()(A1 a1, A2 a2, A3 a3, A4 a4) const
00188 { return (p_obj.*p_mp)(a1, a2, a3, a4); }
00189 private:
00190 T& p_obj;
00191 method_ptr_type p_mp;
00192 };
00193
00194 template<class R, class T, class A1, class A2, class A3, class A4,
00195 class A5>
00196 struct rc_member_func<R (T::*)(A1, A2, A3, A4, A5)>
00197 {
00198 typedef R (T::*method_ptr_type)(A1, A2, A3, A4, A5);
00199 rc_member_func(T& obj, method_ptr_type mp)
00200 : p_obj(obj), p_mp(mp)
00201 { }
00202 inline R operator()(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) const
00203 { return (p_obj.*p_mp)(a1, a2, a3, a4, a5); }
00204 private:
00205 T& p_obj;
00206 method_ptr_type p_mp;
00207 };
00208
00209 template<class R, class T, class A1, class A2, class A3, class A4,
00210 class A5>
00211 struct rc_member_func<R (T::*)(A1, A2, A3, A4, A5) const>
00212 {
00213 typedef R (T::*method_ptr_type)(A1, A2, A3, A4, A5) const;
00214 rc_member_func(T& obj, method_ptr_type mp)
00215 : p_obj(obj), p_mp(mp)
00216 { }
00217 inline R operator()(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) const
00218 { return (p_obj.*p_mp)(a1, a2, a3, a4, a5); }
00219 private:
00220 T& p_obj;
00221 method_ptr_type p_mp;
00222 };
00223
00224 template<class R, class T, class A1, class A2, class A3, class A4,
00225 class A5, class A6>
00226 struct rc_member_func<R (T::*)(A1, A2, A3, A4, A5, A6)>
00227 {
00228 typedef R (T::*method_ptr_type)(A1, A2, A3, A4, A5, A6);
00229 rc_member_func(T& obj, method_ptr_type mp)
00230 : p_obj(obj), p_mp(mp)
00231 { }
00232 inline R operator()(
00233 A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) const
00234 { return (p_obj.*p_mp)(a1, a2, a3, a4, a5, a6); }
00235 private:
00236 T& p_obj;
00237 method_ptr_type p_mp;
00238 };
00239
00240 template<class R, class T, class A1, class A2, class A3, class A4,
00241 class A5, class A6>
00242 struct rc_member_func<R (T::*)(A1, A2, A3, A4, A5, A6) const>
00243 {
00244 typedef R (T::*method_ptr_type)(A1, A2, A3, A4, A5, A6) const;
00245 rc_member_func(T& obj, method_ptr_type mp)
00246 : p_obj(obj), p_mp(mp)
00247 { }
00248 inline R operator()(
00249 A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) const
00250 { return (p_obj.*p_mp)(a1, a2, a3, a4, a5, a6); }
00251 private:
00252 T& p_obj;
00253 method_ptr_type p_mp;
00254 };
00255
00256 template<class R, class T, class A1, class A2, class A3, class A4,
00257 class A5, class A6, class A7>
00258 struct rc_member_func<R (T::*)(A1, A2, A3, A4, A5, A6, A7)>
00259 {
00260 typedef R (T::*method_ptr_type)(A1, A2, A3, A4, A5, A6, A7);
00261 rc_member_func(T& obj, method_ptr_type mp)
00262 : p_obj(obj), p_mp(mp)
00263 { }
00264 inline R operator()(
00265 A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) const
00266 { return (p_obj.*p_mp)(a1, a2, a3, a4, a5, a6, a7); }
00267 private:
00268 T& p_obj;
00269 method_ptr_type p_mp;
00270 };
00271
00272 template<class R, class T, class A1, class A2, class A3, class A4,
00273 class A5, class A6, class A7>
00274 struct rc_member_func<R (T::*)(A1, A2, A3, A4, A5, A6, A7) const>
00275 {
00276 typedef R (T::*method_ptr_type)(A1, A2, A3, A4, A5, A6, A7) const;
00277 rc_member_func(T& obj, method_ptr_type mp)
00278 : p_obj(obj), p_mp(mp)
00279 { }
00280 inline R operator()(
00281 A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) const
00282 { return (p_obj.*p_mp)(a1, a2, a3, a4, a5, a6, a7); }
00283 private:
00284 T& p_obj;
00285 method_ptr_type p_mp;
00286 };
00287
00288 template<class R, class T, class A1, class A2, class A3, class A4,
00289 class A5, class A6, class A7, class A8>
00290 struct rc_member_func<R (T::*)(A1, A2, A3, A4, A5, A6, A7, A8)>
00291 {
00292 typedef R (T::*method_ptr_type)(A1, A2, A3, A4, A5, A6, A7, A8);
00293 rc_member_func(T& obj, method_ptr_type mp)
00294 : p_obj(obj), p_mp(mp)
00295 { }
00296 inline R operator()(
00297 A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8) const
00298 { return (p_obj.*p_mp)(a1, a2, a3, a4, a5, a6, a7, a8); }
00299 private:
00300 T& p_obj;
00301 method_ptr_type p_mp;
00302 };
00303
00304 template<class R, class T, class A1, class A2, class A3, class A4,
00305 class A5, class A6, class A7, class A8>
00306 struct rc_member_func<R (T::*)(A1, A2, A3, A4, A5, A6, A7, A8) const>
00307 {
00308 typedef R (T::*method_ptr_type)(A1, A2, A3, A4, A5, A6, A7, A8) const;
00309 rc_member_func(T& obj, method_ptr_type mp)
00310 : p_obj(obj), p_mp(mp)
00311 { }
00312 inline R operator()(
00313 A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8) const
00314 { return (p_obj.*p_mp)(a1, a2, a3, a4, a5, a6, a7, a8); }
00315 private:
00316 T& p_obj;
00317 method_ptr_type p_mp;
00318 };
00319
00320 template<class R, class T, class A1, class A2, class A3, class A4,
00321 class A5, class A6, class A7, class A8, class A9>
00322 struct rc_member_func<R (T::*)(A1, A2, A3, A4, A5, A6, A7, A8, A9)>
00323 {
00324 typedef R (T::*method_ptr_type)(A1, A2, A3, A4, A5, A6, A7, A8, A9);
00325 rc_member_func(T& obj, method_ptr_type mp)
00326 : p_obj(obj), p_mp(mp)
00327 { }
00328 inline R operator()(
00329 A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8,
00330 A9 a9) const
00331 { return (p_obj.*p_mp)(a1, a2, a3, a4, a5, a6, a7, a8, a9); }
00332 private:
00333 T& p_obj;
00334 method_ptr_type p_mp;
00335 };
00336
00337 template<class R, class T, class A1, class A2, class A3, class A4,
00338 class A5, class A6, class A7, class A8, class A9>
00339 struct rc_member_func<R (T::*)(A1, A2, A3, A4, A5, A6, A7, A8, A9) const>
00340 {
00341 typedef R (T::*method_ptr_type)(
00342 A1, A2, A3, A4, A5, A6, A7, A8, A9) const;
00343 rc_member_func(T& obj, method_ptr_type mp)
00344 : p_obj(obj), p_mp(mp)
00345 { }
00346 inline R operator()(
00347 A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8,
00348 A9 a9) const
00349 { return (p_obj.*p_mp)(a1, a2, a3, a4, a5, a6, a7, a8, a9); }
00350 private:
00351 T& p_obj;
00352 method_ptr_type p_mp;
00353 };
00354
00355 template<class R, class T, class A1, class A2, class A3, class A4,
00356 class A5, class A6, class A7, class A8, class A9, class A10>
00357 struct
00358 rc_member_func<R (T::*)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10)>
00359 {
00360 typedef R (T::*method_ptr_type)(
00361 A1, A2, A3, A4, A5, A6, A7, A8, A9, A10);
00362 rc_member_func(T& obj, method_ptr_type mp)
00363 : p_obj(obj), p_mp(mp)
00364 { }
00365 inline R operator()(
00366 A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8,
00367 A9 a9, A10 a10) const
00368 { return (p_obj.*p_mp)(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10); }
00369 private:
00370 T& p_obj;
00371 method_ptr_type p_mp;
00372 };
00373
00374 template<class R, class T, class A1, class A2, class A3, class A4,
00375 class A5, class A6, class A7, class A8, class A9, class A10>
00376 struct
00377 rc_member_func<R (T::*)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10) const>
00378 {
00379 typedef R (T::*method_ptr_type)(
00380 A1, A2, A3, A4, A5, A6, A7, A8, A9, A10) const;
00381 rc_member_func(T& obj, method_ptr_type mp)
00382 : p_obj(obj), p_mp(mp)
00383 { }
00384 inline R operator()(
00385 A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8,
00386 A9 a9, A10 a10) const
00387 { return (p_obj.*p_mp)(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10); }
00388 private:
00389 T& p_obj;
00390 method_ptr_type p_mp;
00391 };
00392
00393 }
00394
00395 #endif // RC_MEMBER_FUNC_H_
00396
00397
00398
00399
00400
00401