--- gvpe/src/callback.h 2006/05/31 00:31:47 1.10 +++ gvpe/src/callback.h 2018/11/18 00:02:56 1.16 @@ -1,787 +1,75 @@ -// 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-2006 Marc Lehmann - - 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. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with gvpe; if not, write to the Free Software - Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * callback.h -- C++ callback mechanism + * Copyright (C) 2003-2018 Marc Lehmann + * + * This file is part of GVPE. + * + * This program 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 3 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 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, see . + * + * Additional permission under GNU GPL version 3 section 7 + * + * If you modify this Program, or any covered work, by linking or + * combining it with the OpenSSL project's OpenSSL library (or a modified + * version of that library), containing parts covered by the terms of the + * OpenSSL or SSLeay licenses, the licensors of this Program grant you + * additional permission to convey the resulting work. Corresponding + * Source for a non-source form of such a combination shall include the + * source code for the parts of OpenSSL used as well as that of the + * covered work. */ #ifndef CALLBACK_H__ #define CALLBACK_H__ -#define CALLBACK_H_VERSION 2 - -template -struct callback_funtype_trait; - -template -struct callback_get_impl; - -template -class callback0 -{ - struct object { }; - - typedef R (object::*ptr_type)(); - - void *obj; - 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)()) const = 0; - }; - template - struct proxy : proxy_base { - virtual R call (void *obj, R (object::*meth)()) const - { - return (R)((reinterpret_cast(obj)) ->* (reinterpret_cast(meth))) - (); - } - }; - - proxy_base *prxy; - -public: - template - explicit callback0 (O1 *object, R (O2::*method)()) - { - static proxy p; - obj = reinterpret_cast(object); - meth = reinterpret_cast(method); - prxy = &p; - } - - R call() const - { - return prxy->call (obj, meth); - } - - 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 -{ - struct object { }; - - typedef R (object::*ptr_type)(A1); - - void *obj; - 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) const = 0; - }; - template - struct proxy : proxy_base { - virtual R call (void *obj, R (object::*meth)(A1), A1 a1) const - { - return (R)((reinterpret_cast(obj)) ->* (reinterpret_cast(meth))) - (a1); - } - }; - - proxy_base *prxy; - -public: - template - explicit callback1 (O1 *object, R (O2::*method)(A1)) - { - static proxy p; - obj = reinterpret_cast(object); - meth = reinterpret_cast(method); - prxy = &p; - } - - R call(A1 a1) const - { - return prxy->call (obj, meth, a1); - } - - 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 -{ - struct object { }; - - typedef R (object::*ptr_type)(A1, A2); - - void *obj; - 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) const = 0; - }; - template - struct proxy : proxy_base { - virtual R call (void *obj, R (object::*meth)(A1, A2), A1 a1, A2 a2) const - { - return (R)((reinterpret_cast(obj)) ->* (reinterpret_cast(meth))) - (a1, a2); - } - }; - - proxy_base *prxy; - -public: - template - explicit callback2 (O1 *object, R (O2::*method)(A1, A2)) - { - static proxy p; - obj = reinterpret_cast(object); - meth = reinterpret_cast(method); - prxy = &p; - } - - R call(A1 a1, A2 a2) const - { - return prxy->call (obj, meth, a1, a2); - } - - 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 -{ - struct object { }; - - typedef R (object::*ptr_type)(A1, A2, A3); - - void *obj; - 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) const = 0; - }; - template - struct proxy : proxy_base { - virtual R call (void *obj, R (object::*meth)(A1, A2, A3), A1 a1, A2 a2, A3 a3) const - { - return (R)((reinterpret_cast(obj)) ->* (reinterpret_cast(meth))) - (a1, a2, a3); - } - }; - - proxy_base *prxy; - -public: - template - explicit callback3 (O1 *object, R (O2::*method)(A1, A2, A3)) - { - static proxy p; - obj = reinterpret_cast(object); - meth = reinterpret_cast(method); - prxy = &p; - } - - 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 - { - 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 -{ - struct object { }; - - typedef R (object::*ptr_type)(A1, A2, A3, A4); - - void *obj; - 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) 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) const - { - return (R)((reinterpret_cast(obj)) ->* (reinterpret_cast(meth))) - (a1, a2, a3, a4); - } - }; - - proxy_base *prxy; - -public: - template - explicit callback4 (O1 *object, R (O2::*method)(A1, A2, A3, A4)) - { - static proxy p; - obj = reinterpret_cast(object); - meth = reinterpret_cast(method); - prxy = &p; - } - - 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 - { - 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 -{ - struct object { }; - - typedef R (object::*ptr_type)(A1, A2, A3, A4, A5); - - void *obj; - 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) 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) const - { - return (R)((reinterpret_cast(obj)) ->* (reinterpret_cast(meth))) - (a1, a2, a3, a4, a5); - } - }; - - proxy_base *prxy; - -public: - template - explicit callback5 (O1 *object, R (O2::*method)(A1, A2, A3, A4, A5)) - { - 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) const - { - return prxy->call (obj, meth, a1, a2, a3, a4, a5); - } - - 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 -{ - struct object { }; - - typedef R (object::*ptr_type)(A1, A2, A3, A4, A5, A6); - - void *obj; - 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) 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) const - { - return (R)((reinterpret_cast(obj)) ->* (reinterpret_cast(meth))) - (a1, a2, a3, a4, a5, a6); - } - }; - - proxy_base *prxy; - -public: - template - explicit callback6 (O1 *object, R (O2::*method)(A1, A2, A3, A4, A5, A6)) - { - 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) 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 - { - 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 -{ - 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); - - /* 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) 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) const - { - return (R)((reinterpret_cast(obj)) ->* (reinterpret_cast(meth))) - (a1, a2, a3, a4, a5, a6, a7); - } - }; - - proxy_base *prxy; - -public: - template - 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); - prxy = &p; - } - - 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 - { - 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; -}; +#define CALLBACK_H_VERSION 4 -template -struct callback_funtype_trait : callback_funtype_trait7 -{ -}; +template +struct callback; -template -struct callback_get_impl<7, signature> -{ - typedef callback_funtype_trait T; - typedef callback7 type; -}; - -template -class callback8 +template +struct callback { - 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) - { - } + typedef R (*ptr_type)(void *self, Args...); + + template + void set (K *object) + { + self = object; + func = thunk; + } + + R call (Args... args) const + { + return func (self, args...); + } + + R operator ()(Args... args) const + { + return call (args...); + } + +private: + + void *self; + ptr_type func; + + template + static R thunk (void *self, Args... args) + { + klass *obj = static_cast(self); + return (obj->*method) (args...); + } }; #endif