--- gvpe/src/callback.pl 2005/11/29 19:21:09 1.6 +++ gvpe/src/callback.pl 2006/05/31 00:31:47 1.9 @@ -7,7 +7,7 @@ /* callback.h -- C++ callback mechanism - Copyright (C) 2003-2005 Marc Lehmann + Copyright (C) 2003-2006 Marc Lehmann This file is part of GVPE. @@ -29,33 +29,48 @@ #ifndef CALLBACK_H__ #define CALLBACK_H__ +#define CALLBACK_H_VERSION 2 + +template +struct callback_funtype_trait; + +template +struct callback_get_impl; + EOF -for my $a (0..7) { +for my $a (0..10) { my $CLASS = join "", map ", class A$_", 1..$a; my $TYPE = join ", ", map "A$_", 1..$a; my $ARG = join ", ", map "a$_", 1..$a; 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 $_TYPEARG = $TYPEARG ? ", $TYPEARG" : ""; + my $_TTYPE = $a ? join "", map ", typename T::arg$_\_type", 1..$a : ""; print < -class callback$a { +class callback$a +{ struct object { }; + typedef R (object::*ptr_type)($TYPE); + void *obj; R (object::*meth)($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) = 0; + 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) + virtual R call (void *obj, R (object::*meth)($TYPE)$_TYPEARG) const { - ((reinterpret_cast(obj)) ->* (reinterpret_cast(meth))) + return (R)((reinterpret_cast(obj)) ->* (reinterpret_cast(meth))) ($ARG); } }; @@ -64,7 +79,7 @@ public: template - callback$a (O1 *object, R (O2::*method)($TYPE)) + explicit callback$a (O1 *object, R (O2::*method)($TYPE)) { static proxy p; obj = reinterpret_cast(object); @@ -83,10 +98,44 @@ } }; +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