--- rxvt-unicode/src/callback.h 2004/02/13 12:16:21 1.3 +++ rxvt-unicode/src/callback.h 2006/05/31 00:32:56 1.8 @@ -1,15 +1,14 @@ -// THIS IS A GENERATED FILE, RUN callback.pl to regenerate it -// THIS IS A GENERATED FILE, RUN callback.pl to regenerate it -// THIS IS A GENERATED FILE, RUN callback.pl to regenerate it -// THIS IS A GENERATED FILE, RUN callback.pl to regenerate it -// THIS IS A GENERATED FILE, RUN callback.pl to regenerate it -// THIS IS A GENERATED FILE, RUN callback.pl to regenerate it +// THIS IS A GENERATED FILE: RUN callback.pl to regenerate it +// THIS IS A GENERATED FILE: callback.pl is part of the GVPE +// THIS IS A GENERATED FILE: distribution. /* callback.h -- C++ callback mechanism - Copyright (C) 2003 Marc Lehmann + Copyright (C) 2003-2006 Marc Lehmann - This program is free software; you can redistribute it and/or modify + This file is part of GVPE. + + GVPE is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. @@ -20,29 +19,40 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + along with gvpe; if not, write to the Free Software + Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef CALLBACK_H__ #define CALLBACK_H__ +#define CALLBACK_H_VERSION 2 + +template +struct callback_funtype_trait; + +template +struct callback_get_impl; + template -class callback0 { +class callback0 +{ struct object { }; + typedef R (object::*ptr_type)(); + void *obj; - R (object::*meth) (); + R (object::*meth)(); /* a proxy is a kind of recipe on how to call a specific class method */ struct proxy_base { - virtual R call (void *obj, R (object::*meth) ()) = 0; + virtual R call (void *obj, R (object::*meth)()) const = 0; }; template struct proxy : proxy_base { - virtual R call (void *obj, R (object::*meth) ()) + virtual R call (void *obj, R (object::*meth)()) const { - ((reinterpret_cast (obj)) ->* (reinterpret_cast (meth))) + return (R)((reinterpret_cast(obj)) ->* (reinterpret_cast(meth))) (); } }; @@ -51,41 +61,65 @@ public: template - callback0 (O1 *object, R (O2::*method) ()) + explicit callback0 (O1 *object, R (O2::*method)()) { static proxy p; - obj = reinterpret_cast (object); - meth = reinterpret_cast (method); + obj = reinterpret_cast(object); + meth = reinterpret_cast(method); prxy = &p; } - R call () const + R call() const { return prxy->call (obj, meth); } - R operator () () const + R operator ()() const { return call (); } }; +template +struct callback_funtype_trait0 +{ + static const int arity = 0; + typedef R type (void); + typedef R result_type; + +}; + +template +struct callback_funtype_trait : callback_funtype_trait0 +{ +}; + +template +struct callback_get_impl<0, signature> +{ + typedef callback_funtype_trait T; + typedef callback0 type; +}; + template -class callback1 { +class callback1 +{ struct object { }; + typedef R (object::*ptr_type)(A1); + void *obj; - R (object::*meth) (A1); + R (object::*meth)(A1); /* a proxy is a kind of recipe on how to call a specific class method */ struct proxy_base { - virtual R call (void *obj, R (object::*meth) (A1), A1 a1) = 0; + virtual R call (void *obj, R (object::*meth)(A1), A1 a1) const = 0; }; template struct proxy : proxy_base { - virtual R call (void *obj, R (object::*meth) (A1), A1 a1) + virtual R call (void *obj, R (object::*meth)(A1), A1 a1) const { - ((reinterpret_cast (obj)) ->* (reinterpret_cast (meth))) + return (R)((reinterpret_cast(obj)) ->* (reinterpret_cast(meth))) (a1); } }; @@ -94,41 +128,65 @@ public: template - callback1 (O1 *object, R (O2::*method) (A1)) + explicit callback1 (O1 *object, R (O2::*method)(A1)) { static proxy p; - obj = reinterpret_cast (object); - meth = reinterpret_cast (method); + obj = reinterpret_cast(object); + meth = reinterpret_cast(method); prxy = &p; } - R call (A1 a1) const + R call(A1 a1) const { return prxy->call (obj, meth, a1); } - R operator () (A1 a1) const + R operator ()(A1 a1) const { return call (a1); } }; +template +struct callback_funtype_trait1 +{ + static const int arity = 1; + typedef R type (A1); + typedef R result_type; + typedef A1 arg1_type; +}; + +template +struct callback_funtype_trait : callback_funtype_trait1 +{ +}; + +template +struct callback_get_impl<1, signature> +{ + typedef callback_funtype_trait T; + typedef callback1 type; +}; + template -class callback2 { +class callback2 +{ struct object { }; + typedef R (object::*ptr_type)(A1, A2); + void *obj; - R (object::*meth) (A1, A2); + R (object::*meth)(A1, A2); /* a proxy is a kind of recipe on how to call a specific class method */ struct proxy_base { - virtual R call (void *obj, R (object::*meth) (A1, A2), A1 a1, A2 a2) = 0; + virtual R call (void *obj, R (object::*meth)(A1, A2), A1 a1, A2 a2) const = 0; }; template struct proxy : proxy_base { - virtual R call (void *obj, R (object::*meth) (A1, A2), A1 a1, A2 a2) + virtual R call (void *obj, R (object::*meth)(A1, A2), A1 a1, A2 a2) const { - ((reinterpret_cast (obj)) ->* (reinterpret_cast (meth))) + return (R)((reinterpret_cast(obj)) ->* (reinterpret_cast(meth))) (a1, a2); } }; @@ -137,41 +195,65 @@ public: template - callback2 (O1 *object, R (O2::*method) (A1, A2)) + explicit callback2 (O1 *object, R (O2::*method)(A1, A2)) { static proxy p; - obj = reinterpret_cast (object); - meth = reinterpret_cast (method); + obj = reinterpret_cast(object); + meth = reinterpret_cast(method); prxy = &p; } - R call (A1 a1, A2 a2) const + R call(A1 a1, A2 a2) const { return prxy->call (obj, meth, a1, a2); } - R operator () (A1 a1, A2 a2) const + R operator ()(A1 a1, A2 a2) const { return call (a1, a2); } }; +template +struct callback_funtype_trait2 +{ + static const int arity = 2; + typedef R type (A1, A2); + typedef R result_type; + typedef A1 arg1_type; typedef A2 arg2_type; +}; + +template +struct callback_funtype_trait : callback_funtype_trait2 +{ +}; + +template +struct callback_get_impl<2, signature> +{ + typedef callback_funtype_trait T; + typedef callback2 type; +}; + template -class callback3 { +class callback3 +{ struct object { }; + typedef R (object::*ptr_type)(A1, A2, A3); + void *obj; - R (object::*meth) (A1, A2, A3); + R (object::*meth)(A1, A2, A3); /* a proxy is a kind of recipe on how to call a specific class method */ struct proxy_base { - virtual R call (void *obj, R (object::*meth) (A1, A2, A3), A1 a1, A2 a2, A3 a3) = 0; + virtual R call (void *obj, R (object::*meth)(A1, A2, A3), A1 a1, A2 a2, A3 a3) const = 0; }; template struct proxy : proxy_base { - virtual R call (void *obj, R (object::*meth) (A1, A2, A3), A1 a1, A2 a2, A3 a3) + virtual R call (void *obj, R (object::*meth)(A1, A2, A3), A1 a1, A2 a2, A3 a3) const { - ((reinterpret_cast (obj)) ->* (reinterpret_cast (meth))) + return (R)((reinterpret_cast(obj)) ->* (reinterpret_cast(meth))) (a1, a2, a3); } }; @@ -180,41 +262,65 @@ public: template - callback3 (O1 *object, R (O2::*method) (A1, A2, A3)) + explicit callback3 (O1 *object, R (O2::*method)(A1, A2, A3)) { static proxy p; - obj = reinterpret_cast (object); - meth = reinterpret_cast (method); + obj = reinterpret_cast(object); + meth = reinterpret_cast(method); prxy = &p; } - R call (A1 a1, A2 a2, A3 a3) const + R call(A1 a1, A2 a2, A3 a3) const { return prxy->call (obj, meth, a1, a2, a3); } - R operator () (A1 a1, A2 a2, A3 a3) const + R operator ()(A1 a1, A2 a2, A3 a3) const { return call (a1, a2, a3); } }; +template +struct callback_funtype_trait3 +{ + static const int arity = 3; + typedef R type (A1, A2, A3); + typedef R result_type; + typedef A1 arg1_type; typedef A2 arg2_type; typedef A3 arg3_type; +}; + +template +struct callback_funtype_trait : callback_funtype_trait3 +{ +}; + +template +struct callback_get_impl<3, signature> +{ + typedef callback_funtype_trait T; + typedef callback3 type; +}; + template -class callback4 { +class callback4 +{ struct object { }; + typedef R (object::*ptr_type)(A1, A2, A3, A4); + void *obj; - R (object::*meth) (A1, A2, A3, A4); + R (object::*meth)(A1, A2, A3, A4); /* a proxy is a kind of recipe on how to call a specific class method */ struct proxy_base { - virtual R call (void *obj, R (object::*meth) (A1, A2, A3, A4), A1 a1, A2 a2, A3 a3, A4 a4) = 0; + virtual R call (void *obj, R (object::*meth)(A1, A2, A3, A4), A1 a1, A2 a2, A3 a3, A4 a4) const = 0; }; template struct proxy : proxy_base { - virtual R call (void *obj, R (object::*meth) (A1, A2, A3, A4), A1 a1, A2 a2, A3 a3, A4 a4) + virtual R call (void *obj, R (object::*meth)(A1, A2, A3, A4), A1 a1, A2 a2, A3 a3, A4 a4) const { - ((reinterpret_cast (obj)) ->* (reinterpret_cast (meth))) + return (R)((reinterpret_cast(obj)) ->* (reinterpret_cast(meth))) (a1, a2, a3, a4); } }; @@ -223,41 +329,65 @@ public: template - callback4 (O1 *object, R (O2::*method) (A1, A2, A3, A4)) + explicit callback4 (O1 *object, R (O2::*method)(A1, A2, A3, A4)) { static proxy p; - obj = reinterpret_cast (object); - meth = reinterpret_cast (method); + obj = reinterpret_cast(object); + meth = reinterpret_cast(method); prxy = &p; } - R call (A1 a1, A2 a2, A3 a3, A4 a4) const + R call(A1 a1, A2 a2, A3 a3, A4 a4) const { return prxy->call (obj, meth, a1, a2, a3, a4); } - R operator () (A1 a1, A2 a2, A3 a3, A4 a4) const + R operator ()(A1 a1, A2 a2, A3 a3, A4 a4) const { return call (a1, a2, a3, a4); } }; +template +struct callback_funtype_trait4 +{ + static const int arity = 4; + typedef R type (A1, A2, A3, A4); + typedef R result_type; + typedef A1 arg1_type; typedef A2 arg2_type; typedef A3 arg3_type; typedef A4 arg4_type; +}; + +template +struct callback_funtype_trait : callback_funtype_trait4 +{ +}; + +template +struct callback_get_impl<4, signature> +{ + typedef callback_funtype_trait T; + typedef callback4 type; +}; + template -class callback5 { +class callback5 +{ struct object { }; + typedef R (object::*ptr_type)(A1, A2, A3, A4, A5); + void *obj; - R (object::*meth) (A1, A2, A3, A4, A5); + R (object::*meth)(A1, A2, A3, A4, A5); /* a proxy is a kind of recipe on how to call a specific class method */ struct proxy_base { - virtual R call (void *obj, R (object::*meth) (A1, A2, A3, A4, A5), A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) = 0; + virtual R call (void *obj, R (object::*meth)(A1, A2, A3, A4, A5), A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) const = 0; }; template struct proxy : proxy_base { - virtual R call (void *obj, R (object::*meth) (A1, A2, A3, A4, A5), A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) + virtual R call (void *obj, R (object::*meth)(A1, A2, A3, A4, A5), A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) const { - ((reinterpret_cast (obj)) ->* (reinterpret_cast (meth))) + return (R)((reinterpret_cast(obj)) ->* (reinterpret_cast(meth))) (a1, a2, a3, a4, a5); } }; @@ -266,41 +396,65 @@ public: template - callback5 (O1 *object, R (O2::*method) (A1, A2, A3, A4, A5)) + explicit callback5 (O1 *object, R (O2::*method)(A1, A2, A3, A4, A5)) { static proxy p; - obj = reinterpret_cast (object); - meth = reinterpret_cast (method); + obj = reinterpret_cast(object); + meth = reinterpret_cast(method); prxy = &p; } - R call (A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) const + R call(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) const { return prxy->call (obj, meth, a1, a2, a3, a4, a5); } - R operator () (A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) const + R operator ()(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) const { return call (a1, a2, a3, a4, a5); } }; +template +struct callback_funtype_trait5 +{ + static const int arity = 5; + typedef R type (A1, A2, A3, A4, A5); + typedef R result_type; + typedef A1 arg1_type; typedef A2 arg2_type; typedef A3 arg3_type; typedef A4 arg4_type; typedef A5 arg5_type; +}; + +template +struct callback_funtype_trait : callback_funtype_trait5 +{ +}; + +template +struct callback_get_impl<5, signature> +{ + typedef callback_funtype_trait T; + typedef callback5 type; +}; + template -class callback6 { +class callback6 +{ struct object { }; + typedef R (object::*ptr_type)(A1, A2, A3, A4, A5, A6); + void *obj; - R (object::*meth) (A1, A2, A3, A4, A5, A6); + R (object::*meth)(A1, A2, A3, A4, A5, A6); /* a proxy is a kind of recipe on how to call a specific class method */ struct proxy_base { - virtual R call (void *obj, R (object::*meth) (A1, A2, A3, A4, A5, A6), A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) = 0; + virtual R call (void *obj, R (object::*meth)(A1, A2, A3, A4, A5, A6), A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) const = 0; }; template struct proxy : proxy_base { - virtual R call (void *obj, R (object::*meth) (A1, A2, A3, A4, A5, A6), A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) + virtual R call (void *obj, R (object::*meth)(A1, A2, A3, A4, A5, A6), A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) const { - ((reinterpret_cast (obj)) ->* (reinterpret_cast (meth))) + return (R)((reinterpret_cast(obj)) ->* (reinterpret_cast(meth))) (a1, a2, a3, a4, a5, a6); } }; @@ -309,41 +463,65 @@ public: template - callback6 (O1 *object, R (O2::*method) (A1, A2, A3, A4, A5, A6)) + explicit callback6 (O1 *object, R (O2::*method)(A1, A2, A3, A4, A5, A6)) { static proxy p; - obj = reinterpret_cast (object); - meth = reinterpret_cast (method); + obj = reinterpret_cast(object); + meth = reinterpret_cast(method); prxy = &p; } - R call (A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) const + R call(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) const { return prxy->call (obj, meth, a1, a2, a3, a4, a5, a6); } - R operator () (A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) const + R operator ()(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) const { return call (a1, a2, a3, a4, a5, a6); } }; +template +struct callback_funtype_trait6 +{ + static const int arity = 6; + typedef R type (A1, A2, A3, A4, A5, A6); + typedef R result_type; + typedef A1 arg1_type; typedef A2 arg2_type; typedef A3 arg3_type; typedef A4 arg4_type; typedef A5 arg5_type; typedef A6 arg6_type; +}; + +template +struct callback_funtype_trait : callback_funtype_trait6 +{ +}; + +template +struct callback_get_impl<6, signature> +{ + typedef callback_funtype_trait T; + typedef callback6 type; +}; + template -class callback7 { +class callback7 +{ struct object { }; + typedef R (object::*ptr_type)(A1, A2, A3, A4, A5, A6, A7); + void *obj; - R (object::*meth) (A1, A2, A3, A4, A5, A6, A7); + R (object::*meth)(A1, A2, A3, A4, A5, A6, A7); /* a proxy is a kind of recipe on how to call a specific class method */ struct proxy_base { - virtual R call (void *obj, R (object::*meth) (A1, A2, A3, A4, A5, A6, A7), A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) = 0; + virtual R call (void *obj, R (object::*meth)(A1, A2, A3, A4, A5, A6, A7), A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) const = 0; }; template struct proxy : proxy_base { - virtual R call (void *obj, R (object::*meth) (A1, A2, A3, A4, A5, A6, A7), A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) + virtual R call (void *obj, R (object::*meth)(A1, A2, A3, A4, A5, A6, A7), A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) const { - ((reinterpret_cast (obj)) ->* (reinterpret_cast (meth))) + return (R)((reinterpret_cast(obj)) ->* (reinterpret_cast(meth))) (a1, a2, a3, a4, a5, a6, a7); } }; @@ -352,23 +530,258 @@ public: template - callback7 (O1 *object, R (O2::*method) (A1, A2, A3, A4, A5, A6, A7)) + explicit callback7 (O1 *object, R (O2::*method)(A1, A2, A3, A4, A5, A6, A7)) { static proxy p; - obj = reinterpret_cast (object); - meth = reinterpret_cast (method); + obj = reinterpret_cast(object); + meth = reinterpret_cast(method); prxy = &p; } - R call (A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) const + R call(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) const { return prxy->call (obj, meth, a1, a2, a3, a4, a5, a6, a7); } - R operator () (A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) const + R operator ()(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) const { return call (a1, a2, a3, a4, a5, a6, a7); } }; +template +struct callback_funtype_trait7 +{ + static const int arity = 7; + typedef R type (A1, A2, A3, A4, A5, A6, A7); + typedef R result_type; + typedef A1 arg1_type; typedef A2 arg2_type; typedef A3 arg3_type; typedef A4 arg4_type; typedef A5 arg5_type; typedef A6 arg6_type; typedef A7 arg7_type; +}; + +template +struct callback_funtype_trait : callback_funtype_trait7 +{ +}; + +template +struct callback_get_impl<7, signature> +{ + typedef callback_funtype_trait T; + typedef callback7 type; +}; + +template +class callback8 +{ + struct object { }; + + typedef R (object::*ptr_type)(A1, A2, A3, A4, A5, A6, A7, A8); + + void *obj; + R (object::*meth)(A1, A2, A3, A4, A5, A6, A7, A8); + + /* a proxy is a kind of recipe on how to call a specific class method */ + struct proxy_base { + virtual R call (void *obj, R (object::*meth)(A1, A2, A3, A4, A5, A6, A7, A8), A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8) const = 0; + }; + template + struct proxy : proxy_base { + virtual R call (void *obj, R (object::*meth)(A1, A2, A3, A4, A5, A6, A7, A8), A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8) const + { + return (R)((reinterpret_cast(obj)) ->* (reinterpret_cast(meth))) + (a1, a2, a3, a4, a5, a6, a7, a8); + } + }; + + proxy_base *prxy; + +public: + template + explicit callback8 (O1 *object, R (O2::*method)(A1, A2, A3, A4, A5, A6, A7, A8)) + { + static proxy p; + obj = reinterpret_cast(object); + meth = reinterpret_cast(method); + prxy = &p; + } + + R call(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8) const + { + return prxy->call (obj, meth, a1, a2, a3, a4, a5, a6, a7, a8); + } + + R operator ()(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8) const + { + return call (a1, a2, a3, a4, a5, a6, a7, a8); + } +}; + +template +struct callback_funtype_trait8 +{ + static const int arity = 8; + typedef R type (A1, A2, A3, A4, A5, A6, A7, A8); + typedef R result_type; + typedef A1 arg1_type; typedef A2 arg2_type; typedef A3 arg3_type; typedef A4 arg4_type; typedef A5 arg5_type; typedef A6 arg6_type; typedef A7 arg7_type; typedef A8 arg8_type; +}; + +template +struct callback_funtype_trait : callback_funtype_trait8 +{ +}; + +template +struct callback_get_impl<8, signature> +{ + typedef callback_funtype_trait T; + typedef callback8 type; +}; + +template +class callback9 +{ + struct object { }; + + typedef R (object::*ptr_type)(A1, A2, A3, A4, A5, A6, A7, A8, A9); + + void *obj; + R (object::*meth)(A1, A2, A3, A4, A5, A6, A7, A8, A9); + + /* a proxy is a kind of recipe on how to call a specific class method */ + struct proxy_base { + virtual R call (void *obj, R (object::*meth)(A1, A2, A3, A4, A5, A6, A7, A8, A9), A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9) const = 0; + }; + template + struct proxy : proxy_base { + virtual R call (void *obj, R (object::*meth)(A1, A2, A3, A4, A5, A6, A7, A8, A9), A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9) const + { + return (R)((reinterpret_cast(obj)) ->* (reinterpret_cast(meth))) + (a1, a2, a3, a4, a5, a6, a7, a8, a9); + } + }; + + proxy_base *prxy; + +public: + template + explicit callback9 (O1 *object, R (O2::*method)(A1, A2, A3, A4, A5, A6, A7, A8, A9)) + { + static proxy p; + obj = reinterpret_cast(object); + meth = reinterpret_cast(method); + prxy = &p; + } + + R call(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9) const + { + return prxy->call (obj, meth, a1, a2, a3, a4, a5, a6, a7, a8, a9); + } + + R operator ()(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9) const + { + return call (a1, a2, a3, a4, a5, a6, a7, a8, a9); + } +}; + +template +struct callback_funtype_trait9 +{ + static const int arity = 9; + typedef R type (A1, A2, A3, A4, A5, A6, A7, A8, A9); + typedef R result_type; + typedef A1 arg1_type; typedef A2 arg2_type; typedef A3 arg3_type; typedef A4 arg4_type; typedef A5 arg5_type; typedef A6 arg6_type; typedef A7 arg7_type; typedef A8 arg8_type; typedef A9 arg9_type; +}; + +template +struct callback_funtype_trait : callback_funtype_trait9 +{ +}; + +template +struct callback_get_impl<9, signature> +{ + typedef callback_funtype_trait T; + typedef callback9 type; +}; + +template +class callback10 +{ + struct object { }; + + typedef R (object::*ptr_type)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10); + + void *obj; + R (object::*meth)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10); + + /* a proxy is a kind of recipe on how to call a specific class method */ + struct proxy_base { + virtual R call (void *obj, R (object::*meth)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10), A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10) const = 0; + }; + template + struct proxy : proxy_base { + virtual R call (void *obj, R (object::*meth)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10), A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10) const + { + return (R)((reinterpret_cast(obj)) ->* (reinterpret_cast(meth))) + (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10); + } + }; + + proxy_base *prxy; + +public: + template + explicit callback10 (O1 *object, R (O2::*method)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10)) + { + static proxy p; + obj = reinterpret_cast(object); + meth = reinterpret_cast(method); + prxy = &p; + } + + R call(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10) const + { + return prxy->call (obj, meth, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10); + } + + R operator ()(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10) const + { + return call (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10); + } +}; + +template +struct callback_funtype_trait10 +{ + static const int arity = 10; + typedef R type (A1, A2, A3, A4, A5, A6, A7, A8, A9, A10); + typedef R result_type; + typedef A1 arg1_type; typedef A2 arg2_type; typedef A3 arg3_type; typedef A4 arg4_type; typedef A5 arg5_type; typedef A6 arg6_type; typedef A7 arg7_type; typedef A8 arg8_type; typedef A9 arg9_type; typedef A10 arg10_type; +}; + +template +struct callback_funtype_trait : callback_funtype_trait10 +{ +}; + +template +struct callback_get_impl<10, signature> +{ + typedef callback_funtype_trait T; + typedef callback10 type; +}; + + +template +struct callback : callback_get_impl::arity, signature>::type +{ + typedef typename callback_get_impl::arity, signature>::type base_type; + + template + explicit callback (O object, M method) + : base_type (object, method) + { + } +}; + #endif