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.5 by pcg, Tue Apr 26 00:55:55 2005 UTC vs.
Revision 1.14 by pcg, Thu Aug 7 17:54:26 2008 UTC

1#!/usr/bin/perl 1#!/usr/bin/perl
2 2
3use strict;
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, RUN callback.pl to regenerate it 7// THIS IS A GENERATED FILE: callback.pl is part of the GVPE
6// THIS IS A GENERATED FILE, RUN callback.pl to regenerate it 8// THIS IS A GENERATED FILE: distribution.
7// THIS IS A GENERATED FILE, RUN callback.pl to regenerate it
8// THIS IS A GENERATED FILE, RUN callback.pl to regenerate it
9// THIS IS A GENERATED FILE, RUN callback.pl to regenerate it
10 9
11/* 10/*
12 callback.h -- C++ callback mechanism 11 * callback.h -- C++ callback mechanism
13 Copyright (C) 2003 Marc Lehmann <pcg\@goof.com> 12 * Copyright (C) 2003-2008 Marc Lehmann <pcg\@goof.com>
14 13 *
15 This file is part of GVPE. 14 * This file is part of GVPE.
16 15 *
17 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
18 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
19 the Free Software Foundation; either version 2 of the License, or 18 * Free Software Foundation; either version 3 of the License, or (at your
20 (at your option) any later version. 19 * option) any later version.
21 20 *
22 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
23 but WITHOUT ANY WARRANTY; without even the implied warranty of 22 * WITHOUT ANY WARRANTY; without even the implied warranty of
24 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 23 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
25 GNU General Public License for more details. 24 * Public License for more details.
26 25 *
27 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
28 along with gvpe; if not, write to the Free Software 27 * with this program; if not, see <http://www.gnu.org/licenses/>.
29 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.
30*/ 39*/
31 40
32#ifndef CALLBACK_H__ 41#ifndef CALLBACK_H__
33#define CALLBACK_H__ 42#define CALLBACK_H__
34 43
44#define CALLBACK_H_VERSION 3
45
46template<typename signature>
47struct callback;
48
35EOF 49EOF
36 50
37for my $a (0..7) { 51for my $a (0..10) {
38 my $CLASS = join "", map ", class A$_", 1..$a; 52 my $CLASS = join "", map ", class A$_", 1..$a;
39 my $TYPE = join ", ", map "A$_", 1..$a; 53 my $TYPE = join ", ", map "A$_", 1..$a;
40 my $ARG = join ", ", map "a$_", 1..$a; 54 my $ARG = join ", ", map "a$_", 1..$a;
41 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";
42 my $_ARG = $ARG ? ", $ARG" : ""; 58 my $_ARG = $ARG ? ", $ARG" : "";
59 my $_TYPE = $TYPE ? ", $TYPE" : "";
43 my $_TYPEARG = $TYPEARG ? ", $TYPEARG" : ""; 60 my $_TYPEARG = $TYPEARG ? ", $TYPEARG" : "";
61 my $_TTYPE = $a ? join "", map ", typename T::arg$_\_type", 1..$a : "";
44 62
45 print <<EOF; 63 print <<EOF;
46template<class R$CLASS> 64template<class R$CLASS>
47class callback$a { 65struct callback<R ($TYPE)>
48 struct object { }; 66{
67 typedef R (*ptr_type)(void *self$_TYPE);
49 68
50 void *obj; 69 template<class K, R (K::*method)($TYPE)>
51 R (object::*meth)($TYPE); 70 void set (K *object)
71 {
72 self = object;
73 func = thunk<K, method>;
74 }
52 75
53 /* a proxy is a kind of recipe on how to call a specific class method */
54 struct proxy_base {
55 virtual R call (void *obj, R (object::*meth)($TYPE)$_TYPEARG) = 0;
56 };
57 template<class O1, class O2>
58 struct proxy : proxy_base {
59 virtual R call (void *obj, R (object::*meth)($TYPE)$_TYPEARG)
60 {
61 ((reinterpret_cast<O1 *>(obj)) ->* (reinterpret_cast<R (O2::*)($TYPE)>(meth)))
62 ($ARG);
63 }
64 };
65
66 proxy_base *prxy;
67
68public:
69 template<class O1, class O2>
70 callback$a (O1 *object, R (O2::*method)($TYPE))
71 {
72 static proxy<O1,O2> p;
73 obj = reinterpret_cast<void *>(object);
74 meth = reinterpret_cast<R (object::*)($TYPE)>(method);
75 prxy = &p;
76 }
77
78 R call($TYPEARG) const 76 R call ($TYPEARG) const
79 { 77 {
80 return prxy->call (obj, meth$_ARG); 78 return func (self$_ARG);
81 } 79 }
82 80
83 R operator ()($TYPEARG) const 81 R operator ()($TYPEARG) const
84 { 82 {
85 return call ($ARG); 83 return call ($ARG);
86 } 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 }
87}; 97};
88 98
89EOF 99EOF
90} 100}
91 101
92print <<EOF 102print <<EOF
103
93#endif 104#endif
94EOF 105EOF
95 106

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines