ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/gvpe/src/callback.pl
(Generate patch)

Comparing gvpe/src/callback.pl (file contents):
Revision 1.8 by pcg, Sat Jan 14 11:21:12 2006 UTC vs.
Revision 1.14 by pcg, Thu Aug 7 17:54:26 2008 UTC

1#!/usr/bin/perl 1#!/usr/bin/perl
2
3use strict;
2 4
3print <<EOF; 5print <<EOF;
4// THIS IS A GENERATED FILE: RUN callback.pl to regenerate it 6// THIS IS A GENERATED FILE: RUN callback.pl to regenerate it
5// THIS IS A GENERATED FILE: callback.pl is part of the GVPE 7// THIS IS A GENERATED FILE: callback.pl is part of the GVPE
6// THIS IS A GENERATED FILE: distribution. 8// THIS IS A GENERATED FILE: distribution.
7 9
8/* 10/*
9 callback.h -- C++ callback mechanism 11 * callback.h -- C++ callback mechanism
10 Copyright (C) 2003-2006 Marc Lehmann <pcg\@goof.com> 12 * Copyright (C) 2003-2008 Marc Lehmann <pcg\@goof.com>
11 13 *
12 This file is part of GVPE. 14 * This file is part of GVPE.
13 15 *
14 GVPE is free software; you can redistribute it and/or modify 16 * This program is free software; you can redistribute it and/or modify it
15 it under the terms of the GNU General Public License as published by 17 * under the terms of the GNU General Public License as published by the
16 the Free Software Foundation; either version 2 of the License, or 18 * Free Software Foundation; either version 3 of the License, or (at your
17 (at your option) any later version. 19 * option) any later version.
18 20 *
19 This program is distributed in the hope that it will be useful, 21 * This program is distributed in the hope that it will be useful, but
20 but WITHOUT ANY WARRANTY; without even the implied warranty of 22 * WITHOUT ANY WARRANTY; without even the implied warranty of
21 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 23 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
22 GNU General Public License for more details. 24 * Public License for more details.
23 25 *
24 You should have received a copy of the GNU General Public License 26 * You should have received a copy of the GNU General Public License along
25 along with gvpe; if not, write to the Free Software 27 * with this program; if not, see <http://www.gnu.org/licenses/>.
26 Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 28 *
29 * Additional permission under GNU GPL version 3 section 7
30 *
31 * If you modify this Program, or any covered work, by linking or
32 * combining it with the OpenSSL project's OpenSSL library (or a modified
33 * version of that library), containing parts covered by the terms of the
34 * OpenSSL or SSLeay licenses, the licensors of this Program grant you
35 * additional permission to convey the resulting work. Corresponding
36 * Source for a non-source form of such a combination shall include the
37 * source code for the parts of OpenSSL used as well as that of the
38 * covered work.
27*/ 39*/
28 40
29#ifndef CALLBACK_H__ 41#ifndef CALLBACK_H__
30#define CALLBACK_H__ 42#define CALLBACK_H__
31 43
44#define CALLBACK_H_VERSION 3
45
46template<typename signature>
47struct callback;
48
32EOF 49EOF
33 50
34for my $a (0..7) { 51for my $a (0..10) {
35 my $CLASS = join "", map ", class A$_", 1..$a; 52 my $CLASS = join "", map ", class A$_", 1..$a;
36 my $TYPE = join ", ", map "A$_", 1..$a; 53 my $TYPE = join ", ", map "A$_", 1..$a;
37 my $ARG = join ", ", map "a$_", 1..$a; 54 my $ARG = join ", ", map "a$_", 1..$a;
38 my $TYPEARG = join ", ", map "A$_ a$_", 1..$a; 55 my $TYPEARG = join ", ", map "A$_ a$_", 1..$a;
56 my $TYPEDEFS = join " ", map "typedef A$_ arg$_\_type;", 1..$a;
57 my $TYPEvoid = $TYPE ? $TYPE : "void";
39 my $_ARG = $ARG ? ", $ARG" : ""; 58 my $_ARG = $ARG ? ", $ARG" : "";
59 my $_TYPE = $TYPE ? ", $TYPE" : "";
40 my $_TYPEARG = $TYPEARG ? ", $TYPEARG" : ""; 60 my $_TYPEARG = $TYPEARG ? ", $TYPEARG" : "";
61 my $_TTYPE = $a ? join "", map ", typename T::arg$_\_type", 1..$a : "";
41 62
42 print <<EOF; 63 print <<EOF;
43template<class R$CLASS> 64template<class R$CLASS>
44class callback$a { 65struct callback<R ($TYPE)>
45 struct object { }; 66{
67 typedef R (*ptr_type)(void *self$_TYPE);
46 68
47 void *obj; 69 template<class K, R (K::*method)($TYPE)>
48 R (object::*meth)($TYPE); 70 void set (K *object)
71 {
72 self = object;
73 func = thunk<K, method>;
74 }
49 75
50 /* a proxy is a kind of recipe on how to call a specific class method */
51 struct proxy_base {
52 virtual R call (void *obj, R (object::*meth)($TYPE)$_TYPEARG) const = 0;
53 };
54 template<class O1, class O2>
55 struct proxy : proxy_base {
56 virtual R call (void *obj, R (object::*meth)($TYPE)$_TYPEARG) const
57 {
58 return (R)((reinterpret_cast<O1 *>(obj)) ->* (reinterpret_cast<R (O2::*)($TYPE)>(meth)))
59 ($ARG);
60 }
61 };
62
63 proxy_base *prxy;
64
65public:
66 template<class O1, class O2>
67 explicit callback$a (O1 *object, R (O2::*method)($TYPE))
68 {
69 static proxy<O1,O2> p;
70 obj = reinterpret_cast<void *>(object);
71 meth = reinterpret_cast<R (object::*)($TYPE)>(method);
72 prxy = &p;
73 }
74
75 R call($TYPEARG) const 76 R call ($TYPEARG) const
76 { 77 {
77 return prxy->call (obj, meth$_ARG); 78 return func (self$_ARG);
78 } 79 }
79 80
80 R operator ()($TYPEARG) const 81 R operator ()($TYPEARG) const
81 { 82 {
82 return call ($ARG); 83 return call ($ARG);
83 } 84 }
85
86private:
87
88 void *self;
89 ptr_type func;
90
91 template<class klass, R (klass::*method)($TYPE)>
92 static R thunk (void *self$_TYPEARG)
93 {
94 klass *obj = static_cast<klass *>(self);
95 return (obj->*method) ($ARG);
96 }
84}; 97};
85 98
86EOF 99EOF
87} 100}
88 101
89print <<EOF 102print <<EOF
103
90#endif 104#endif
91EOF 105EOF
92 106

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines