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.12 by pcg, Tue Dec 4 17:17:19 2007 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-2007 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 GVPE is free software; you can redistribute it and/or modify
18 it under the terms of the GNU General Public License as published by 17 it under the terms of the GNU General Public License as published by
30*/ 29*/
31 30
32#ifndef CALLBACK_H__ 31#ifndef CALLBACK_H__
33#define CALLBACK_H__ 32#define CALLBACK_H__
34 33
34#define CALLBACK_H_VERSION 3
35
36template<typename signature>
37struct callback;
38
35EOF 39EOF
36 40
37for my $a (0..7) { 41for my $a (0..10) {
38 my $CLASS = join "", map ", class A$_", 1..$a; 42 my $CLASS = join "", map ", class A$_", 1..$a;
39 my $TYPE = join ", ", map "A$_", 1..$a; 43 my $TYPE = join ", ", map "A$_", 1..$a;
40 my $ARG = join ", ", map "a$_", 1..$a; 44 my $ARG = join ", ", map "a$_", 1..$a;
41 my $TYPEARG = join ", ", map "A$_ a$_", 1..$a; 45 my $TYPEARG = join ", ", map "A$_ a$_", 1..$a;
46 my $TYPEDEFS = join " ", map "typedef A$_ arg$_\_type;", 1..$a;
47 my $TYPEvoid = $TYPE ? $TYPE : "void";
42 my $_ARG = $ARG ? ", $ARG" : ""; 48 my $_ARG = $ARG ? ", $ARG" : "";
49 my $_TYPE = $TYPE ? ", $TYPE" : "";
43 my $_TYPEARG = $TYPEARG ? ", $TYPEARG" : ""; 50 my $_TYPEARG = $TYPEARG ? ", $TYPEARG" : "";
51 my $_TTYPE = $a ? join "", map ", typename T::arg$_\_type", 1..$a : "";
44 52
45 print <<EOF; 53 print <<EOF;
46template<class R$CLASS> 54template<class R$CLASS>
47class callback$a { 55struct callback<R ($TYPE)>
48 struct object { }; 56{
57 typedef R (*ptr_type)(void *self$_TYPE);
49 58
50 void *obj; 59private:
51 R (object::*meth)($TYPE);
52 60
53 /* a proxy is a kind of recipe on how to call a specific class method */ 61 void *self;
54 struct proxy_base { 62 ptr_type func;
55 virtual R call (void *obj, R (object::*meth)($TYPE)$_TYPEARG) = 0; 63
56 }; 64protected:
65
66 template<typename method>
67 struct thunktype;
68
57 template<class O1, class O2> 69 template<class klass>
58 struct proxy : proxy_base { 70 struct thunktype<R (klass::*)>
59 virtual R call (void *obj, R (object::*meth)($TYPE)$_TYPEARG) 71 {
60 { 72 typedef klass K;
61 ((reinterpret_cast<O1 *>(obj)) ->* (reinterpret_cast<R (O2::*)($TYPE)>(meth)))
62 ($ARG);
63 }
64 }; 73 };
65 74
66 proxy_base *prxy; 75 template<class klass, R (klass::*method)($TYPE)>
76 static R thunk (void *self$_TYPEARG)
77 {
78 klass *obj = static_cast<klass *>(self);
79 return (obj->*method) ($ARG);
80 }
67 81
68public: 82public:
69 template<class O1, class O2> 83 template<class K, R (K::*method)($TYPE)>
70 callback$a (O1 *object, R (O2::*method)($TYPE)) 84 void set (K *object)
71 { 85 {
72 static proxy<O1,O2> p; 86 self = object;
73 obj = reinterpret_cast<void *>(object); 87 func = thunk<K, method>;
74 meth = reinterpret_cast<R (object::*)($TYPE)>(method);
75 prxy = &p;
76 } 88 }
77 89
78 R call($TYPEARG) const 90 R call ($TYPEARG) const
79 { 91 {
80 return prxy->call (obj, meth$_ARG); 92 return func (self$_ARG);
81 } 93 }
82 94
83 R operator ()($TYPEARG) const 95 R operator ()($TYPEARG) const
84 { 96 {
85 return call ($ARG); 97 return call ($ARG);
86 } 98 }
87}; 99};
88 100
89EOF 101EOF
90} 102}
91 103
92print <<EOF 104print <<EOF
105
93#endif 106#endif
94EOF 107EOF
95 108

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines