1 // THIS IS A GENERATED FILE: RUN callback.pl to regenerate it
2 // THIS IS A GENERATED FILE: callback.pl is part of the GVPE
3 // THIS IS A GENERATED FILE: distribution.
6 callback.h -- C++ callback mechanism
7 Copyright (C) 2003-2007 Marc Lehmann <pcg@goof.com>
9 This file is part of GVPE.
11 GVPE is free software; you can redistribute it and/or modify
12 it under the terms of the GNU General Public License as published by
13 the Free Software Foundation; either version 2 of the License, or
14 (at your option) any later version.
16 This program is distributed in the hope that it will be useful,
17 but WITHOUT ANY WARRANTY; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 GNU General Public License for more details.
21 You should have received a copy of the GNU General Public License
22 along with gvpe; if not, write to the Free Software
23 Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
29 #define CALLBACK_H_VERSION 3
31 template<typename signature>
37 typedef R (*ptr_type)(void *self);
39 template<class K, R (K::*method)()>
43 func = thunk<K, method>;
61 template<class klass, R (klass::*method)()>
62 static R thunk (void *self)
64 klass *obj = static_cast<klass *>(self);
65 return (obj->*method) ();
69 template<class R, class A1>
70 struct callback<R (A1)>
72 typedef R (*ptr_type)(void *self, A1);
74 template<class K, R (K::*method)(A1)>
78 func = thunk<K, method>;
83 return func (self, a1);
86 R operator ()(A1 a1) const
96 template<class klass, R (klass::*method)(A1)>
97 static R thunk (void *self, A1 a1)
99 klass *obj = static_cast<klass *>(self);
100 return (obj->*method) (a1);
104 template<class R, class A1, class A2>
105 struct callback<R (A1, A2)>
107 typedef R (*ptr_type)(void *self, A1, A2);
109 template<class K, R (K::*method)(A1, A2)>
113 func = thunk<K, method>;
116 R call (A1 a1, A2 a2) const
118 return func (self, a1, a2);
121 R operator ()(A1 a1, A2 a2) const
123 return call (a1, a2);
131 template<class klass, R (klass::*method)(A1, A2)>
132 static R thunk (void *self, A1 a1, A2 a2)
134 klass *obj = static_cast<klass *>(self);
135 return (obj->*method) (a1, a2);
139 template<class R, class A1, class A2, class A3>
140 struct callback<R (A1, A2, A3)>
142 typedef R (*ptr_type)(void *self, A1, A2, A3);
144 template<class K, R (K::*method)(A1, A2, A3)>
148 func = thunk<K, method>;
151 R call (A1 a1, A2 a2, A3 a3) const
153 return func (self, a1, a2, a3);
156 R operator ()(A1 a1, A2 a2, A3 a3) const
158 return call (a1, a2, a3);
166 template<class klass, R (klass::*method)(A1, A2, A3)>
167 static R thunk (void *self, A1 a1, A2 a2, A3 a3)
169 klass *obj = static_cast<klass *>(self);
170 return (obj->*method) (a1, a2, a3);
174 template<class R, class A1, class A2, class A3, class A4>
175 struct callback<R (A1, A2, A3, A4)>
177 typedef R (*ptr_type)(void *self, A1, A2, A3, A4);
179 template<class K, R (K::*method)(A1, A2, A3, A4)>
183 func = thunk<K, method>;
186 R call (A1 a1, A2 a2, A3 a3, A4 a4) const
188 return func (self, a1, a2, a3, a4);
191 R operator ()(A1 a1, A2 a2, A3 a3, A4 a4) const
193 return call (a1, a2, a3, a4);
201 template<class klass, R (klass::*method)(A1, A2, A3, A4)>
202 static R thunk (void *self, A1 a1, A2 a2, A3 a3, A4 a4)
204 klass *obj = static_cast<klass *>(self);
205 return (obj->*method) (a1, a2, a3, a4);
209 template<class R, class A1, class A2, class A3, class A4, class A5>
210 struct callback<R (A1, A2, A3, A4, A5)>
212 typedef R (*ptr_type)(void *self, A1, A2, A3, A4, A5);
214 template<class K, R (K::*method)(A1, A2, A3, A4, A5)>
218 func = thunk<K, method>;
221 R call (A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) const
223 return func (self, a1, a2, a3, a4, a5);
226 R operator ()(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) const
228 return call (a1, a2, a3, a4, a5);
236 template<class klass, R (klass::*method)(A1, A2, A3, A4, A5)>
237 static R thunk (void *self, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5)
239 klass *obj = static_cast<klass *>(self);
240 return (obj->*method) (a1, a2, a3, a4, a5);
244 template<class R, class A1, class A2, class A3, class A4, class A5, class A6>
245 struct callback<R (A1, A2, A3, A4, A5, A6)>
247 typedef R (*ptr_type)(void *self, A1, A2, A3, A4, A5, A6);
249 template<class K, R (K::*method)(A1, A2, A3, A4, A5, A6)>
253 func = thunk<K, method>;
256 R call (A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) const
258 return func (self, a1, a2, a3, a4, a5, a6);
261 R operator ()(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) const
263 return call (a1, a2, a3, a4, a5, a6);
271 template<class klass, R (klass::*method)(A1, A2, A3, A4, A5, A6)>
272 static R thunk (void *self, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6)
274 klass *obj = static_cast<klass *>(self);
275 return (obj->*method) (a1, a2, a3, a4, a5, a6);
279 template<class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7>
280 struct callback<R (A1, A2, A3, A4, A5, A6, A7)>
282 typedef R (*ptr_type)(void *self, A1, A2, A3, A4, A5, A6, A7);
284 template<class K, R (K::*method)(A1, A2, A3, A4, A5, A6, A7)>
288 func = thunk<K, method>;
291 R call (A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) const
293 return func (self, a1, a2, a3, a4, a5, a6, a7);
296 R operator ()(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) const
298 return call (a1, a2, a3, a4, a5, a6, a7);
306 template<class klass, R (klass::*method)(A1, A2, A3, A4, A5, A6, A7)>
307 static R thunk (void *self, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7)
309 klass *obj = static_cast<klass *>(self);
310 return (obj->*method) (a1, a2, a3, a4, a5, a6, a7);
314 template<class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8>
315 struct callback<R (A1, A2, A3, A4, A5, A6, A7, A8)>
317 typedef R (*ptr_type)(void *self, A1, A2, A3, A4, A5, A6, A7, A8);
319 template<class K, R (K::*method)(A1, A2, A3, A4, A5, A6, A7, A8)>
323 func = thunk<K, method>;
326 R call (A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8) const
328 return func (self, a1, a2, a3, a4, a5, a6, a7, a8);
331 R operator ()(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8) const
333 return call (a1, a2, a3, a4, a5, a6, a7, a8);
341 template<class klass, R (klass::*method)(A1, A2, A3, A4, A5, A6, A7, A8)>
342 static R thunk (void *self, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8)
344 klass *obj = static_cast<klass *>(self);
345 return (obj->*method) (a1, a2, a3, a4, a5, a6, a7, a8);
349 template<class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9>
350 struct callback<R (A1, A2, A3, A4, A5, A6, A7, A8, A9)>
352 typedef R (*ptr_type)(void *self, A1, A2, A3, A4, A5, A6, A7, A8, A9);
354 template<class K, R (K::*method)(A1, A2, A3, A4, A5, A6, A7, A8, A9)>
358 func = thunk<K, method>;
361 R call (A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9) const
363 return func (self, a1, a2, a3, a4, a5, a6, a7, a8, a9);
366 R operator ()(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9) const
368 return call (a1, a2, a3, a4, a5, a6, a7, a8, a9);
376 template<class klass, R (klass::*method)(A1, A2, A3, A4, A5, A6, A7, A8, A9)>
377 static R thunk (void *self, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9)
379 klass *obj = static_cast<klass *>(self);
380 return (obj->*method) (a1, a2, a3, a4, a5, a6, a7, a8, a9);
384 template<class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10>
385 struct callback<R (A1, A2, A3, A4, A5, A6, A7, A8, A9, A10)>
387 typedef R (*ptr_type)(void *self, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10);
389 template<class K, R (K::*method)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10)>
393 func = thunk<K, method>;
396 R call (A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10) const
398 return func (self, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10);
401 R operator ()(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10) const
403 return call (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10);
411 template<class klass, R (klass::*method)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10)>
412 static R thunk (void *self, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10)
414 klass *obj = static_cast<klass *>(self);
415 return (obj->*method) (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10);