ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/rxvt-unicode/src/callback.h
Revision: 1.8
Committed: Wed May 31 00:32:56 2006 UTC (17 years, 11 months ago) by root
Content type: text/plain
Branch: MAIN
CVS Tags: rel-8_5a, rel-7_9, rel-7_8, rel-8_0, rel-8_1, rel-8_2, rel-8_3, rel-8_4, rel-8_6, rel-8_7
Changes since 1.7: +422 -8 lines
Log Message:
updated callback.h/iom.h from gvpe

File Contents

# User Rev Content
1 root 1.5 // 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.
4 pcg 1.1
5     /*
6     callback.h -- C++ callback mechanism
7 root 1.7 Copyright (C) 2003-2006 Marc Lehmann <pcg@goof.com>
8 pcg 1.1
9 root 1.5 This file is part of GVPE.
10    
11     GVPE is free software; you can redistribute it and/or modify
12 pcg 1.1 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.
15    
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.
20    
21     You should have received a copy of the GNU General Public License
22 root 1.5 along with gvpe; if not, write to the Free Software
23 root 1.4 Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
24 pcg 1.1 */
25    
26 pcg 1.2 #ifndef CALLBACK_H__
27     #define CALLBACK_H__
28 pcg 1.1
29 root 1.8 #define CALLBACK_H_VERSION 2
30    
31     template<class signature>
32     struct callback_funtype_trait;
33    
34     template<int arity, class signature>
35     struct callback_get_impl;
36    
37 pcg 1.1 template<class R>
38 root 1.8 class callback0
39     {
40 pcg 1.1 struct object { };
41    
42 root 1.8 typedef R (object::*ptr_type)();
43    
44 pcg 1.1 void *obj;
45 root 1.5 R (object::*meth)();
46 pcg 1.1
47     /* a proxy is a kind of recipe on how to call a specific class method */
48     struct proxy_base {
49 root 1.7 virtual R call (void *obj, R (object::*meth)()) const = 0;
50 pcg 1.1 };
51     template<class O1, class O2>
52     struct proxy : proxy_base {
53 root 1.7 virtual R call (void *obj, R (object::*meth)()) const
54 pcg 1.1 {
55 root 1.6 return (R)((reinterpret_cast<O1 *>(obj)) ->* (reinterpret_cast<R (O2::*)()>(meth)))
56 pcg 1.1 ();
57     }
58     };
59    
60     proxy_base *prxy;
61    
62     public:
63     template<class O1, class O2>
64 root 1.7 explicit callback0 (O1 *object, R (O2::*method)())
65 pcg 1.1 {
66     static proxy<O1,O2> p;
67 root 1.5 obj = reinterpret_cast<void *>(object);
68     meth = reinterpret_cast<R (object::*)()>(method);
69 pcg 1.1 prxy = &p;
70     }
71    
72 root 1.5 R call() const
73 pcg 1.1 {
74     return prxy->call (obj, meth);
75     }
76    
77 root 1.5 R operator ()() const
78 pcg 1.1 {
79     return call ();
80     }
81     };
82    
83 root 1.8 template<class R>
84     struct callback_funtype_trait0
85     {
86     static const int arity = 0;
87     typedef R type (void);
88     typedef R result_type;
89    
90     };
91    
92     template<class R>
93     struct callback_funtype_trait<R ()> : callback_funtype_trait0<R>
94     {
95     };
96    
97     template<class signature>
98     struct callback_get_impl<0, signature>
99     {
100     typedef callback_funtype_trait<signature> T;
101     typedef callback0<typename T::result_type> type;
102     };
103    
104 pcg 1.1 template<class R, class A1>
105 root 1.8 class callback1
106     {
107 pcg 1.1 struct object { };
108    
109 root 1.8 typedef R (object::*ptr_type)(A1);
110    
111 pcg 1.1 void *obj;
112 root 1.5 R (object::*meth)(A1);
113 pcg 1.1
114     /* a proxy is a kind of recipe on how to call a specific class method */
115     struct proxy_base {
116 root 1.7 virtual R call (void *obj, R (object::*meth)(A1), A1 a1) const = 0;
117 pcg 1.1 };
118     template<class O1, class O2>
119     struct proxy : proxy_base {
120 root 1.7 virtual R call (void *obj, R (object::*meth)(A1), A1 a1) const
121 pcg 1.1 {
122 root 1.6 return (R)((reinterpret_cast<O1 *>(obj)) ->* (reinterpret_cast<R (O2::*)(A1)>(meth)))
123 pcg 1.1 (a1);
124     }
125     };
126    
127     proxy_base *prxy;
128    
129     public:
130     template<class O1, class O2>
131 root 1.7 explicit callback1 (O1 *object, R (O2::*method)(A1))
132 pcg 1.1 {
133     static proxy<O1,O2> p;
134 root 1.5 obj = reinterpret_cast<void *>(object);
135     meth = reinterpret_cast<R (object::*)(A1)>(method);
136 pcg 1.1 prxy = &p;
137     }
138    
139 root 1.5 R call(A1 a1) const
140 pcg 1.1 {
141     return prxy->call (obj, meth, a1);
142     }
143    
144 root 1.5 R operator ()(A1 a1) const
145 pcg 1.1 {
146     return call (a1);
147     }
148     };
149    
150 root 1.8 template<class R, class A1>
151     struct callback_funtype_trait1
152     {
153     static const int arity = 1;
154     typedef R type (A1);
155     typedef R result_type;
156     typedef A1 arg1_type;
157     };
158    
159     template<class R, class A1>
160     struct callback_funtype_trait<R (A1)> : callback_funtype_trait1<R, A1>
161     {
162     };
163    
164     template<class signature>
165     struct callback_get_impl<1, signature>
166     {
167     typedef callback_funtype_trait<signature> T;
168     typedef callback1<typename T::result_type, typename T::arg1_type> type;
169     };
170    
171 pcg 1.1 template<class R, class A1, class A2>
172 root 1.8 class callback2
173     {
174 pcg 1.1 struct object { };
175    
176 root 1.8 typedef R (object::*ptr_type)(A1, A2);
177    
178 pcg 1.1 void *obj;
179 root 1.5 R (object::*meth)(A1, A2);
180 pcg 1.1
181     /* a proxy is a kind of recipe on how to call a specific class method */
182     struct proxy_base {
183 root 1.7 virtual R call (void *obj, R (object::*meth)(A1, A2), A1 a1, A2 a2) const = 0;
184 pcg 1.1 };
185     template<class O1, class O2>
186     struct proxy : proxy_base {
187 root 1.7 virtual R call (void *obj, R (object::*meth)(A1, A2), A1 a1, A2 a2) const
188 pcg 1.1 {
189 root 1.6 return (R)((reinterpret_cast<O1 *>(obj)) ->* (reinterpret_cast<R (O2::*)(A1, A2)>(meth)))
190 pcg 1.1 (a1, a2);
191     }
192     };
193    
194     proxy_base *prxy;
195    
196     public:
197     template<class O1, class O2>
198 root 1.7 explicit callback2 (O1 *object, R (O2::*method)(A1, A2))
199 pcg 1.1 {
200     static proxy<O1,O2> p;
201 root 1.5 obj = reinterpret_cast<void *>(object);
202     meth = reinterpret_cast<R (object::*)(A1, A2)>(method);
203 pcg 1.1 prxy = &p;
204     }
205    
206 root 1.5 R call(A1 a1, A2 a2) const
207 pcg 1.1 {
208     return prxy->call (obj, meth, a1, a2);
209     }
210    
211 root 1.5 R operator ()(A1 a1, A2 a2) const
212 pcg 1.1 {
213     return call (a1, a2);
214     }
215     };
216    
217 root 1.8 template<class R, class A1, class A2>
218     struct callback_funtype_trait2
219     {
220     static const int arity = 2;
221     typedef R type (A1, A2);
222     typedef R result_type;
223     typedef A1 arg1_type; typedef A2 arg2_type;
224     };
225    
226     template<class R, class A1, class A2>
227     struct callback_funtype_trait<R (A1, A2)> : callback_funtype_trait2<R, A1, A2>
228     {
229     };
230    
231     template<class signature>
232     struct callback_get_impl<2, signature>
233     {
234     typedef callback_funtype_trait<signature> T;
235     typedef callback2<typename T::result_type, typename T::arg1_type, typename T::arg2_type> type;
236     };
237    
238 pcg 1.1 template<class R, class A1, class A2, class A3>
239 root 1.8 class callback3
240     {
241 pcg 1.1 struct object { };
242    
243 root 1.8 typedef R (object::*ptr_type)(A1, A2, A3);
244    
245 pcg 1.1 void *obj;
246 root 1.5 R (object::*meth)(A1, A2, A3);
247 pcg 1.1
248     /* a proxy is a kind of recipe on how to call a specific class method */
249     struct proxy_base {
250 root 1.7 virtual R call (void *obj, R (object::*meth)(A1, A2, A3), A1 a1, A2 a2, A3 a3) const = 0;
251 pcg 1.1 };
252     template<class O1, class O2>
253     struct proxy : proxy_base {
254 root 1.7 virtual R call (void *obj, R (object::*meth)(A1, A2, A3), A1 a1, A2 a2, A3 a3) const
255 pcg 1.1 {
256 root 1.6 return (R)((reinterpret_cast<O1 *>(obj)) ->* (reinterpret_cast<R (O2::*)(A1, A2, A3)>(meth)))
257 pcg 1.1 (a1, a2, a3);
258     }
259     };
260    
261     proxy_base *prxy;
262    
263     public:
264     template<class O1, class O2>
265 root 1.7 explicit callback3 (O1 *object, R (O2::*method)(A1, A2, A3))
266 pcg 1.1 {
267     static proxy<O1,O2> p;
268 root 1.5 obj = reinterpret_cast<void *>(object);
269     meth = reinterpret_cast<R (object::*)(A1, A2, A3)>(method);
270 pcg 1.1 prxy = &p;
271     }
272    
273 root 1.5 R call(A1 a1, A2 a2, A3 a3) const
274 pcg 1.1 {
275     return prxy->call (obj, meth, a1, a2, a3);
276     }
277    
278 root 1.5 R operator ()(A1 a1, A2 a2, A3 a3) const
279 pcg 1.1 {
280     return call (a1, a2, a3);
281     }
282     };
283    
284 root 1.8 template<class R, class A1, class A2, class A3>
285     struct callback_funtype_trait3
286     {
287     static const int arity = 3;
288     typedef R type (A1, A2, A3);
289     typedef R result_type;
290     typedef A1 arg1_type; typedef A2 arg2_type; typedef A3 arg3_type;
291     };
292    
293     template<class R, class A1, class A2, class A3>
294     struct callback_funtype_trait<R (A1, A2, A3)> : callback_funtype_trait3<R, A1, A2, A3>
295     {
296     };
297    
298     template<class signature>
299     struct callback_get_impl<3, signature>
300     {
301     typedef callback_funtype_trait<signature> T;
302     typedef callback3<typename T::result_type, typename T::arg1_type, typename T::arg2_type, typename T::arg3_type> type;
303     };
304    
305 pcg 1.1 template<class R, class A1, class A2, class A3, class A4>
306 root 1.8 class callback4
307     {
308 pcg 1.1 struct object { };
309    
310 root 1.8 typedef R (object::*ptr_type)(A1, A2, A3, A4);
311    
312 pcg 1.1 void *obj;
313 root 1.5 R (object::*meth)(A1, A2, A3, A4);
314 pcg 1.1
315     /* a proxy is a kind of recipe on how to call a specific class method */
316     struct proxy_base {
317 root 1.7 virtual R call (void *obj, R (object::*meth)(A1, A2, A3, A4), A1 a1, A2 a2, A3 a3, A4 a4) const = 0;
318 pcg 1.1 };
319     template<class O1, class O2>
320     struct proxy : proxy_base {
321 root 1.7 virtual R call (void *obj, R (object::*meth)(A1, A2, A3, A4), A1 a1, A2 a2, A3 a3, A4 a4) const
322 pcg 1.1 {
323 root 1.6 return (R)((reinterpret_cast<O1 *>(obj)) ->* (reinterpret_cast<R (O2::*)(A1, A2, A3, A4)>(meth)))
324 pcg 1.1 (a1, a2, a3, a4);
325     }
326     };
327    
328     proxy_base *prxy;
329    
330     public:
331     template<class O1, class O2>
332 root 1.7 explicit callback4 (O1 *object, R (O2::*method)(A1, A2, A3, A4))
333 pcg 1.1 {
334     static proxy<O1,O2> p;
335 root 1.5 obj = reinterpret_cast<void *>(object);
336     meth = reinterpret_cast<R (object::*)(A1, A2, A3, A4)>(method);
337 pcg 1.1 prxy = &p;
338     }
339    
340 root 1.5 R call(A1 a1, A2 a2, A3 a3, A4 a4) const
341 pcg 1.1 {
342     return prxy->call (obj, meth, a1, a2, a3, a4);
343     }
344    
345 root 1.5 R operator ()(A1 a1, A2 a2, A3 a3, A4 a4) const
346 pcg 1.1 {
347     return call (a1, a2, a3, a4);
348     }
349     };
350    
351 root 1.8 template<class R, class A1, class A2, class A3, class A4>
352     struct callback_funtype_trait4
353     {
354     static const int arity = 4;
355     typedef R type (A1, A2, A3, A4);
356     typedef R result_type;
357     typedef A1 arg1_type; typedef A2 arg2_type; typedef A3 arg3_type; typedef A4 arg4_type;
358     };
359    
360     template<class R, class A1, class A2, class A3, class A4>
361     struct callback_funtype_trait<R (A1, A2, A3, A4)> : callback_funtype_trait4<R, A1, A2, A3, A4>
362     {
363     };
364    
365     template<class signature>
366     struct callback_get_impl<4, signature>
367     {
368     typedef callback_funtype_trait<signature> T;
369     typedef callback4<typename T::result_type, typename T::arg1_type, typename T::arg2_type, typename T::arg3_type, typename T::arg4_type> type;
370     };
371    
372 pcg 1.1 template<class R, class A1, class A2, class A3, class A4, class A5>
373 root 1.8 class callback5
374     {
375 pcg 1.1 struct object { };
376    
377 root 1.8 typedef R (object::*ptr_type)(A1, A2, A3, A4, A5);
378    
379 pcg 1.1 void *obj;
380 root 1.5 R (object::*meth)(A1, A2, A3, A4, A5);
381 pcg 1.1
382     /* a proxy is a kind of recipe on how to call a specific class method */
383     struct proxy_base {
384 root 1.7 virtual R call (void *obj, R (object::*meth)(A1, A2, A3, A4, A5), A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) const = 0;
385 pcg 1.1 };
386     template<class O1, class O2>
387     struct proxy : proxy_base {
388 root 1.7 virtual R call (void *obj, R (object::*meth)(A1, A2, A3, A4, A5), A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) const
389 pcg 1.1 {
390 root 1.6 return (R)((reinterpret_cast<O1 *>(obj)) ->* (reinterpret_cast<R (O2::*)(A1, A2, A3, A4, A5)>(meth)))
391 pcg 1.1 (a1, a2, a3, a4, a5);
392     }
393     };
394    
395     proxy_base *prxy;
396    
397     public:
398     template<class O1, class O2>
399 root 1.7 explicit callback5 (O1 *object, R (O2::*method)(A1, A2, A3, A4, A5))
400 pcg 1.1 {
401     static proxy<O1,O2> p;
402 root 1.5 obj = reinterpret_cast<void *>(object);
403     meth = reinterpret_cast<R (object::*)(A1, A2, A3, A4, A5)>(method);
404 pcg 1.1 prxy = &p;
405     }
406    
407 root 1.5 R call(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) const
408 pcg 1.1 {
409     return prxy->call (obj, meth, a1, a2, a3, a4, a5);
410     }
411    
412 root 1.5 R operator ()(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) const
413 pcg 1.1 {
414     return call (a1, a2, a3, a4, a5);
415     }
416     };
417    
418 root 1.8 template<class R, class A1, class A2, class A3, class A4, class A5>
419     struct callback_funtype_trait5
420     {
421     static const int arity = 5;
422     typedef R type (A1, A2, A3, A4, A5);
423     typedef R result_type;
424     typedef A1 arg1_type; typedef A2 arg2_type; typedef A3 arg3_type; typedef A4 arg4_type; typedef A5 arg5_type;
425     };
426    
427     template<class R, class A1, class A2, class A3, class A4, class A5>
428     struct callback_funtype_trait<R (A1, A2, A3, A4, A5)> : callback_funtype_trait5<R, A1, A2, A3, A4, A5>
429     {
430     };
431    
432     template<class signature>
433     struct callback_get_impl<5, signature>
434     {
435     typedef callback_funtype_trait<signature> T;
436     typedef callback5<typename T::result_type, typename T::arg1_type, typename T::arg2_type, typename T::arg3_type, typename T::arg4_type, typename T::arg5_type> type;
437     };
438    
439 pcg 1.1 template<class R, class A1, class A2, class A3, class A4, class A5, class A6>
440 root 1.8 class callback6
441     {
442 pcg 1.1 struct object { };
443    
444 root 1.8 typedef R (object::*ptr_type)(A1, A2, A3, A4, A5, A6);
445    
446 pcg 1.1 void *obj;
447 root 1.5 R (object::*meth)(A1, A2, A3, A4, A5, A6);
448 pcg 1.1
449     /* a proxy is a kind of recipe on how to call a specific class method */
450     struct proxy_base {
451 root 1.7 virtual R call (void *obj, R (object::*meth)(A1, A2, A3, A4, A5, A6), A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) const = 0;
452 pcg 1.1 };
453     template<class O1, class O2>
454     struct proxy : proxy_base {
455 root 1.7 virtual R call (void *obj, R (object::*meth)(A1, A2, A3, A4, A5, A6), A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) const
456 pcg 1.1 {
457 root 1.6 return (R)((reinterpret_cast<O1 *>(obj)) ->* (reinterpret_cast<R (O2::*)(A1, A2, A3, A4, A5, A6)>(meth)))
458 pcg 1.1 (a1, a2, a3, a4, a5, a6);
459     }
460     };
461    
462     proxy_base *prxy;
463    
464     public:
465     template<class O1, class O2>
466 root 1.7 explicit callback6 (O1 *object, R (O2::*method)(A1, A2, A3, A4, A5, A6))
467 pcg 1.1 {
468     static proxy<O1,O2> p;
469 root 1.5 obj = reinterpret_cast<void *>(object);
470     meth = reinterpret_cast<R (object::*)(A1, A2, A3, A4, A5, A6)>(method);
471 pcg 1.1 prxy = &p;
472     }
473    
474 root 1.5 R call(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) const
475 pcg 1.1 {
476     return prxy->call (obj, meth, a1, a2, a3, a4, a5, a6);
477     }
478    
479 root 1.5 R operator ()(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) const
480 pcg 1.1 {
481     return call (a1, a2, a3, a4, a5, a6);
482     }
483     };
484    
485 root 1.8 template<class R, class A1, class A2, class A3, class A4, class A5, class A6>
486     struct callback_funtype_trait6
487     {
488     static const int arity = 6;
489     typedef R type (A1, A2, A3, A4, A5, A6);
490     typedef R result_type;
491     typedef A1 arg1_type; typedef A2 arg2_type; typedef A3 arg3_type; typedef A4 arg4_type; typedef A5 arg5_type; typedef A6 arg6_type;
492     };
493    
494     template<class R, class A1, class A2, class A3, class A4, class A5, class A6>
495     struct callback_funtype_trait<R (A1, A2, A3, A4, A5, A6)> : callback_funtype_trait6<R, A1, A2, A3, A4, A5, A6>
496     {
497     };
498    
499     template<class signature>
500     struct callback_get_impl<6, signature>
501     {
502     typedef callback_funtype_trait<signature> T;
503     typedef callback6<typename T::result_type, typename T::arg1_type, typename T::arg2_type, typename T::arg3_type, typename T::arg4_type, typename T::arg5_type, typename T::arg6_type> type;
504     };
505    
506 pcg 1.1 template<class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7>
507 root 1.8 class callback7
508     {
509 pcg 1.1 struct object { };
510    
511 root 1.8 typedef R (object::*ptr_type)(A1, A2, A3, A4, A5, A6, A7);
512    
513 pcg 1.1 void *obj;
514 root 1.5 R (object::*meth)(A1, A2, A3, A4, A5, A6, A7);
515 pcg 1.1
516     /* a proxy is a kind of recipe on how to call a specific class method */
517     struct proxy_base {
518 root 1.7 virtual R call (void *obj, R (object::*meth)(A1, A2, A3, A4, A5, A6, A7), A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) const = 0;
519 pcg 1.1 };
520     template<class O1, class O2>
521     struct proxy : proxy_base {
522 root 1.7 virtual R call (void *obj, R (object::*meth)(A1, A2, A3, A4, A5, A6, A7), A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) const
523 pcg 1.1 {
524 root 1.6 return (R)((reinterpret_cast<O1 *>(obj)) ->* (reinterpret_cast<R (O2::*)(A1, A2, A3, A4, A5, A6, A7)>(meth)))
525 pcg 1.1 (a1, a2, a3, a4, a5, a6, a7);
526     }
527     };
528    
529     proxy_base *prxy;
530    
531     public:
532     template<class O1, class O2>
533 root 1.7 explicit callback7 (O1 *object, R (O2::*method)(A1, A2, A3, A4, A5, A6, A7))
534 pcg 1.1 {
535     static proxy<O1,O2> p;
536 root 1.5 obj = reinterpret_cast<void *>(object);
537     meth = reinterpret_cast<R (object::*)(A1, A2, A3, A4, A5, A6, A7)>(method);
538 pcg 1.1 prxy = &p;
539     }
540    
541 root 1.5 R call(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) const
542 pcg 1.1 {
543     return prxy->call (obj, meth, a1, a2, a3, a4, a5, a6, a7);
544     }
545    
546 root 1.5 R operator ()(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) const
547 pcg 1.1 {
548     return call (a1, a2, a3, a4, a5, a6, a7);
549     }
550     };
551    
552 root 1.8 template<class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7>
553     struct callback_funtype_trait7
554     {
555     static const int arity = 7;
556     typedef R type (A1, A2, A3, A4, A5, A6, A7);
557     typedef R result_type;
558     typedef A1 arg1_type; typedef A2 arg2_type; typedef A3 arg3_type; typedef A4 arg4_type; typedef A5 arg5_type; typedef A6 arg6_type; typedef A7 arg7_type;
559     };
560    
561     template<class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7>
562     struct callback_funtype_trait<R (A1, A2, A3, A4, A5, A6, A7)> : callback_funtype_trait7<R, A1, A2, A3, A4, A5, A6, A7>
563     {
564     };
565    
566     template<class signature>
567     struct callback_get_impl<7, signature>
568     {
569     typedef callback_funtype_trait<signature> T;
570     typedef callback7<typename T::result_type, typename T::arg1_type, typename T::arg2_type, typename T::arg3_type, typename T::arg4_type, typename T::arg5_type, typename T::arg6_type, typename T::arg7_type> type;
571     };
572    
573     template<class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8>
574     class callback8
575     {
576     struct object { };
577    
578     typedef R (object::*ptr_type)(A1, A2, A3, A4, A5, A6, A7, A8);
579    
580     void *obj;
581     R (object::*meth)(A1, A2, A3, A4, A5, A6, A7, A8);
582    
583     /* a proxy is a kind of recipe on how to call a specific class method */
584     struct proxy_base {
585     virtual R call (void *obj, R (object::*meth)(A1, A2, A3, A4, A5, A6, A7, A8), A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8) const = 0;
586     };
587     template<class O1, class O2>
588     struct proxy : proxy_base {
589     virtual R call (void *obj, R (object::*meth)(A1, A2, A3, A4, A5, A6, A7, A8), A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8) const
590     {
591     return (R)((reinterpret_cast<O1 *>(obj)) ->* (reinterpret_cast<R (O2::*)(A1, A2, A3, A4, A5, A6, A7, A8)>(meth)))
592     (a1, a2, a3, a4, a5, a6, a7, a8);
593     }
594     };
595    
596     proxy_base *prxy;
597    
598     public:
599     template<class O1, class O2>
600     explicit callback8 (O1 *object, R (O2::*method)(A1, A2, A3, A4, A5, A6, A7, A8))
601     {
602     static proxy<O1,O2> p;
603     obj = reinterpret_cast<void *>(object);
604     meth = reinterpret_cast<R (object::*)(A1, A2, A3, A4, A5, A6, A7, A8)>(method);
605     prxy = &p;
606     }
607    
608     R call(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8) const
609     {
610     return prxy->call (obj, meth, a1, a2, a3, a4, a5, a6, a7, a8);
611     }
612    
613     R operator ()(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8) const
614     {
615     return call (a1, a2, a3, a4, a5, a6, a7, a8);
616     }
617     };
618    
619     template<class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8>
620     struct callback_funtype_trait8
621     {
622     static const int arity = 8;
623     typedef R type (A1, A2, A3, A4, A5, A6, A7, A8);
624     typedef R result_type;
625     typedef A1 arg1_type; typedef A2 arg2_type; typedef A3 arg3_type; typedef A4 arg4_type; typedef A5 arg5_type; typedef A6 arg6_type; typedef A7 arg7_type; typedef A8 arg8_type;
626     };
627    
628     template<class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8>
629     struct callback_funtype_trait<R (A1, A2, A3, A4, A5, A6, A7, A8)> : callback_funtype_trait8<R, A1, A2, A3, A4, A5, A6, A7, A8>
630     {
631     };
632    
633     template<class signature>
634     struct callback_get_impl<8, signature>
635     {
636     typedef callback_funtype_trait<signature> T;
637     typedef callback8<typename T::result_type, typename T::arg1_type, typename T::arg2_type, typename T::arg3_type, typename T::arg4_type, typename T::arg5_type, typename T::arg6_type, typename T::arg7_type, typename T::arg8_type> type;
638     };
639    
640     template<class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9>
641     class callback9
642     {
643     struct object { };
644    
645     typedef R (object::*ptr_type)(A1, A2, A3, A4, A5, A6, A7, A8, A9);
646    
647     void *obj;
648     R (object::*meth)(A1, A2, A3, A4, A5, A6, A7, A8, A9);
649    
650     /* a proxy is a kind of recipe on how to call a specific class method */
651     struct proxy_base {
652     virtual R call (void *obj, R (object::*meth)(A1, A2, A3, A4, A5, A6, A7, A8, A9), A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9) const = 0;
653     };
654     template<class O1, class O2>
655     struct proxy : proxy_base {
656     virtual R call (void *obj, R (object::*meth)(A1, A2, A3, A4, A5, A6, A7, A8, A9), A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9) const
657     {
658     return (R)((reinterpret_cast<O1 *>(obj)) ->* (reinterpret_cast<R (O2::*)(A1, A2, A3, A4, A5, A6, A7, A8, A9)>(meth)))
659     (a1, a2, a3, a4, a5, a6, a7, a8, a9);
660     }
661     };
662    
663     proxy_base *prxy;
664    
665     public:
666     template<class O1, class O2>
667     explicit callback9 (O1 *object, R (O2::*method)(A1, A2, A3, A4, A5, A6, A7, A8, A9))
668     {
669     static proxy<O1,O2> p;
670     obj = reinterpret_cast<void *>(object);
671     meth = reinterpret_cast<R (object::*)(A1, A2, A3, A4, A5, A6, A7, A8, A9)>(method);
672     prxy = &p;
673     }
674    
675     R call(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9) const
676     {
677     return prxy->call (obj, meth, a1, a2, a3, a4, a5, a6, a7, a8, a9);
678     }
679    
680     R operator ()(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9) const
681     {
682     return call (a1, a2, a3, a4, a5, a6, a7, a8, a9);
683     }
684     };
685    
686     template<class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9>
687     struct callback_funtype_trait9
688     {
689     static const int arity = 9;
690     typedef R type (A1, A2, A3, A4, A5, A6, A7, A8, A9);
691     typedef R result_type;
692     typedef A1 arg1_type; typedef A2 arg2_type; typedef A3 arg3_type; typedef A4 arg4_type; typedef A5 arg5_type; typedef A6 arg6_type; typedef A7 arg7_type; typedef A8 arg8_type; typedef A9 arg9_type;
693     };
694    
695     template<class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9>
696     struct callback_funtype_trait<R (A1, A2, A3, A4, A5, A6, A7, A8, A9)> : callback_funtype_trait9<R, A1, A2, A3, A4, A5, A6, A7, A8, A9>
697     {
698     };
699    
700     template<class signature>
701     struct callback_get_impl<9, signature>
702     {
703     typedef callback_funtype_trait<signature> T;
704     typedef callback9<typename T::result_type, typename T::arg1_type, typename T::arg2_type, typename T::arg3_type, typename T::arg4_type, typename T::arg5_type, typename T::arg6_type, typename T::arg7_type, typename T::arg8_type, typename T::arg9_type> type;
705     };
706    
707     template<class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10>
708     class callback10
709     {
710     struct object { };
711    
712     typedef R (object::*ptr_type)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10);
713    
714     void *obj;
715     R (object::*meth)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10);
716    
717     /* a proxy is a kind of recipe on how to call a specific class method */
718     struct proxy_base {
719     virtual R call (void *obj, R (object::*meth)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10), A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10) const = 0;
720     };
721     template<class O1, class O2>
722     struct proxy : proxy_base {
723     virtual R call (void *obj, R (object::*meth)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10), A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10) const
724     {
725     return (R)((reinterpret_cast<O1 *>(obj)) ->* (reinterpret_cast<R (O2::*)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10)>(meth)))
726     (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10);
727     }
728     };
729    
730     proxy_base *prxy;
731    
732     public:
733     template<class O1, class O2>
734     explicit callback10 (O1 *object, R (O2::*method)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10))
735     {
736     static proxy<O1,O2> p;
737     obj = reinterpret_cast<void *>(object);
738     meth = reinterpret_cast<R (object::*)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10)>(method);
739     prxy = &p;
740     }
741    
742     R call(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10) const
743     {
744     return prxy->call (obj, meth, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10);
745     }
746    
747     R operator ()(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10) const
748     {
749     return call (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10);
750     }
751     };
752    
753     template<class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10>
754     struct callback_funtype_trait10
755     {
756     static const int arity = 10;
757     typedef R type (A1, A2, A3, A4, A5, A6, A7, A8, A9, A10);
758     typedef R result_type;
759     typedef A1 arg1_type; typedef A2 arg2_type; typedef A3 arg3_type; typedef A4 arg4_type; typedef A5 arg5_type; typedef A6 arg6_type; typedef A7 arg7_type; typedef A8 arg8_type; typedef A9 arg9_type; typedef A10 arg10_type;
760     };
761    
762     template<class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10>
763     struct callback_funtype_trait<R (A1, A2, A3, A4, A5, A6, A7, A8, A9, A10)> : callback_funtype_trait10<R, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10>
764     {
765     };
766    
767     template<class signature>
768     struct callback_get_impl<10, signature>
769     {
770     typedef callback_funtype_trait<signature> T;
771     typedef callback10<typename T::result_type, typename T::arg1_type, typename T::arg2_type, typename T::arg3_type, typename T::arg4_type, typename T::arg5_type, typename T::arg6_type, typename T::arg7_type, typename T::arg8_type, typename T::arg9_type, typename T::arg10_type> type;
772     };
773    
774    
775     template<class signature>
776     struct callback : callback_get_impl<callback_funtype_trait<signature>::arity, signature>::type
777     {
778     typedef typename callback_get_impl<callback_funtype_trait<signature>::arity, signature>::type base_type;
779    
780     template<class O, class M>
781     explicit callback (O object, M method)
782     : base_type (object, method)
783     {
784     }
785     };
786    
787 pcg 1.1 #endif