--- gvpe/src/callback.pl 2006/05/31 00:31:47 1.9 +++ gvpe/src/callback.pl 2007/12/05 18:19:50 1.13 @@ -1,5 +1,7 @@ #!/usr/bin/perl +use strict; + print < + Copyright (C) 2003-2007 Marc Lehmann This file is part of GVPE. @@ -29,13 +31,10 @@ #ifndef CALLBACK_H__ #define CALLBACK_H__ -#define CALLBACK_H_VERSION 2 - -template -struct callback_funtype_trait; +#define CALLBACK_H_VERSION 3 -template -struct callback_get_impl; +template +struct callback; EOF @@ -46,96 +45,52 @@ my $TYPEARG = join ", ", map "A$_ a$_", 1..$a; my $TYPEDEFS = join " ", map "typedef A$_ arg$_\_type;", 1..$a; my $TYPEvoid = $TYPE ? $TYPE : "void"; - my $_TYPE = $TYPE ? ", $TYPE" : ""; my $_ARG = $ARG ? ", $ARG" : ""; + my $_TYPE = $TYPE ? ", $TYPE" : ""; my $_TYPEARG = $TYPEARG ? ", $TYPEARG" : ""; my $_TTYPE = $a ? join "", map ", typename T::arg$_\_type", 1..$a : ""; print < -class callback$a +struct callback { - struct object { }; - - typedef R (object::*ptr_type)($TYPE); - - void *obj; - R (object::*meth)($TYPE); + typedef R (*ptr_type)(void *self$_TYPE); - /* 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)($TYPE)$_TYPEARG) const = 0; - }; - template - struct proxy : proxy_base { - virtual R call (void *obj, R (object::*meth)($TYPE)$_TYPEARG) const - { - return (R)((reinterpret_cast(obj)) ->* (reinterpret_cast(meth))) - ($ARG); - } - }; - - proxy_base *prxy; - -public: - template - explicit callback$a (O1 *object, R (O2::*method)($TYPE)) - { - static proxy p; - obj = reinterpret_cast(object); - meth = reinterpret_cast(method); - prxy = &p; - } - - R call($TYPEARG) const - { - return prxy->call (obj, meth$_ARG); - } + template + void set (K *object) + { + self = object; + func = thunk; + } + + R call ($TYPEARG) const + { + return func (self$_ARG); + } R operator ()($TYPEARG) const - { - return call ($ARG); - } + { + return call ($ARG); + } + +private: + + void *self; + ptr_type func; + + template + static R thunk (void *self$_TYPEARG) + { + klass *obj = static_cast(self); + return (obj->*method) ($ARG); + } }; -template -struct callback_funtype_trait$a -{ - static const int arity = $a; - typedef R type ($TYPEvoid); - typedef R result_type; - $TYPEDEFS -}; - -template -struct callback_funtype_trait : callback_funtype_trait$a -{ -}; - -template -struct callback_get_impl<$a, signature> -{ - typedef callback_funtype_trait T; - typedef callback$a type; -}; - EOF } print < -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 EOF