summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--pregen/signals.h1208
1 files changed, 1208 insertions, 0 deletions
diff --git a/pregen/signals.h b/pregen/signals.h
new file mode 100644
index 0000000..47ddad4
--- /dev/null
+++ b/pregen/signals.h
@@ -0,0 +1,1208 @@
1/*
2 * Copyright (C) 2007-2011 Xagasoft, All rights reserved.
3 *
4 * This file is part of the libbu++ library and is released under the
5 * terms of the license contained in the file LICENSE.
6 */
7
8#ifndef BU_SIGNALS_H
9#define BU_SIGNALS_H
10
11#include "bu/util.h"
12#include "bu/exceptionbase.h"
13
14namespace Bu
15{
16 subExceptionDecl( SignalException );
17
18#ifndef BU_SIGNAL_PARAM_COUNT_0
19#define BU_SIGNAL_PARAM_COUNT_0
20 //
21 // 0 Parameter(s)
22 //
23 template<typename ret>
24 class _Slot0
25 {
26 public:
27 _Slot0() { }
28 virtual ~_Slot0() { }
29 virtual ret operator()( )=0;
30 virtual _Slot0<ret> *clone() const=0;
31 };
32
33 template<typename cls, typename ret>
34 class __Slot0 : public _Slot0<ret>
35 {
36 public:
37 __Slot0( cls *pCls, ret (cls::*pFnc)( ) ) :
38 pCls( pCls ), pFnc( pFnc ) { }
39 virtual ~__Slot0() { }
40
41 virtual ret operator()( )
42 {
43 return (pCls->*pFnc)( );
44 }
45
46 virtual _Slot0<ret> *clone() const
47 {
48 return new __Slot0<cls, ret>( pCls, pFnc );
49 }
50
51 private:
52 cls *pCls;
53 ret (cls::*pFnc)( );
54 };
55
56 template<typename ret>
57 class __Slot0F : public _Slot0<ret>
58 {
59 public:
60 __Slot0F( ret (*pFnc)( ) ) :
61 pFnc( pFnc ) { }
62 virtual ~__Slot0F() { }
63
64 virtual ret operator()( )
65 {
66 return (*pFnc)( );
67 }
68
69 virtual _Slot0<ret> *clone() const
70 {
71 return new __Slot0F<ret>( pFnc );
72 }
73
74 private:
75 ret (*pFnc)( );
76 };
77
78 template<typename ret>
79 class Signal0
80 {
81 public:
82 Signal0() : pCb( NULL ) { }
83 Signal0( _Slot0<ret> *pCb ) : pCb( pCb ) { }
84 Signal0( const Signal0<ret> &rSrc ) :
85 pCb( (rSrc.pCb)?(rSrc.pCb->clone()):(NULL) ) { }
86 virtual ~Signal0() { delete pCb; pCb = NULL; }
87
88 ret operator()( )
89 {
90 if( !pCb ) throw SignalException("Uninitialized signal called.");
91 return (*pCb)( );
92 }
93
94 bool isSet() const { return pCb != NULL; }
95 operator bool() const { return isSet(); }
96
97 Signal0<ret> &operator=( const Signal0<ret> &rhs )
98 {
99 pCb = rhs.pCb->clone();
100 return *this;
101 }
102
103 private:
104 _Slot0<ret> *pCb;
105 };
106
107 template<typename cls, typename ret>
108 Signal0<ret> slot( cls *pCls, ret (cls::*pFnc)( ) )
109 {
110 if( !pCls || !pFnc ) throw SignalException("NULL pointer in slot().");
111 return Signal0<ret>(
112 new __Slot0<cls, ret>( pCls, pFnc )
113 );
114 }
115
116 template<typename ret>
117 Signal0<ret> slot( ret (*pFnc)( ) )
118 {
119 if( !pFnc ) throw SignalException("NULL pointer in slot().");
120 return Signal0<ret>(
121 new __Slot0F<ret>( pFnc )
122 );
123 }
124#endif // BU_SIGNAL_PARAM_COUNT_0
125
126#ifndef BU_SIGNAL_PARAM_COUNT_1
127#define BU_SIGNAL_PARAM_COUNT_1
128 //
129 // 1 Parameter(s)
130 //
131 template<typename ret, typename p1t>
132 class _Slot1
133 {
134 public:
135 _Slot1() { }
136 virtual ~_Slot1() { }
137 virtual ret operator()( p1t p1 )=0;
138 virtual _Slot1<ret, p1t> *clone() const=0;
139 };
140
141 template<typename cls, typename ret, typename p1t>
142 class __Slot1 : public _Slot1<ret, p1t>
143 {
144 public:
145 __Slot1( cls *pCls, ret (cls::*pFnc)( p1t ) ) :
146 pCls( pCls ), pFnc( pFnc ) { }
147 virtual ~__Slot1() { }
148
149 virtual ret operator()( p1t p1 )
150 {
151 return (pCls->*pFnc)( p1 );
152 }
153
154 virtual _Slot1<ret, p1t> *clone() const
155 {
156 return new __Slot1<cls, ret, p1t>( pCls, pFnc );
157 }
158
159 private:
160 cls *pCls;
161 ret (cls::*pFnc)( p1t );
162 };
163
164 template<typename ret, typename p1t>
165 class __Slot1F : public _Slot1<ret, p1t>
166 {
167 public:
168 __Slot1F( ret (*pFnc)( p1t ) ) :
169 pFnc( pFnc ) { }
170 virtual ~__Slot1F() { }
171
172 virtual ret operator()( p1t p1 )
173 {
174 return (*pFnc)( p1 );
175 }
176
177 virtual _Slot1<ret, p1t> *clone() const
178 {
179 return new __Slot1F<ret, p1t>( pFnc );
180 }
181
182 private:
183 ret (*pFnc)( p1t );
184 };
185
186 template<typename ret, typename p1t>
187 class Signal1
188 {
189 public:
190 Signal1() : pCb( NULL ) { }
191 Signal1( _Slot1<ret, p1t> *pCb ) : pCb( pCb ) { }
192 Signal1( const Signal1<ret, p1t> &rSrc ) :
193 pCb( (rSrc.pCb)?(rSrc.pCb->clone()):(NULL) ) { }
194 virtual ~Signal1() { delete pCb; pCb = NULL; }
195
196 ret operator()( p1t p1 )
197 {
198 if( !pCb ) throw SignalException("Uninitialized signal called.");
199 return (*pCb)( p1 );
200 }
201
202 bool isSet() const { return pCb != NULL; }
203 operator bool() const { return isSet(); }
204
205 Signal1<ret, p1t> &operator=( const Signal1<ret, p1t> &rhs )
206 {
207 pCb = rhs.pCb->clone();
208 return *this;
209 }
210
211 private:
212 _Slot1<ret, p1t> *pCb;
213 };
214
215 template<typename cls, typename ret, typename p1t>
216 Signal1<ret, p1t> slot( cls *pCls, ret (cls::*pFnc)( p1t ) )
217 {
218 if( !pCls || !pFnc ) throw SignalException("NULL pointer in slot().");
219 return Signal1<ret, p1t>(
220 new __Slot1<cls, ret, p1t>( pCls, pFnc )
221 );
222 }
223
224 template<typename ret, typename p1t>
225 Signal1<ret, p1t> slot( ret (*pFnc)( p1t ) )
226 {
227 if( !pFnc ) throw SignalException("NULL pointer in slot().");
228 return Signal1<ret, p1t>(
229 new __Slot1F<ret, p1t>( pFnc )
230 );
231 }
232#endif // BU_SIGNAL_PARAM_COUNT_1
233
234#ifndef BU_SIGNAL_PARAM_COUNT_2
235#define BU_SIGNAL_PARAM_COUNT_2
236 //
237 // 2 Parameter(s)
238 //
239 template<typename ret, typename p1t, typename p2t>
240 class _Slot2
241 {
242 public:
243 _Slot2() { }
244 virtual ~_Slot2() { }
245 virtual ret operator()( p1t p1, p2t p2 )=0;
246 virtual _Slot2<ret, p1t, p2t> *clone() const=0;
247 };
248
249 template<typename cls, typename ret, typename p1t, typename p2t>
250 class __Slot2 : public _Slot2<ret, p1t, p2t>
251 {
252 public:
253 __Slot2( cls *pCls, ret (cls::*pFnc)( p1t, p2t ) ) :
254 pCls( pCls ), pFnc( pFnc ) { }
255 virtual ~__Slot2() { }
256
257 virtual ret operator()( p1t p1, p2t p2 )
258 {
259 return (pCls->*pFnc)( p1, p2 );
260 }
261
262 virtual _Slot2<ret, p1t, p2t> *clone() const
263 {
264 return new __Slot2<cls, ret, p1t, p2t>( pCls, pFnc );
265 }
266
267 private:
268 cls *pCls;
269 ret (cls::*pFnc)( p1t, p2t );
270 };
271
272 template<typename ret, typename p1t, typename p2t>
273 class __Slot2F : public _Slot2<ret, p1t, p2t>
274 {
275 public:
276 __Slot2F( ret (*pFnc)( p1t, p2t ) ) :
277 pFnc( pFnc ) { }
278 virtual ~__Slot2F() { }
279
280 virtual ret operator()( p1t p1, p2t p2 )
281 {
282 return (*pFnc)( p1, p2 );
283 }
284
285 virtual _Slot2<ret, p1t, p2t> *clone() const
286 {
287 return new __Slot2F<ret, p1t, p2t>( pFnc );
288 }
289
290 private:
291 ret (*pFnc)( p1t, p2t );
292 };
293
294 template<typename ret, typename p1t, typename p2t>
295 class Signal2
296 {
297 public:
298 Signal2() : pCb( NULL ) { }
299 Signal2( _Slot2<ret, p1t, p2t> *pCb ) : pCb( pCb ) { }
300 Signal2( const Signal2<ret, p1t, p2t> &rSrc ) :
301 pCb( (rSrc.pCb)?(rSrc.pCb->clone()):(NULL) ) { }
302 virtual ~Signal2() { delete pCb; pCb = NULL; }
303
304 ret operator()( p1t p1, p2t p2 )
305 {
306 if( !pCb ) throw SignalException("Uninitialized signal called.");
307 return (*pCb)( p1, p2 );
308 }
309
310 bool isSet() const { return pCb != NULL; }
311 operator bool() const { return isSet(); }
312
313 Signal2<ret, p1t, p2t> &operator=( const Signal2<ret, p1t, p2t> &rhs )
314 {
315 pCb = rhs.pCb->clone();
316 return *this;
317 }
318
319 private:
320 _Slot2<ret, p1t, p2t> *pCb;
321 };
322
323 template<typename cls, typename ret, typename p1t, typename p2t>
324 Signal2<ret, p1t, p2t> slot( cls *pCls, ret (cls::*pFnc)( p1t, p2t ) )
325 {
326 if( !pCls || !pFnc ) throw SignalException("NULL pointer in slot().");
327 return Signal2<ret, p1t, p2t>(
328 new __Slot2<cls, ret, p1t, p2t>( pCls, pFnc )
329 );
330 }
331
332 template<typename ret, typename p1t, typename p2t>
333 Signal2<ret, p1t, p2t> slot( ret (*pFnc)( p1t, p2t ) )
334 {
335 if( !pFnc ) throw SignalException("NULL pointer in slot().");
336 return Signal2<ret, p1t, p2t>(
337 new __Slot2F<ret, p1t, p2t>( pFnc )
338 );
339 }
340#endif // BU_SIGNAL_PARAM_COUNT_2
341
342#ifndef BU_SIGNAL_PARAM_COUNT_3
343#define BU_SIGNAL_PARAM_COUNT_3
344 //
345 // 3 Parameter(s)
346 //
347 template<typename ret, typename p1t, typename p2t, typename p3t>
348 class _Slot3
349 {
350 public:
351 _Slot3() { }
352 virtual ~_Slot3() { }
353 virtual ret operator()( p1t p1, p2t p2, p3t p3 )=0;
354 virtual _Slot3<ret, p1t, p2t, p3t> *clone() const=0;
355 };
356
357 template<typename cls, typename ret, typename p1t, typename p2t, typename p3t>
358 class __Slot3 : public _Slot3<ret, p1t, p2t, p3t>
359 {
360 public:
361 __Slot3( cls *pCls, ret (cls::*pFnc)( p1t, p2t, p3t ) ) :
362 pCls( pCls ), pFnc( pFnc ) { }
363 virtual ~__Slot3() { }
364
365 virtual ret operator()( p1t p1, p2t p2, p3t p3 )
366 {
367 return (pCls->*pFnc)( p1, p2, p3 );
368 }
369
370 virtual _Slot3<ret, p1t, p2t, p3t> *clone() const
371 {
372 return new __Slot3<cls, ret, p1t, p2t, p3t>( pCls, pFnc );
373 }
374
375 private:
376 cls *pCls;
377 ret (cls::*pFnc)( p1t, p2t, p3t );
378 };
379
380 template<typename ret, typename p1t, typename p2t, typename p3t>
381 class __Slot3F : public _Slot3<ret, p1t, p2t, p3t>
382 {
383 public:
384 __Slot3F( ret (*pFnc)( p1t, p2t, p3t ) ) :
385 pFnc( pFnc ) { }
386 virtual ~__Slot3F() { }
387
388 virtual ret operator()( p1t p1, p2t p2, p3t p3 )
389 {
390 return (*pFnc)( p1, p2, p3 );
391 }
392
393 virtual _Slot3<ret, p1t, p2t, p3t> *clone() const
394 {
395 return new __Slot3F<ret, p1t, p2t, p3t>( pFnc );
396 }
397
398 private:
399 ret (*pFnc)( p1t, p2t, p3t );
400 };
401
402 template<typename ret, typename p1t, typename p2t, typename p3t>
403 class Signal3
404 {
405 public:
406 Signal3() : pCb( NULL ) { }
407 Signal3( _Slot3<ret, p1t, p2t, p3t> *pCb ) : pCb( pCb ) { }
408 Signal3( const Signal3<ret, p1t, p2t, p3t> &rSrc ) :
409 pCb( (rSrc.pCb)?(rSrc.pCb->clone()):(NULL) ) { }
410 virtual ~Signal3() { delete pCb; pCb = NULL; }
411
412 ret operator()( p1t p1, p2t p2, p3t p3 )
413 {
414 if( !pCb ) throw SignalException("Uninitialized signal called.");
415 return (*pCb)( p1, p2, p3 );
416 }
417
418 bool isSet() const { return pCb != NULL; }
419 operator bool() const { return isSet(); }
420
421 Signal3<ret, p1t, p2t, p3t> &operator=( const Signal3<ret, p1t, p2t, p3t> &rhs )
422 {
423 pCb = rhs.pCb->clone();
424 return *this;
425 }
426
427 private:
428 _Slot3<ret, p1t, p2t, p3t> *pCb;
429 };
430
431 template<typename cls, typename ret, typename p1t, typename p2t, typename p3t>
432 Signal3<ret, p1t, p2t, p3t> slot( cls *pCls, ret (cls::*pFnc)( p1t, p2t, p3t ) )
433 {
434 if( !pCls || !pFnc ) throw SignalException("NULL pointer in slot().");
435 return Signal3<ret, p1t, p2t, p3t>(
436 new __Slot3<cls, ret, p1t, p2t, p3t>( pCls, pFnc )
437 );
438 }
439
440 template<typename ret, typename p1t, typename p2t, typename p3t>
441 Signal3<ret, p1t, p2t, p3t> slot( ret (*pFnc)( p1t, p2t, p3t ) )
442 {
443 if( !pFnc ) throw SignalException("NULL pointer in slot().");
444 return Signal3<ret, p1t, p2t, p3t>(
445 new __Slot3F<ret, p1t, p2t, p3t>( pFnc )
446 );
447 }
448#endif // BU_SIGNAL_PARAM_COUNT_3
449
450#ifndef BU_SIGNAL_PARAM_COUNT_4
451#define BU_SIGNAL_PARAM_COUNT_4
452 //
453 // 4 Parameter(s)
454 //
455 template<typename ret, typename p1t, typename p2t, typename p3t, typename p4t>
456 class _Slot4
457 {
458 public:
459 _Slot4() { }
460 virtual ~_Slot4() { }
461 virtual ret operator()( p1t p1, p2t p2, p3t p3, p4t p4 )=0;
462 virtual _Slot4<ret, p1t, p2t, p3t, p4t> *clone() const=0;
463 };
464
465 template<typename cls, typename ret, typename p1t, typename p2t, typename p3t, typename p4t>
466 class __Slot4 : public _Slot4<ret, p1t, p2t, p3t, p4t>
467 {
468 public:
469 __Slot4( cls *pCls, ret (cls::*pFnc)( p1t, p2t, p3t, p4t ) ) :
470 pCls( pCls ), pFnc( pFnc ) { }
471 virtual ~__Slot4() { }
472
473 virtual ret operator()( p1t p1, p2t p2, p3t p3, p4t p4 )
474 {
475 return (pCls->*pFnc)( p1, p2, p3, p4 );
476 }
477
478 virtual _Slot4<ret, p1t, p2t, p3t, p4t> *clone() const
479 {
480 return new __Slot4<cls, ret, p1t, p2t, p3t, p4t>( pCls, pFnc );
481 }
482
483 private:
484 cls *pCls;
485 ret (cls::*pFnc)( p1t, p2t, p3t, p4t );
486 };
487
488 template<typename ret, typename p1t, typename p2t, typename p3t, typename p4t>
489 class __Slot4F : public _Slot4<ret, p1t, p2t, p3t, p4t>
490 {
491 public:
492 __Slot4F( ret (*pFnc)( p1t, p2t, p3t, p4t ) ) :
493 pFnc( pFnc ) { }
494 virtual ~__Slot4F() { }
495
496 virtual ret operator()( p1t p1, p2t p2, p3t p3, p4t p4 )
497 {
498 return (*pFnc)( p1, p2, p3, p4 );
499 }
500
501 virtual _Slot4<ret, p1t, p2t, p3t, p4t> *clone() const
502 {
503 return new __Slot4F<ret, p1t, p2t, p3t, p4t>( pFnc );
504 }
505
506 private:
507 ret (*pFnc)( p1t, p2t, p3t, p4t );
508 };
509
510 template<typename ret, typename p1t, typename p2t, typename p3t, typename p4t>
511 class Signal4
512 {
513 public:
514 Signal4() : pCb( NULL ) { }
515 Signal4( _Slot4<ret, p1t, p2t, p3t, p4t> *pCb ) : pCb( pCb ) { }
516 Signal4( const Signal4<ret, p1t, p2t, p3t, p4t> &rSrc ) :
517 pCb( (rSrc.pCb)?(rSrc.pCb->clone()):(NULL) ) { }
518 virtual ~Signal4() { delete pCb; pCb = NULL; }
519
520 ret operator()( p1t p1, p2t p2, p3t p3, p4t p4 )
521 {
522 if( !pCb ) throw SignalException("Uninitialized signal called.");
523 return (*pCb)( p1, p2, p3, p4 );
524 }
525
526 bool isSet() const { return pCb != NULL; }
527 operator bool() const { return isSet(); }
528
529 Signal4<ret, p1t, p2t, p3t, p4t> &operator=( const Signal4<ret, p1t, p2t, p3t, p4t> &rhs )
530 {
531 pCb = rhs.pCb->clone();
532 return *this;
533 }
534
535 private:
536 _Slot4<ret, p1t, p2t, p3t, p4t> *pCb;
537 };
538
539 template<typename cls, typename ret, typename p1t, typename p2t, typename p3t, typename p4t>
540 Signal4<ret, p1t, p2t, p3t, p4t> slot( cls *pCls, ret (cls::*pFnc)( p1t, p2t, p3t, p4t ) )
541 {
542 if( !pCls || !pFnc ) throw SignalException("NULL pointer in slot().");
543 return Signal4<ret, p1t, p2t, p3t, p4t>(
544 new __Slot4<cls, ret, p1t, p2t, p3t, p4t>( pCls, pFnc )
545 );
546 }
547
548 template<typename ret, typename p1t, typename p2t, typename p3t, typename p4t>
549 Signal4<ret, p1t, p2t, p3t, p4t> slot( ret (*pFnc)( p1t, p2t, p3t, p4t ) )
550 {
551 if( !pFnc ) throw SignalException("NULL pointer in slot().");
552 return Signal4<ret, p1t, p2t, p3t, p4t>(
553 new __Slot4F<ret, p1t, p2t, p3t, p4t>( pFnc )
554 );
555 }
556#endif // BU_SIGNAL_PARAM_COUNT_4
557
558#ifndef BU_SIGNAL_PARAM_COUNT_5
559#define BU_SIGNAL_PARAM_COUNT_5
560 //
561 // 5 Parameter(s)
562 //
563 template<typename ret, typename p1t, typename p2t, typename p3t, typename p4t, typename p5t>
564 class _Slot5
565 {
566 public:
567 _Slot5() { }
568 virtual ~_Slot5() { }
569 virtual ret operator()( p1t p1, p2t p2, p3t p3, p4t p4, p5t p5 )=0;
570 virtual _Slot5<ret, p1t, p2t, p3t, p4t, p5t> *clone() const=0;
571 };
572
573 template<typename cls, typename ret, typename p1t, typename p2t, typename p3t, typename p4t, typename p5t>
574 class __Slot5 : public _Slot5<ret, p1t, p2t, p3t, p4t, p5t>
575 {
576 public:
577 __Slot5( cls *pCls, ret (cls::*pFnc)( p1t, p2t, p3t, p4t, p5t ) ) :
578 pCls( pCls ), pFnc( pFnc ) { }
579 virtual ~__Slot5() { }
580
581 virtual ret operator()( p1t p1, p2t p2, p3t p3, p4t p4, p5t p5 )
582 {
583 return (pCls->*pFnc)( p1, p2, p3, p4, p5 );
584 }
585
586 virtual _Slot5<ret, p1t, p2t, p3t, p4t, p5t> *clone() const
587 {
588 return new __Slot5<cls, ret, p1t, p2t, p3t, p4t, p5t>( pCls, pFnc );
589 }
590
591 private:
592 cls *pCls;
593 ret (cls::*pFnc)( p1t, p2t, p3t, p4t, p5t );
594 };
595
596 template<typename ret, typename p1t, typename p2t, typename p3t, typename p4t, typename p5t>
597 class __Slot5F : public _Slot5<ret, p1t, p2t, p3t, p4t, p5t>
598 {
599 public:
600 __Slot5F( ret (*pFnc)( p1t, p2t, p3t, p4t, p5t ) ) :
601 pFnc( pFnc ) { }
602 virtual ~__Slot5F() { }
603
604 virtual ret operator()( p1t p1, p2t p2, p3t p3, p4t p4, p5t p5 )
605 {
606 return (*pFnc)( p1, p2, p3, p4, p5 );
607 }
608
609 virtual _Slot5<ret, p1t, p2t, p3t, p4t, p5t> *clone() const
610 {
611 return new __Slot5F<ret, p1t, p2t, p3t, p4t, p5t>( pFnc );
612 }
613
614 private:
615 ret (*pFnc)( p1t, p2t, p3t, p4t, p5t );
616 };
617
618 template<typename ret, typename p1t, typename p2t, typename p3t, typename p4t, typename p5t>
619 class Signal5
620 {
621 public:
622 Signal5() : pCb( NULL ) { }
623 Signal5( _Slot5<ret, p1t, p2t, p3t, p4t, p5t> *pCb ) : pCb( pCb ) { }
624 Signal5( const Signal5<ret, p1t, p2t, p3t, p4t, p5t> &rSrc ) :
625 pCb( (rSrc.pCb)?(rSrc.pCb->clone()):(NULL) ) { }
626 virtual ~Signal5() { delete pCb; pCb = NULL; }
627
628 ret operator()( p1t p1, p2t p2, p3t p3, p4t p4, p5t p5 )
629 {
630 if( !pCb ) throw SignalException("Uninitialized signal called.");
631 return (*pCb)( p1, p2, p3, p4, p5 );
632 }
633
634 bool isSet() const { return pCb != NULL; }
635 operator bool() const { return isSet(); }
636
637 Signal5<ret, p1t, p2t, p3t, p4t, p5t> &operator=( const Signal5<ret, p1t, p2t, p3t, p4t, p5t> &rhs )
638 {
639 pCb = rhs.pCb->clone();
640 return *this;
641 }
642
643 private:
644 _Slot5<ret, p1t, p2t, p3t, p4t, p5t> *pCb;
645 };
646
647 template<typename cls, typename ret, typename p1t, typename p2t, typename p3t, typename p4t, typename p5t>
648 Signal5<ret, p1t, p2t, p3t, p4t, p5t> slot( cls *pCls, ret (cls::*pFnc)( p1t, p2t, p3t, p4t, p5t ) )
649 {
650 if( !pCls || !pFnc ) throw SignalException("NULL pointer in slot().");
651 return Signal5<ret, p1t, p2t, p3t, p4t, p5t>(
652 new __Slot5<cls, ret, p1t, p2t, p3t, p4t, p5t>( pCls, pFnc )
653 );
654 }
655
656 template<typename ret, typename p1t, typename p2t, typename p3t, typename p4t, typename p5t>
657 Signal5<ret, p1t, p2t, p3t, p4t, p5t> slot( ret (*pFnc)( p1t, p2t, p3t, p4t, p5t ) )
658 {
659 if( !pFnc ) throw SignalException("NULL pointer in slot().");
660 return Signal5<ret, p1t, p2t, p3t, p4t, p5t>(
661 new __Slot5F<ret, p1t, p2t, p3t, p4t, p5t>( pFnc )
662 );
663 }
664#endif // BU_SIGNAL_PARAM_COUNT_5
665
666#ifndef BU_SIGNAL_PARAM_COUNT_6
667#define BU_SIGNAL_PARAM_COUNT_6
668 //
669 // 6 Parameter(s)
670 //
671 template<typename ret, typename p1t, typename p2t, typename p3t, typename p4t, typename p5t, typename p6t>
672 class _Slot6
673 {
674 public:
675 _Slot6() { }
676 virtual ~_Slot6() { }
677 virtual ret operator()( p1t p1, p2t p2, p3t p3, p4t p4, p5t p5, p6t p6 )=0;
678 virtual _Slot6<ret, p1t, p2t, p3t, p4t, p5t, p6t> *clone() const=0;
679 };
680
681 template<typename cls, typename ret, typename p1t, typename p2t, typename p3t, typename p4t, typename p5t, typename p6t>
682 class __Slot6 : public _Slot6<ret, p1t, p2t, p3t, p4t, p5t, p6t>
683 {
684 public:
685 __Slot6( cls *pCls, ret (cls::*pFnc)( p1t, p2t, p3t, p4t, p5t, p6t ) ) :
686 pCls( pCls ), pFnc( pFnc ) { }
687 virtual ~__Slot6() { }
688
689 virtual ret operator()( p1t p1, p2t p2, p3t p3, p4t p4, p5t p5, p6t p6 )
690 {
691 return (pCls->*pFnc)( p1, p2, p3, p4, p5, p6 );
692 }
693
694 virtual _Slot6<ret, p1t, p2t, p3t, p4t, p5t, p6t> *clone() const
695 {
696 return new __Slot6<cls, ret, p1t, p2t, p3t, p4t, p5t, p6t>( pCls, pFnc );
697 }
698
699 private:
700 cls *pCls;
701 ret (cls::*pFnc)( p1t, p2t, p3t, p4t, p5t, p6t );
702 };
703
704 template<typename ret, typename p1t, typename p2t, typename p3t, typename p4t, typename p5t, typename p6t>
705 class __Slot6F : public _Slot6<ret, p1t, p2t, p3t, p4t, p5t, p6t>
706 {
707 public:
708 __Slot6F( ret (*pFnc)( p1t, p2t, p3t, p4t, p5t, p6t ) ) :
709 pFnc( pFnc ) { }
710 virtual ~__Slot6F() { }
711
712 virtual ret operator()( p1t p1, p2t p2, p3t p3, p4t p4, p5t p5, p6t p6 )
713 {
714 return (*pFnc)( p1, p2, p3, p4, p5, p6 );
715 }
716
717 virtual _Slot6<ret, p1t, p2t, p3t, p4t, p5t, p6t> *clone() const
718 {
719 return new __Slot6F<ret, p1t, p2t, p3t, p4t, p5t, p6t>( pFnc );
720 }
721
722 private:
723 ret (*pFnc)( p1t, p2t, p3t, p4t, p5t, p6t );
724 };
725
726 template<typename ret, typename p1t, typename p2t, typename p3t, typename p4t, typename p5t, typename p6t>
727 class Signal6
728 {
729 public:
730 Signal6() : pCb( NULL ) { }
731 Signal6( _Slot6<ret, p1t, p2t, p3t, p4t, p5t, p6t> *pCb ) : pCb( pCb ) { }
732 Signal6( const Signal6<ret, p1t, p2t, p3t, p4t, p5t, p6t> &rSrc ) :
733 pCb( (rSrc.pCb)?(rSrc.pCb->clone()):(NULL) ) { }
734 virtual ~Signal6() { delete pCb; pCb = NULL; }
735
736 ret operator()( p1t p1, p2t p2, p3t p3, p4t p4, p5t p5, p6t p6 )
737 {
738 if( !pCb ) throw SignalException("Uninitialized signal called.");
739 return (*pCb)( p1, p2, p3, p4, p5, p6 );
740 }
741
742 bool isSet() const { return pCb != NULL; }
743 operator bool() const { return isSet(); }
744
745 Signal6<ret, p1t, p2t, p3t, p4t, p5t, p6t> &operator=( const Signal6<ret, p1t, p2t, p3t, p4t, p5t, p6t> &rhs )
746 {
747 pCb = rhs.pCb->clone();
748 return *this;
749 }
750
751 private:
752 _Slot6<ret, p1t, p2t, p3t, p4t, p5t, p6t> *pCb;
753 };
754
755 template<typename cls, typename ret, typename p1t, typename p2t, typename p3t, typename p4t, typename p5t, typename p6t>
756 Signal6<ret, p1t, p2t, p3t, p4t, p5t, p6t> slot( cls *pCls, ret (cls::*pFnc)( p1t, p2t, p3t, p4t, p5t, p6t ) )
757 {
758 if( !pCls || !pFnc ) throw SignalException("NULL pointer in slot().");
759 return Signal6<ret, p1t, p2t, p3t, p4t, p5t, p6t>(
760 new __Slot6<cls, ret, p1t, p2t, p3t, p4t, p5t, p6t>( pCls, pFnc )
761 );
762 }
763
764 template<typename ret, typename p1t, typename p2t, typename p3t, typename p4t, typename p5t, typename p6t>
765 Signal6<ret, p1t, p2t, p3t, p4t, p5t, p6t> slot( ret (*pFnc)( p1t, p2t, p3t, p4t, p5t, p6t ) )
766 {
767 if( !pFnc ) throw SignalException("NULL pointer in slot().");
768 return Signal6<ret, p1t, p2t, p3t, p4t, p5t, p6t>(
769 new __Slot6F<ret, p1t, p2t, p3t, p4t, p5t, p6t>( pFnc )
770 );
771 }
772#endif // BU_SIGNAL_PARAM_COUNT_6
773
774#ifndef BU_SIGNAL_PARAM_COUNT_7
775#define BU_SIGNAL_PARAM_COUNT_7
776 //
777 // 7 Parameter(s)
778 //
779 template<typename ret, typename p1t, typename p2t, typename p3t, typename p4t, typename p5t, typename p6t, typename p7t>
780 class _Slot7
781 {
782 public:
783 _Slot7() { }
784 virtual ~_Slot7() { }
785 virtual ret operator()( p1t p1, p2t p2, p3t p3, p4t p4, p5t p5, p6t p6, p7t p7 )=0;
786 virtual _Slot7<ret, p1t, p2t, p3t, p4t, p5t, p6t, p7t> *clone() const=0;
787 };
788
789 template<typename cls, typename ret, typename p1t, typename p2t, typename p3t, typename p4t, typename p5t, typename p6t, typename p7t>
790 class __Slot7 : public _Slot7<ret, p1t, p2t, p3t, p4t, p5t, p6t, p7t>
791 {
792 public:
793 __Slot7( cls *pCls, ret (cls::*pFnc)( p1t, p2t, p3t, p4t, p5t, p6t, p7t ) ) :
794 pCls( pCls ), pFnc( pFnc ) { }
795 virtual ~__Slot7() { }
796
797 virtual ret operator()( p1t p1, p2t p2, p3t p3, p4t p4, p5t p5, p6t p6, p7t p7 )
798 {
799 return (pCls->*pFnc)( p1, p2, p3, p4, p5, p6, p7 );
800 }
801
802 virtual _Slot7<ret, p1t, p2t, p3t, p4t, p5t, p6t, p7t> *clone() const
803 {
804 return new __Slot7<cls, ret, p1t, p2t, p3t, p4t, p5t, p6t, p7t>( pCls, pFnc );
805 }
806
807 private:
808 cls *pCls;
809 ret (cls::*pFnc)( p1t, p2t, p3t, p4t, p5t, p6t, p7t );
810 };
811
812 template<typename ret, typename p1t, typename p2t, typename p3t, typename p4t, typename p5t, typename p6t, typename p7t>
813 class __Slot7F : public _Slot7<ret, p1t, p2t, p3t, p4t, p5t, p6t, p7t>
814 {
815 public:
816 __Slot7F( ret (*pFnc)( p1t, p2t, p3t, p4t, p5t, p6t, p7t ) ) :
817 pFnc( pFnc ) { }
818 virtual ~__Slot7F() { }
819
820 virtual ret operator()( p1t p1, p2t p2, p3t p3, p4t p4, p5t p5, p6t p6, p7t p7 )
821 {
822 return (*pFnc)( p1, p2, p3, p4, p5, p6, p7 );
823 }
824
825 virtual _Slot7<ret, p1t, p2t, p3t, p4t, p5t, p6t, p7t> *clone() const
826 {
827 return new __Slot7F<ret, p1t, p2t, p3t, p4t, p5t, p6t, p7t>( pFnc );
828 }
829
830 private:
831 ret (*pFnc)( p1t, p2t, p3t, p4t, p5t, p6t, p7t );
832 };
833
834 template<typename ret, typename p1t, typename p2t, typename p3t, typename p4t, typename p5t, typename p6t, typename p7t>
835 class Signal7
836 {
837 public:
838 Signal7() : pCb( NULL ) { }
839 Signal7( _Slot7<ret, p1t, p2t, p3t, p4t, p5t, p6t, p7t> *pCb ) : pCb( pCb ) { }
840 Signal7( const Signal7<ret, p1t, p2t, p3t, p4t, p5t, p6t, p7t> &rSrc ) :
841 pCb( (rSrc.pCb)?(rSrc.pCb->clone()):(NULL) ) { }
842 virtual ~Signal7() { delete pCb; pCb = NULL; }
843
844 ret operator()( p1t p1, p2t p2, p3t p3, p4t p4, p5t p5, p6t p6, p7t p7 )
845 {
846 if( !pCb ) throw SignalException("Uninitialized signal called.");
847 return (*pCb)( p1, p2, p3, p4, p5, p6, p7 );
848 }
849
850 bool isSet() const { return pCb != NULL; }
851 operator bool() const { return isSet(); }
852
853 Signal7<ret, p1t, p2t, p3t, p4t, p5t, p6t, p7t> &operator=( const Signal7<ret, p1t, p2t, p3t, p4t, p5t, p6t, p7t> &rhs )
854 {
855 pCb = rhs.pCb->clone();
856 return *this;
857 }
858
859 private:
860 _Slot7<ret, p1t, p2t, p3t, p4t, p5t, p6t, p7t> *pCb;
861 };
862
863 template<typename cls, typename ret, typename p1t, typename p2t, typename p3t, typename p4t, typename p5t, typename p6t, typename p7t>
864 Signal7<ret, p1t, p2t, p3t, p4t, p5t, p6t, p7t> slot( cls *pCls, ret (cls::*pFnc)( p1t, p2t, p3t, p4t, p5t, p6t, p7t ) )
865 {
866 if( !pCls || !pFnc ) throw SignalException("NULL pointer in slot().");
867 return Signal7<ret, p1t, p2t, p3t, p4t, p5t, p6t, p7t>(
868 new __Slot7<cls, ret, p1t, p2t, p3t, p4t, p5t, p6t, p7t>( pCls, pFnc )
869 );
870 }
871
872 template<typename ret, typename p1t, typename p2t, typename p3t, typename p4t, typename p5t, typename p6t, typename p7t>
873 Signal7<ret, p1t, p2t, p3t, p4t, p5t, p6t, p7t> slot( ret (*pFnc)( p1t, p2t, p3t, p4t, p5t, p6t, p7t ) )
874 {
875 if( !pFnc ) throw SignalException("NULL pointer in slot().");
876 return Signal7<ret, p1t, p2t, p3t, p4t, p5t, p6t, p7t>(
877 new __Slot7F<ret, p1t, p2t, p3t, p4t, p5t, p6t, p7t>( pFnc )
878 );
879 }
880#endif // BU_SIGNAL_PARAM_COUNT_7
881
882#ifndef BU_SIGNAL_PARAM_COUNT_8
883#define BU_SIGNAL_PARAM_COUNT_8
884 //
885 // 8 Parameter(s)
886 //
887 template<typename ret, typename p1t, typename p2t, typename p3t, typename p4t, typename p5t, typename p6t, typename p7t, typename p8t>
888 class _Slot8
889 {
890 public:
891 _Slot8() { }
892 virtual ~_Slot8() { }
893 virtual ret operator()( p1t p1, p2t p2, p3t p3, p4t p4, p5t p5, p6t p6, p7t p7, p8t p8 )=0;
894 virtual _Slot8<ret, p1t, p2t, p3t, p4t, p5t, p6t, p7t, p8t> *clone() const=0;
895 };
896
897 template<typename cls, typename ret, typename p1t, typename p2t, typename p3t, typename p4t, typename p5t, typename p6t, typename p7t, typename p8t>
898 class __Slot8 : public _Slot8<ret, p1t, p2t, p3t, p4t, p5t, p6t, p7t, p8t>
899 {
900 public:
901 __Slot8( cls *pCls, ret (cls::*pFnc)( p1t, p2t, p3t, p4t, p5t, p6t, p7t, p8t ) ) :
902 pCls( pCls ), pFnc( pFnc ) { }
903 virtual ~__Slot8() { }
904
905 virtual ret operator()( p1t p1, p2t p2, p3t p3, p4t p4, p5t p5, p6t p6, p7t p7, p8t p8 )
906 {
907 return (pCls->*pFnc)( p1, p2, p3, p4, p5, p6, p7, p8 );
908 }
909
910 virtual _Slot8<ret, p1t, p2t, p3t, p4t, p5t, p6t, p7t, p8t> *clone() const
911 {
912 return new __Slot8<cls, ret, p1t, p2t, p3t, p4t, p5t, p6t, p7t, p8t>( pCls, pFnc );
913 }
914
915 private:
916 cls *pCls;
917 ret (cls::*pFnc)( p1t, p2t, p3t, p4t, p5t, p6t, p7t, p8t );
918 };
919
920 template<typename ret, typename p1t, typename p2t, typename p3t, typename p4t, typename p5t, typename p6t, typename p7t, typename p8t>
921 class __Slot8F : public _Slot8<ret, p1t, p2t, p3t, p4t, p5t, p6t, p7t, p8t>
922 {
923 public:
924 __Slot8F( ret (*pFnc)( p1t, p2t, p3t, p4t, p5t, p6t, p7t, p8t ) ) :
925 pFnc( pFnc ) { }
926 virtual ~__Slot8F() { }
927
928 virtual ret operator()( p1t p1, p2t p2, p3t p3, p4t p4, p5t p5, p6t p6, p7t p7, p8t p8 )
929 {
930 return (*pFnc)( p1, p2, p3, p4, p5, p6, p7, p8 );
931 }
932
933 virtual _Slot8<ret, p1t, p2t, p3t, p4t, p5t, p6t, p7t, p8t> *clone() const
934 {
935 return new __Slot8F<ret, p1t, p2t, p3t, p4t, p5t, p6t, p7t, p8t>( pFnc );
936 }
937
938 private:
939 ret (*pFnc)( p1t, p2t, p3t, p4t, p5t, p6t, p7t, p8t );
940 };
941
942 template<typename ret, typename p1t, typename p2t, typename p3t, typename p4t, typename p5t, typename p6t, typename p7t, typename p8t>
943 class Signal8
944 {
945 public:
946 Signal8() : pCb( NULL ) { }
947 Signal8( _Slot8<ret, p1t, p2t, p3t, p4t, p5t, p6t, p7t, p8t> *pCb ) : pCb( pCb ) { }
948 Signal8( const Signal8<ret, p1t, p2t, p3t, p4t, p5t, p6t, p7t, p8t> &rSrc ) :
949 pCb( (rSrc.pCb)?(rSrc.pCb->clone()):(NULL) ) { }
950 virtual ~Signal8() { delete pCb; pCb = NULL; }
951
952 ret operator()( p1t p1, p2t p2, p3t p3, p4t p4, p5t p5, p6t p6, p7t p7, p8t p8 )
953 {
954 if( !pCb ) throw SignalException("Uninitialized signal called.");
955 return (*pCb)( p1, p2, p3, p4, p5, p6, p7, p8 );
956 }
957
958 bool isSet() const { return pCb != NULL; }
959 operator bool() const { return isSet(); }
960
961 Signal8<ret, p1t, p2t, p3t, p4t, p5t, p6t, p7t, p8t> &operator=( const Signal8<ret, p1t, p2t, p3t, p4t, p5t, p6t, p7t, p8t> &rhs )
962 {
963 pCb = rhs.pCb->clone();
964 return *this;
965 }
966
967 private:
968 _Slot8<ret, p1t, p2t, p3t, p4t, p5t, p6t, p7t, p8t> *pCb;
969 };
970
971 template<typename cls, typename ret, typename p1t, typename p2t, typename p3t, typename p4t, typename p5t, typename p6t, typename p7t, typename p8t>
972 Signal8<ret, p1t, p2t, p3t, p4t, p5t, p6t, p7t, p8t> slot( cls *pCls, ret (cls::*pFnc)( p1t, p2t, p3t, p4t, p5t, p6t, p7t, p8t ) )
973 {
974 if( !pCls || !pFnc ) throw SignalException("NULL pointer in slot().");
975 return Signal8<ret, p1t, p2t, p3t, p4t, p5t, p6t, p7t, p8t>(
976 new __Slot8<cls, ret, p1t, p2t, p3t, p4t, p5t, p6t, p7t, p8t>( pCls, pFnc )
977 );
978 }
979
980 template<typename ret, typename p1t, typename p2t, typename p3t, typename p4t, typename p5t, typename p6t, typename p7t, typename p8t>
981 Signal8<ret, p1t, p2t, p3t, p4t, p5t, p6t, p7t, p8t> slot( ret (*pFnc)( p1t, p2t, p3t, p4t, p5t, p6t, p7t, p8t ) )
982 {
983 if( !pFnc ) throw SignalException("NULL pointer in slot().");
984 return Signal8<ret, p1t, p2t, p3t, p4t, p5t, p6t, p7t, p8t>(
985 new __Slot8F<ret, p1t, p2t, p3t, p4t, p5t, p6t, p7t, p8t>( pFnc )
986 );
987 }
988#endif // BU_SIGNAL_PARAM_COUNT_8
989
990#ifndef BU_SIGNAL_PARAM_COUNT_9
991#define BU_SIGNAL_PARAM_COUNT_9
992 //
993 // 9 Parameter(s)
994 //
995 template<typename ret, typename p1t, typename p2t, typename p3t, typename p4t, typename p5t, typename p6t, typename p7t, typename p8t, typename p9t>
996 class _Slot9
997 {
998 public:
999 _Slot9() { }
1000 virtual ~_Slot9() { }
1001 virtual ret operator()( p1t p1, p2t p2, p3t p3, p4t p4, p5t p5, p6t p6, p7t p7, p8t p8, p9t p9 )=0;
1002 virtual _Slot9<ret, p1t, p2t, p3t, p4t, p5t, p6t, p7t, p8t, p9t> *clone() const=0;
1003 };
1004
1005 template<typename cls, typename ret, typename p1t, typename p2t, typename p3t, typename p4t, typename p5t, typename p6t, typename p7t, typename p8t, typename p9t>
1006 class __Slot9 : public _Slot9<ret, p1t, p2t, p3t, p4t, p5t, p6t, p7t, p8t, p9t>
1007 {
1008 public:
1009 __Slot9( cls *pCls, ret (cls::*pFnc)( p1t, p2t, p3t, p4t, p5t, p6t, p7t, p8t, p9t ) ) :
1010 pCls( pCls ), pFnc( pFnc ) { }
1011 virtual ~__Slot9() { }
1012
1013 virtual ret operator()( p1t p1, p2t p2, p3t p3, p4t p4, p5t p5, p6t p6, p7t p7, p8t p8, p9t p9 )
1014 {
1015 return (pCls->*pFnc)( p1, p2, p3, p4, p5, p6, p7, p8, p9 );
1016 }
1017
1018 virtual _Slot9<ret, p1t, p2t, p3t, p4t, p5t, p6t, p7t, p8t, p9t> *clone() const
1019 {
1020 return new __Slot9<cls, ret, p1t, p2t, p3t, p4t, p5t, p6t, p7t, p8t, p9t>( pCls, pFnc );
1021 }
1022
1023 private:
1024 cls *pCls;
1025 ret (cls::*pFnc)( p1t, p2t, p3t, p4t, p5t, p6t, p7t, p8t, p9t );
1026 };
1027
1028 template<typename ret, typename p1t, typename p2t, typename p3t, typename p4t, typename p5t, typename p6t, typename p7t, typename p8t, typename p9t>
1029 class __Slot9F : public _Slot9<ret, p1t, p2t, p3t, p4t, p5t, p6t, p7t, p8t, p9t>
1030 {
1031 public:
1032 __Slot9F( ret (*pFnc)( p1t, p2t, p3t, p4t, p5t, p6t, p7t, p8t, p9t ) ) :
1033 pFnc( pFnc ) { }
1034 virtual ~__Slot9F() { }
1035
1036 virtual ret operator()( p1t p1, p2t p2, p3t p3, p4t p4, p5t p5, p6t p6, p7t p7, p8t p8, p9t p9 )
1037 {
1038 return (*pFnc)( p1, p2, p3, p4, p5, p6, p7, p8, p9 );
1039 }
1040
1041 virtual _Slot9<ret, p1t, p2t, p3t, p4t, p5t, p6t, p7t, p8t, p9t> *clone() const
1042 {
1043 return new __Slot9F<ret, p1t, p2t, p3t, p4t, p5t, p6t, p7t, p8t, p9t>( pFnc );
1044 }
1045
1046 private:
1047 ret (*pFnc)( p1t, p2t, p3t, p4t, p5t, p6t, p7t, p8t, p9t );
1048 };
1049
1050 template<typename ret, typename p1t, typename p2t, typename p3t, typename p4t, typename p5t, typename p6t, typename p7t, typename p8t, typename p9t>
1051 class Signal9
1052 {
1053 public:
1054 Signal9() : pCb( NULL ) { }
1055 Signal9( _Slot9<ret, p1t, p2t, p3t, p4t, p5t, p6t, p7t, p8t, p9t> *pCb ) : pCb( pCb ) { }
1056 Signal9( const Signal9<ret, p1t, p2t, p3t, p4t, p5t, p6t, p7t, p8t, p9t> &rSrc ) :
1057 pCb( (rSrc.pCb)?(rSrc.pCb->clone()):(NULL) ) { }
1058 virtual ~Signal9() { delete pCb; pCb = NULL; }
1059
1060 ret operator()( p1t p1, p2t p2, p3t p3, p4t p4, p5t p5, p6t p6, p7t p7, p8t p8, p9t p9 )
1061 {
1062 if( !pCb ) throw SignalException("Uninitialized signal called.");
1063 return (*pCb)( p1, p2, p3, p4, p5, p6, p7, p8, p9 );
1064 }
1065
1066 bool isSet() const { return pCb != NULL; }
1067 operator bool() const { return isSet(); }
1068
1069 Signal9<ret, p1t, p2t, p3t, p4t, p5t, p6t, p7t, p8t, p9t> &operator=( const Signal9<ret, p1t, p2t, p3t, p4t, p5t, p6t, p7t, p8t, p9t> &rhs )
1070 {
1071 pCb = rhs.pCb->clone();
1072 return *this;
1073 }
1074
1075 private:
1076 _Slot9<ret, p1t, p2t, p3t, p4t, p5t, p6t, p7t, p8t, p9t> *pCb;
1077 };
1078
1079 template<typename cls, typename ret, typename p1t, typename p2t, typename p3t, typename p4t, typename p5t, typename p6t, typename p7t, typename p8t, typename p9t>
1080 Signal9<ret, p1t, p2t, p3t, p4t, p5t, p6t, p7t, p8t, p9t> slot( cls *pCls, ret (cls::*pFnc)( p1t, p2t, p3t, p4t, p5t, p6t, p7t, p8t, p9t ) )
1081 {
1082 if( !pCls || !pFnc ) throw SignalException("NULL pointer in slot().");
1083 return Signal9<ret, p1t, p2t, p3t, p4t, p5t, p6t, p7t, p8t, p9t>(
1084 new __Slot9<cls, ret, p1t, p2t, p3t, p4t, p5t, p6t, p7t, p8t, p9t>( pCls, pFnc )
1085 );
1086 }
1087
1088 template<typename ret, typename p1t, typename p2t, typename p3t, typename p4t, typename p5t, typename p6t, typename p7t, typename p8t, typename p9t>
1089 Signal9<ret, p1t, p2t, p3t, p4t, p5t, p6t, p7t, p8t, p9t> slot( ret (*pFnc)( p1t, p2t, p3t, p4t, p5t, p6t, p7t, p8t, p9t ) )
1090 {
1091 if( !pFnc ) throw SignalException("NULL pointer in slot().");
1092 return Signal9<ret, p1t, p2t, p3t, p4t, p5t, p6t, p7t, p8t, p9t>(
1093 new __Slot9F<ret, p1t, p2t, p3t, p4t, p5t, p6t, p7t, p8t, p9t>( pFnc )
1094 );
1095 }
1096#endif // BU_SIGNAL_PARAM_COUNT_9
1097
1098#ifndef BU_SIGNAL_PARAM_COUNT_10
1099#define BU_SIGNAL_PARAM_COUNT_10
1100 //
1101 // 10 Parameter(s)
1102 //
1103 template<typename ret, typename p1t, typename p2t, typename p3t, typename p4t, typename p5t, typename p6t, typename p7t, typename p8t, typename p9t, typename p10t>
1104 class _Slot10
1105 {
1106 public:
1107 _Slot10() { }
1108 virtual ~_Slot10() { }
1109 virtual ret operator()( p1t p1, p2t p2, p3t p3, p4t p4, p5t p5, p6t p6, p7t p7, p8t p8, p9t p9, p10t p10 )=0;
1110 virtual _Slot10<ret, p1t, p2t, p3t, p4t, p5t, p6t, p7t, p8t, p9t, p10t> *clone() const=0;
1111 };
1112
1113 template<typename cls, typename ret, typename p1t, typename p2t, typename p3t, typename p4t, typename p5t, typename p6t, typename p7t, typename p8t, typename p9t, typename p10t>
1114 class __Slot10 : public _Slot10<ret, p1t, p2t, p3t, p4t, p5t, p6t, p7t, p8t, p9t, p10t>
1115 {
1116 public:
1117 __Slot10( cls *pCls, ret (cls::*pFnc)( p1t, p2t, p3t, p4t, p5t, p6t, p7t, p8t, p9t, p10t ) ) :
1118 pCls( pCls ), pFnc( pFnc ) { }
1119 virtual ~__Slot10() { }
1120
1121 virtual ret operator()( p1t p1, p2t p2, p3t p3, p4t p4, p5t p5, p6t p6, p7t p7, p8t p8, p9t p9, p10t p10 )
1122 {
1123 return (pCls->*pFnc)( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10 );
1124 }
1125
1126 virtual _Slot10<ret, p1t, p2t, p3t, p4t, p5t, p6t, p7t, p8t, p9t, p10t> *clone() const
1127 {
1128 return new __Slot10<cls, ret, p1t, p2t, p3t, p4t, p5t, p6t, p7t, p8t, p9t, p10t>( pCls, pFnc );
1129 }
1130
1131 private:
1132 cls *pCls;
1133 ret (cls::*pFnc)( p1t, p2t, p3t, p4t, p5t, p6t, p7t, p8t, p9t, p10t );
1134 };
1135
1136 template<typename ret, typename p1t, typename p2t, typename p3t, typename p4t, typename p5t, typename p6t, typename p7t, typename p8t, typename p9t, typename p10t>
1137 class __Slot10F : public _Slot10<ret, p1t, p2t, p3t, p4t, p5t, p6t, p7t, p8t, p9t, p10t>
1138 {
1139 public:
1140 __Slot10F( ret (*pFnc)( p1t, p2t, p3t, p4t, p5t, p6t, p7t, p8t, p9t, p10t ) ) :
1141 pFnc( pFnc ) { }
1142 virtual ~__Slot10F() { }
1143
1144 virtual ret operator()( p1t p1, p2t p2, p3t p3, p4t p4, p5t p5, p6t p6, p7t p7, p8t p8, p9t p9, p10t p10 )
1145 {
1146 return (*pFnc)( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10 );
1147 }
1148
1149 virtual _Slot10<ret, p1t, p2t, p3t, p4t, p5t, p6t, p7t, p8t, p9t, p10t> *clone() const
1150 {
1151 return new __Slot10F<ret, p1t, p2t, p3t, p4t, p5t, p6t, p7t, p8t, p9t, p10t>( pFnc );
1152 }
1153
1154 private:
1155 ret (*pFnc)( p1t, p2t, p3t, p4t, p5t, p6t, p7t, p8t, p9t, p10t );
1156 };
1157
1158 template<typename ret, typename p1t, typename p2t, typename p3t, typename p4t, typename p5t, typename p6t, typename p7t, typename p8t, typename p9t, typename p10t>
1159 class Signal10
1160 {
1161 public:
1162 Signal10() : pCb( NULL ) { }
1163 Signal10( _Slot10<ret, p1t, p2t, p3t, p4t, p5t, p6t, p7t, p8t, p9t, p10t> *pCb ) : pCb( pCb ) { }
1164 Signal10( const Signal10<ret, p1t, p2t, p3t, p4t, p5t, p6t, p7t, p8t, p9t, p10t> &rSrc ) :
1165 pCb( (rSrc.pCb)?(rSrc.pCb->clone()):(NULL) ) { }
1166 virtual ~Signal10() { delete pCb; pCb = NULL; }
1167
1168 ret operator()( p1t p1, p2t p2, p3t p3, p4t p4, p5t p5, p6t p6, p7t p7, p8t p8, p9t p9, p10t p10 )
1169 {
1170 if( !pCb ) throw SignalException("Uninitialized signal called.");
1171 return (*pCb)( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10 );
1172 }
1173
1174 bool isSet() const { return pCb != NULL; }
1175 operator bool() const { return isSet(); }
1176
1177 Signal10<ret, p1t, p2t, p3t, p4t, p5t, p6t, p7t, p8t, p9t, p10t> &operator=( const Signal10<ret, p1t, p2t, p3t, p4t, p5t, p6t, p7t, p8t, p9t, p10t> &rhs )
1178 {
1179 pCb = rhs.pCb->clone();
1180 return *this;
1181 }
1182
1183 private:
1184 _Slot10<ret, p1t, p2t, p3t, p4t, p5t, p6t, p7t, p8t, p9t, p10t> *pCb;
1185 };
1186
1187 template<typename cls, typename ret, typename p1t, typename p2t, typename p3t, typename p4t, typename p5t, typename p6t, typename p7t, typename p8t, typename p9t, typename p10t>
1188 Signal10<ret, p1t, p2t, p3t, p4t, p5t, p6t, p7t, p8t, p9t, p10t> slot( cls *pCls, ret (cls::*pFnc)( p1t, p2t, p3t, p4t, p5t, p6t, p7t, p8t, p9t, p10t ) )
1189 {
1190 if( !pCls || !pFnc ) throw SignalException("NULL pointer in slot().");
1191 return Signal10<ret, p1t, p2t, p3t, p4t, p5t, p6t, p7t, p8t, p9t, p10t>(
1192 new __Slot10<cls, ret, p1t, p2t, p3t, p4t, p5t, p6t, p7t, p8t, p9t, p10t>( pCls, pFnc )
1193 );
1194 }
1195
1196 template<typename ret, typename p1t, typename p2t, typename p3t, typename p4t, typename p5t, typename p6t, typename p7t, typename p8t, typename p9t, typename p10t>
1197 Signal10<ret, p1t, p2t, p3t, p4t, p5t, p6t, p7t, p8t, p9t, p10t> slot( ret (*pFnc)( p1t, p2t, p3t, p4t, p5t, p6t, p7t, p8t, p9t, p10t ) )
1198 {
1199 if( !pFnc ) throw SignalException("NULL pointer in slot().");
1200 return Signal10<ret, p1t, p2t, p3t, p4t, p5t, p6t, p7t, p8t, p9t, p10t>(
1201 new __Slot10F<ret, p1t, p2t, p3t, p4t, p5t, p6t, p7t, p8t, p9t, p10t>( pFnc )
1202 );
1203 }
1204#endif // BU_SIGNAL_PARAM_COUNT_10
1205
1206};
1207
1208#endif