ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/include/callback.pl
Revision: 1.2
Committed: Sun Nov 18 00:06:52 2018 UTC (5 years, 6 months ago) by root
Content type: text/plain
Branch: MAIN
CVS Tags: HEAD
Changes since 1.1: +0 -0 lines
State: FILE REMOVED
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 root 1.1 #!/usr/bin/perl
2    
3     print <<EOF;
4     // THIS IS A GENERATED FILE: RUN callback.pl to regenerate it
5     // THIS IS A GENERATED FILE: callback.pl is part of the GVPE
6     // THIS IS A GENERATED FILE: distribution.
7    
8     /*
9     callback.h -- C++ callback mechanism
10     Copyright (C) 2003-2006 Marc Lehmann <pcg\@goof.com>
11    
12     This file is part of GVPE.
13    
14     GVPE is free software; you can redistribute it and/or modify
15     it under the terms of the GNU General Public License as published by
16     the Free Software Foundation; either version 2 of the License, or
17     (at your option) any later version.
18    
19     This program is distributed in the hope that it will be useful,
20     but WITHOUT ANY WARRANTY; without even the implied warranty of
21     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22     GNU General Public License for more details.
23    
24     You should have received a copy of the GNU General Public License
25     along with gvpe; if not, write to the Free Software
26     Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
27     */
28    
29     #ifndef CALLBACK_H__
30     #define CALLBACK_H__
31    
32     #define CALLBACK_H_VERSION 2
33    
34     template<class signature>
35     struct callback_funtype_trait;
36    
37     template<int arity, class signature>
38     struct callback_get_impl;
39    
40     EOF
41    
42     for my $a (0..10) {
43     my $CLASS = join "", map ", class A$_", 1..$a;
44     my $TYPE = join ", ", map "A$_", 1..$a;
45     my $ARG = join ", ", map "a$_", 1..$a;
46     my $TYPEARG = join ", ", map "A$_ a$_", 1..$a;
47     my $TYPEDEFS = join " ", map "typedef A$_ arg$_\_type;", 1..$a;
48     my $TYPEvoid = $TYPE ? $TYPE : "void";
49     my $_TYPE = $TYPE ? ", $TYPE" : "";
50     my $_ARG = $ARG ? ", $ARG" : "";
51     my $_TYPEARG = $TYPEARG ? ", $TYPEARG" : "";
52     my $_TTYPE = $a ? join "", map ", typename T::arg$_\_type", 1..$a : "";
53    
54     print <<EOF;
55     template<class R$CLASS>
56     class callback$a
57     {
58     struct object { };
59    
60     typedef R (object::*ptr_type)($TYPE);
61    
62     void *obj;
63     R (object::*meth)($TYPE);
64    
65     /* a proxy is a kind of recipe on how to call a specific class method */
66     struct proxy_base {
67     virtual R call (void *obj, R (object::*meth)($TYPE)$_TYPEARG) const = 0;
68     };
69     template<class O1, class O2>
70     struct proxy : proxy_base {
71     virtual R call (void *obj, R (object::*meth)($TYPE)$_TYPEARG) const
72     {
73     return (R)((reinterpret_cast<O1 *>(obj)) ->* (reinterpret_cast<R (O2::*)($TYPE)>(meth)))
74     ($ARG);
75     }
76     };
77    
78     proxy_base *prxy;
79    
80     public:
81     template<class O1, class O2>
82     explicit callback$a (O1 *object, R (O2::*method)($TYPE))
83     {
84     static proxy<O1,O2> p;
85     obj = reinterpret_cast<void *>(object);
86     meth = reinterpret_cast<R (object::*)($TYPE)>(method);
87     prxy = &p;
88     }
89    
90     R call($TYPEARG) const
91     {
92     return prxy->call (obj, meth$_ARG);
93     }
94    
95     R operator ()($TYPEARG) const
96     {
97     return call ($ARG);
98     }
99     };
100    
101     template<class R$CLASS>
102     struct callback_funtype_trait$a
103     {
104     static const int arity = $a;
105     typedef R type ($TYPEvoid);
106     typedef R result_type;
107     $TYPEDEFS
108     };
109    
110     template<class R$CLASS>
111     struct callback_funtype_trait<R ($TYPE)> : callback_funtype_trait$a<R$_TYPE>
112     {
113     };
114    
115     template<class signature>
116     struct callback_get_impl<$a, signature>
117     {
118     typedef callback_funtype_trait<signature> T;
119     typedef callback$a<typename T::result_type$_TTYPE> type;
120     };
121    
122     EOF
123     }
124    
125     print <<EOF
126    
127     template<class signature>
128     struct callback : callback_get_impl<callback_funtype_trait<signature>::arity, signature>::type
129     {
130     typedef typename callback_get_impl<callback_funtype_trait<signature>::arity, signature>::type base_type;
131    
132     template<class O, class M>
133     explicit callback (O object, M method)
134     : base_type (object, method)
135     {
136     }
137     };
138    
139     #endif
140     EOF
141