blob: 990d2efb76cf173e5898769d1791bfea53be34b4 [file] [log] [blame]
henrike@webrtc.orgf7795df2014-05-13 18:00:26 +00001// sigslot.h: Signal/Slot classes
2//
3// Written by Sarah Thompson (sarah@telergy.com) 2002.
4//
5// License: Public domain. You are free to use this code however you like, with the proviso that
6// the author takes on no responsibility or liability for any use.
7//
8// QUICK DOCUMENTATION
9//
10// (see also the full documentation at http://sigslot.sourceforge.net/)
11//
12// #define switches
13// SIGSLOT_PURE_ISO - Define this to force ISO C++ compliance. This also disables
14// all of the thread safety support on platforms where it is
15// available.
16//
17// SIGSLOT_USE_POSIX_THREADS - Force use of Posix threads when using a C++ compiler other than
18// gcc on a platform that supports Posix threads. (When using gcc,
19// this is the default - use SIGSLOT_PURE_ISO to disable this if
20// necessary)
21//
22// SIGSLOT_DEFAULT_MT_POLICY - Where thread support is enabled, this defaults to multi_threaded_global.
23// Otherwise, the default is single_threaded. #define this yourself to
24// override the default. In pure ISO mode, anything other than
25// single_threaded will cause a compiler error.
26//
27// PLATFORM NOTES
28//
29// Win32 - On Win32, the WEBRTC_WIN symbol must be #defined. Most mainstream
30// compilers do this by default, but you may need to define it
31// yourself if your build environment is less standard. This causes
32// the Win32 thread support to be compiled in and used automatically.
33//
34// Unix/Linux/BSD, etc. - If you're using gcc, it is assumed that you have Posix threads
35// available, so they are used automatically. You can override this
36// (as under Windows) with the SIGSLOT_PURE_ISO switch. If you're using
37// something other than gcc but still want to use Posix threads, you
38// need to #define SIGSLOT_USE_POSIX_THREADS.
39//
40// ISO C++ - If none of the supported platforms are detected, or if
41// SIGSLOT_PURE_ISO is defined, all multithreading support is turned off,
42// along with any code that might cause a pure ISO C++ environment to
43// complain. Before you ask, gcc -ansi -pedantic won't compile this
44// library, but gcc -ansi is fine. Pedantic mode seems to throw a lot of
45// errors that aren't really there. If you feel like investigating this,
46// please contact the author.
47//
48//
49// THREADING MODES
50//
51// single_threaded - Your program is assumed to be single threaded from the point of view
52// of signal/slot usage (i.e. all objects using signals and slots are
53// created and destroyed from a single thread). Behaviour if objects are
54// destroyed concurrently is undefined (i.e. you'll get the occasional
55// segmentation fault/memory exception).
56//
57// multi_threaded_global - Your program is assumed to be multi threaded. Objects using signals and
58// slots can be safely created and destroyed from any thread, even when
59// connections exist. In multi_threaded_global mode, this is achieved by a
60// single global mutex (actually a critical section on Windows because they
61// are faster). This option uses less OS resources, but results in more
62// opportunities for contention, possibly resulting in more context switches
63// than are strictly necessary.
64//
65// multi_threaded_local - Behaviour in this mode is essentially the same as multi_threaded_global,
66// except that each signal, and each object that inherits has_slots, all
67// have their own mutex/critical section. In practice, this means that
68// mutex collisions (and hence context switches) only happen if they are
69// absolutely essential. However, on some platforms, creating a lot of
70// mutexes can slow down the whole OS, so use this option with care.
71//
72// USING THE LIBRARY
73//
74// See the full documentation at http://sigslot.sourceforge.net/
75//
76//
77// Libjingle specific:
78// This file has been modified such that has_slots and signalx do not have to be
79// using the same threading requirements. E.g. it is possible to connect a
80// has_slots<single_threaded> and signal0<multi_threaded_local> or
81// has_slots<multi_threaded_local> and signal0<single_threaded>.
82// If has_slots is single threaded the user must ensure that it is not trying
83// to connect or disconnect to signalx concurrently or data race may occur.
84// If signalx is single threaded the user must ensure that disconnect, connect
85// or signal is not happening concurrently or data race may occur.
86
87#ifndef WEBRTC_BASE_SIGSLOT_H__
88#define WEBRTC_BASE_SIGSLOT_H__
89
90#include <list>
91#include <set>
92#include <stdlib.h>
93
94// On our copy of sigslot.h, we set single threading as default.
95#define SIGSLOT_DEFAULT_MT_POLICY single_threaded
96
97#if defined(SIGSLOT_PURE_ISO) || (!defined(WEBRTC_WIN) && !defined(__GNUG__) && !defined(SIGSLOT_USE_POSIX_THREADS))
98# define _SIGSLOT_SINGLE_THREADED
99#elif defined(WEBRTC_WIN)
100# define _SIGSLOT_HAS_WIN32_THREADS
101# if !defined(WIN32_LEAN_AND_MEAN)
102# define WIN32_LEAN_AND_MEAN
103# endif
104# include "webrtc/base/win32.h"
105#elif defined(__GNUG__) || defined(SIGSLOT_USE_POSIX_THREADS)
106# define _SIGSLOT_HAS_POSIX_THREADS
107# include <pthread.h>
108#else
109# define _SIGSLOT_SINGLE_THREADED
110#endif
111
112#ifndef SIGSLOT_DEFAULT_MT_POLICY
113# ifdef _SIGSLOT_SINGLE_THREADED
114# define SIGSLOT_DEFAULT_MT_POLICY single_threaded
115# else
116# define SIGSLOT_DEFAULT_MT_POLICY multi_threaded_local
117# endif
118#endif
119
120// TODO: change this namespace to rtc?
121namespace sigslot {
122
123 class single_threaded
124 {
125 public:
126 single_threaded()
127 {
128 ;
129 }
130
131 virtual ~single_threaded()
132 {
133 ;
134 }
135
136 virtual void lock()
137 {
138 ;
139 }
140
141 virtual void unlock()
142 {
143 ;
144 }
145 };
146
147#ifdef _SIGSLOT_HAS_WIN32_THREADS
148 // The multi threading policies only get compiled in if they are enabled.
149 class multi_threaded_global
150 {
151 public:
152 multi_threaded_global()
153 {
154 static bool isinitialised = false;
155
156 if(!isinitialised)
157 {
158 InitializeCriticalSection(get_critsec());
159 isinitialised = true;
160 }
161 }
162
163 multi_threaded_global(const multi_threaded_global&)
164 {
165 ;
166 }
167
168 virtual ~multi_threaded_global()
169 {
170 ;
171 }
172
173 virtual void lock()
174 {
175 EnterCriticalSection(get_critsec());
176 }
177
178 virtual void unlock()
179 {
180 LeaveCriticalSection(get_critsec());
181 }
182
183 private:
184 CRITICAL_SECTION* get_critsec()
185 {
186 static CRITICAL_SECTION g_critsec;
187 return &g_critsec;
188 }
189 };
190
191 class multi_threaded_local
192 {
193 public:
194 multi_threaded_local()
195 {
196 InitializeCriticalSection(&m_critsec);
197 }
198
199 multi_threaded_local(const multi_threaded_local&)
200 {
201 InitializeCriticalSection(&m_critsec);
202 }
203
204 virtual ~multi_threaded_local()
205 {
206 DeleteCriticalSection(&m_critsec);
207 }
208
209 virtual void lock()
210 {
211 EnterCriticalSection(&m_critsec);
212 }
213
214 virtual void unlock()
215 {
216 LeaveCriticalSection(&m_critsec);
217 }
218
219 private:
220 CRITICAL_SECTION m_critsec;
221 };
222#endif // _SIGSLOT_HAS_WIN32_THREADS
223
224#ifdef _SIGSLOT_HAS_POSIX_THREADS
225 // The multi threading policies only get compiled in if they are enabled.
226 class multi_threaded_global
227 {
228 public:
229 multi_threaded_global()
230 {
231 pthread_mutex_init(get_mutex(), NULL);
232 }
233
234 multi_threaded_global(const multi_threaded_global&)
235 {
236 ;
237 }
238
239 virtual ~multi_threaded_global()
240 {
241 ;
242 }
243
244 virtual void lock()
245 {
246 pthread_mutex_lock(get_mutex());
247 }
248
249 virtual void unlock()
250 {
251 pthread_mutex_unlock(get_mutex());
252 }
253
254 private:
255 pthread_mutex_t* get_mutex()
256 {
257 static pthread_mutex_t g_mutex;
258 return &g_mutex;
259 }
260 };
261
262 class multi_threaded_local
263 {
264 public:
265 multi_threaded_local()
266 {
267 pthread_mutex_init(&m_mutex, NULL);
268 }
269
270 multi_threaded_local(const multi_threaded_local&)
271 {
272 pthread_mutex_init(&m_mutex, NULL);
273 }
274
275 virtual ~multi_threaded_local()
276 {
277 pthread_mutex_destroy(&m_mutex);
278 }
279
280 virtual void lock()
281 {
282 pthread_mutex_lock(&m_mutex);
283 }
284
285 virtual void unlock()
286 {
287 pthread_mutex_unlock(&m_mutex);
288 }
289
290 private:
291 pthread_mutex_t m_mutex;
292 };
293#endif // _SIGSLOT_HAS_POSIX_THREADS
294
295 template<class mt_policy>
296 class lock_block
297 {
298 public:
299 mt_policy *m_mutex;
300
301 lock_block(mt_policy *mtx)
302 : m_mutex(mtx)
303 {
304 m_mutex->lock();
305 }
306
307 ~lock_block()
308 {
309 m_mutex->unlock();
310 }
311 };
312
313 class has_slots_interface;
314
315 template<class mt_policy>
316 class _connection_base0
317 {
318 public:
319 virtual ~_connection_base0() {}
320 virtual has_slots_interface* getdest() const = 0;
321 virtual void emit() = 0;
322 virtual _connection_base0* clone() = 0;
323 virtual _connection_base0* duplicate(has_slots_interface* pnewdest) = 0;
324 };
325
326 template<class arg1_type, class mt_policy>
327 class _connection_base1
328 {
329 public:
330 virtual ~_connection_base1() {}
331 virtual has_slots_interface* getdest() const = 0;
332 virtual void emit(arg1_type) = 0;
333 virtual _connection_base1<arg1_type, mt_policy>* clone() = 0;
334 virtual _connection_base1<arg1_type, mt_policy>* duplicate(has_slots_interface* pnewdest) = 0;
335 };
336
337 template<class arg1_type, class arg2_type, class mt_policy>
338 class _connection_base2
339 {
340 public:
341 virtual ~_connection_base2() {}
342 virtual has_slots_interface* getdest() const = 0;
343 virtual void emit(arg1_type, arg2_type) = 0;
344 virtual _connection_base2<arg1_type, arg2_type, mt_policy>* clone() = 0;
345 virtual _connection_base2<arg1_type, arg2_type, mt_policy>* duplicate(has_slots_interface* pnewdest) = 0;
346 };
347
348 template<class arg1_type, class arg2_type, class arg3_type, class mt_policy>
349 class _connection_base3
350 {
351 public:
352 virtual ~_connection_base3() {}
353 virtual has_slots_interface* getdest() const = 0;
354 virtual void emit(arg1_type, arg2_type, arg3_type) = 0;
355 virtual _connection_base3<arg1_type, arg2_type, arg3_type, mt_policy>* clone() = 0;
356 virtual _connection_base3<arg1_type, arg2_type, arg3_type, mt_policy>* duplicate(has_slots_interface* pnewdest) = 0;
357 };
358
359 template<class arg1_type, class arg2_type, class arg3_type, class arg4_type, class mt_policy>
360 class _connection_base4
361 {
362 public:
363 virtual ~_connection_base4() {}
364 virtual has_slots_interface* getdest() const = 0;
365 virtual void emit(arg1_type, arg2_type, arg3_type, arg4_type) = 0;
366 virtual _connection_base4<arg1_type, arg2_type, arg3_type, arg4_type, mt_policy>* clone() = 0;
367 virtual _connection_base4<arg1_type, arg2_type, arg3_type, arg4_type, mt_policy>* duplicate(has_slots_interface* pnewdest) = 0;
368 };
369
370 template<class arg1_type, class arg2_type, class arg3_type, class arg4_type,
371 class arg5_type, class mt_policy>
372 class _connection_base5
373 {
374 public:
375 virtual ~_connection_base5() {}
376 virtual has_slots_interface* getdest() const = 0;
377 virtual void emit(arg1_type, arg2_type, arg3_type, arg4_type,
378 arg5_type) = 0;
379 virtual _connection_base5<arg1_type, arg2_type, arg3_type, arg4_type,
380 arg5_type, mt_policy>* clone() = 0;
381 virtual _connection_base5<arg1_type, arg2_type, arg3_type, arg4_type,
382 arg5_type, mt_policy>* duplicate(has_slots_interface* pnewdest) = 0;
383 };
384
385 template<class arg1_type, class arg2_type, class arg3_type, class arg4_type,
386 class arg5_type, class arg6_type, class mt_policy>
387 class _connection_base6
388 {
389 public:
390 virtual ~_connection_base6() {}
391 virtual has_slots_interface* getdest() const = 0;
392 virtual void emit(arg1_type, arg2_type, arg3_type, arg4_type, arg5_type,
393 arg6_type) = 0;
394 virtual _connection_base6<arg1_type, arg2_type, arg3_type, arg4_type,
395 arg5_type, arg6_type, mt_policy>* clone() = 0;
396 virtual _connection_base6<arg1_type, arg2_type, arg3_type, arg4_type,
397 arg5_type, arg6_type, mt_policy>* duplicate(has_slots_interface* pnewdest) = 0;
398 };
399
400 template<class arg1_type, class arg2_type, class arg3_type, class arg4_type,
401 class arg5_type, class arg6_type, class arg7_type, class mt_policy>
402 class _connection_base7
403 {
404 public:
405 virtual ~_connection_base7() {}
406 virtual has_slots_interface* getdest() const = 0;
407 virtual void emit(arg1_type, arg2_type, arg3_type, arg4_type, arg5_type,
408 arg6_type, arg7_type) = 0;
409 virtual _connection_base7<arg1_type, arg2_type, arg3_type, arg4_type,
410 arg5_type, arg6_type, arg7_type, mt_policy>* clone() = 0;
411 virtual _connection_base7<arg1_type, arg2_type, arg3_type, arg4_type,
412 arg5_type, arg6_type, arg7_type, mt_policy>* duplicate(has_slots_interface* pnewdest) = 0;
413 };
414
415 template<class arg1_type, class arg2_type, class arg3_type, class arg4_type,
416 class arg5_type, class arg6_type, class arg7_type, class arg8_type, class mt_policy>
417 class _connection_base8
418 {
419 public:
420 virtual ~_connection_base8() {}
421 virtual has_slots_interface* getdest() const = 0;
422 virtual void emit(arg1_type, arg2_type, arg3_type, arg4_type, arg5_type,
423 arg6_type, arg7_type, arg8_type) = 0;
424 virtual _connection_base8<arg1_type, arg2_type, arg3_type, arg4_type,
425 arg5_type, arg6_type, arg7_type, arg8_type, mt_policy>* clone() = 0;
426 virtual _connection_base8<arg1_type, arg2_type, arg3_type, arg4_type,
427 arg5_type, arg6_type, arg7_type, arg8_type, mt_policy>* duplicate(has_slots_interface* pnewdest) = 0;
428 };
429
430 class _signal_base_interface
431 {
432 public:
433 virtual void slot_disconnect(has_slots_interface* pslot) = 0;
434 virtual void slot_duplicate(const has_slots_interface* poldslot, has_slots_interface* pnewslot) = 0;
435 };
436
437 template<class mt_policy>
438 class _signal_base : public _signal_base_interface, public mt_policy
439 {
440 };
441
442 class has_slots_interface
443 {
444 public:
445 has_slots_interface()
446 {
447 ;
448 }
449
450 virtual void signal_connect(_signal_base_interface* sender) = 0;
451
452 virtual void signal_disconnect(_signal_base_interface* sender) = 0;
453
454 virtual ~has_slots_interface()
455 {
456 }
457
458 virtual void disconnect_all() = 0;
459 };
460
461 template<class mt_policy = SIGSLOT_DEFAULT_MT_POLICY>
462 class has_slots : public has_slots_interface, public mt_policy
463 {
464 private:
465 typedef std::set<_signal_base_interface*> sender_set;
466 typedef sender_set::const_iterator const_iterator;
467
468 public:
469 has_slots()
470 {
471 ;
472 }
473
474 has_slots(const has_slots& hs)
475 {
476 lock_block<mt_policy> lock(this);
477 const_iterator it = hs.m_senders.begin();
478 const_iterator itEnd = hs.m_senders.end();
479
480 while(it != itEnd)
481 {
482 (*it)->slot_duplicate(&hs, this);
483 m_senders.insert(*it);
484 ++it;
485 }
486 }
487
488 void signal_connect(_signal_base_interface* sender)
489 {
490 lock_block<mt_policy> lock(this);
491 m_senders.insert(sender);
492 }
493
494 void signal_disconnect(_signal_base_interface* sender)
495 {
496 lock_block<mt_policy> lock(this);
497 m_senders.erase(sender);
498 }
499
500 virtual ~has_slots()
501 {
502 disconnect_all();
503 }
504
505 void disconnect_all()
506 {
507 lock_block<mt_policy> lock(this);
508 const_iterator it = m_senders.begin();
509 const_iterator itEnd = m_senders.end();
510
511 while(it != itEnd)
512 {
513 (*it)->slot_disconnect(this);
514 ++it;
515 }
516
517 m_senders.erase(m_senders.begin(), m_senders.end());
518 }
519
520 private:
521 sender_set m_senders;
522 };
523
524 template<class mt_policy>
525 class _signal_base0 : public _signal_base<mt_policy>
526 {
527 public:
528 typedef std::list<_connection_base0<mt_policy> *> connections_list;
529
530 _signal_base0()
531 {
532 ;
533 }
534
535 _signal_base0(const _signal_base0& s)
536 : _signal_base<mt_policy>(s)
537 {
538 lock_block<mt_policy> lock(this);
539 typename connections_list::const_iterator it = s.m_connected_slots.begin();
540 typename connections_list::const_iterator itEnd = s.m_connected_slots.end();
541
542 while(it != itEnd)
543 {
544 (*it)->getdest()->signal_connect(this);
545 m_connected_slots.push_back((*it)->clone());
546
547 ++it;
548 }
549 }
550
551 ~_signal_base0()
552 {
553 disconnect_all();
554 }
555
556 bool is_empty()
557 {
558 lock_block<mt_policy> lock(this);
559 typename connections_list::const_iterator it = m_connected_slots.begin();
560 typename connections_list::const_iterator itEnd = m_connected_slots.end();
561 return it == itEnd;
562 }
563
564 void disconnect_all()
565 {
566 lock_block<mt_policy> lock(this);
567 typename connections_list::const_iterator it = m_connected_slots.begin();
568 typename connections_list::const_iterator itEnd = m_connected_slots.end();
569
570 while(it != itEnd)
571 {
572 (*it)->getdest()->signal_disconnect(this);
573 delete *it;
574
575 ++it;
576 }
577
578 m_connected_slots.erase(m_connected_slots.begin(), m_connected_slots.end());
579 }
580
581#ifdef _DEBUG
582 bool connected(has_slots_interface* pclass)
583 {
584 lock_block<mt_policy> lock(this);
585 typename connections_list::const_iterator itNext, it = m_connected_slots.begin();
586 typename connections_list::const_iterator itEnd = m_connected_slots.end();
587 while(it != itEnd)
588 {
589 itNext = it;
590 ++itNext;
591 if ((*it)->getdest() == pclass)
592 return true;
593 it = itNext;
594 }
595 return false;
596 }
597#endif
598
599 void disconnect(has_slots_interface* pclass)
600 {
601 lock_block<mt_policy> lock(this);
602 typename connections_list::iterator it = m_connected_slots.begin();
603 typename connections_list::iterator itEnd = m_connected_slots.end();
604
605 while(it != itEnd)
606 {
607 if((*it)->getdest() == pclass)
608 {
609 delete *it;
610 m_connected_slots.erase(it);
611 pclass->signal_disconnect(this);
612 return;
613 }
614
615 ++it;
616 }
617 }
618
619 void slot_disconnect(has_slots_interface* pslot)
620 {
621 lock_block<mt_policy> lock(this);
622 typename connections_list::iterator it = m_connected_slots.begin();
623 typename connections_list::iterator itEnd = m_connected_slots.end();
624
625 while(it != itEnd)
626 {
627 typename connections_list::iterator itNext = it;
628 ++itNext;
629
630 if((*it)->getdest() == pslot)
631 {
632 delete *it;
633 m_connected_slots.erase(it);
634 }
635
636 it = itNext;
637 }
638 }
639
640 void slot_duplicate(const has_slots_interface* oldtarget, has_slots_interface* newtarget)
641 {
642 lock_block<mt_policy> lock(this);
643 typename connections_list::iterator it = m_connected_slots.begin();
644 typename connections_list::iterator itEnd = m_connected_slots.end();
645
646 while(it != itEnd)
647 {
648 if((*it)->getdest() == oldtarget)
649 {
650 m_connected_slots.push_back((*it)->duplicate(newtarget));
651 }
652
653 ++it;
654 }
655 }
656
657 protected:
658 connections_list m_connected_slots;
659 };
660
661 template<class arg1_type, class mt_policy>
662 class _signal_base1 : public _signal_base<mt_policy>
663 {
664 public:
665 typedef std::list<_connection_base1<arg1_type, mt_policy> *> connections_list;
666
667 _signal_base1()
668 {
669 ;
670 }
671
672 _signal_base1(const _signal_base1<arg1_type, mt_policy>& s)
673 : _signal_base<mt_policy>(s)
674 {
675 lock_block<mt_policy> lock(this);
676 typename connections_list::const_iterator it = s.m_connected_slots.begin();
677 typename connections_list::const_iterator itEnd = s.m_connected_slots.end();
678
679 while(it != itEnd)
680 {
681 (*it)->getdest()->signal_connect(this);
682 m_connected_slots.push_back((*it)->clone());
683
684 ++it;
685 }
686 }
687
688 void slot_duplicate(const has_slots_interface* oldtarget, has_slots_interface* newtarget)
689 {
690 lock_block<mt_policy> lock(this);
691 typename connections_list::iterator it = m_connected_slots.begin();
692 typename connections_list::iterator itEnd = m_connected_slots.end();
693
694 while(it != itEnd)
695 {
696 if((*it)->getdest() == oldtarget)
697 {
698 m_connected_slots.push_back((*it)->duplicate(newtarget));
699 }
700
701 ++it;
702 }
703 }
704
705 ~_signal_base1()
706 {
707 disconnect_all();
708 }
709
710 bool is_empty()
711 {
712 lock_block<mt_policy> lock(this);
713 typename connections_list::const_iterator it = m_connected_slots.begin();
714 typename connections_list::const_iterator itEnd = m_connected_slots.end();
715 return it == itEnd;
716 }
717
718 void disconnect_all()
719 {
720 lock_block<mt_policy> lock(this);
721 typename connections_list::const_iterator it = m_connected_slots.begin();
722 typename connections_list::const_iterator itEnd = m_connected_slots.end();
723
724 while(it != itEnd)
725 {
726 (*it)->getdest()->signal_disconnect(this);
727 delete *it;
728
729 ++it;
730 }
731
732 m_connected_slots.erase(m_connected_slots.begin(), m_connected_slots.end());
733 }
734
735#ifdef _DEBUG
736 bool connected(has_slots_interface* pclass)
737 {
738 lock_block<mt_policy> lock(this);
739 typename connections_list::const_iterator itNext, it = m_connected_slots.begin();
740 typename connections_list::const_iterator itEnd = m_connected_slots.end();
741 while(it != itEnd)
742 {
743 itNext = it;
744 ++itNext;
745 if ((*it)->getdest() == pclass)
746 return true;
747 it = itNext;
748 }
749 return false;
750 }
751#endif
752
753 void disconnect(has_slots_interface* pclass)
754 {
755 lock_block<mt_policy> lock(this);
756 typename connections_list::iterator it = m_connected_slots.begin();
757 typename connections_list::iterator itEnd = m_connected_slots.end();
758
759 while(it != itEnd)
760 {
761 if((*it)->getdest() == pclass)
762 {
763 delete *it;
764 m_connected_slots.erase(it);
765 pclass->signal_disconnect(this);
766 return;
767 }
768
769 ++it;
770 }
771 }
772
773 void slot_disconnect(has_slots_interface* pslot)
774 {
775 lock_block<mt_policy> lock(this);
776 typename connections_list::iterator it = m_connected_slots.begin();
777 typename connections_list::iterator itEnd = m_connected_slots.end();
778
779 while(it != itEnd)
780 {
781 typename connections_list::iterator itNext = it;
782 ++itNext;
783
784 if((*it)->getdest() == pslot)
785 {
786 delete *it;
787 m_connected_slots.erase(it);
788 }
789
790 it = itNext;
791 }
792 }
793
794
795 protected:
796 connections_list m_connected_slots;
797 };
798
799 template<class arg1_type, class arg2_type, class mt_policy>
800 class _signal_base2 : public _signal_base<mt_policy>
801 {
802 public:
803 typedef std::list<_connection_base2<arg1_type, arg2_type, mt_policy> *>
804 connections_list;
805
806 _signal_base2()
807 {
808 ;
809 }
810
811 _signal_base2(const _signal_base2<arg1_type, arg2_type, mt_policy>& s)
812 : _signal_base<mt_policy>(s)
813 {
814 lock_block<mt_policy> lock(this);
815 typename connections_list::const_iterator it = s.m_connected_slots.begin();
816 typename connections_list::const_iterator itEnd = s.m_connected_slots.end();
817
818 while(it != itEnd)
819 {
820 (*it)->getdest()->signal_connect(this);
821 m_connected_slots.push_back((*it)->clone());
822
823 ++it;
824 }
825 }
826
827 void slot_duplicate(const has_slots_interface* oldtarget, has_slots_interface* newtarget)
828 {
829 lock_block<mt_policy> lock(this);
830 typename connections_list::iterator it = m_connected_slots.begin();
831 typename connections_list::iterator itEnd = m_connected_slots.end();
832
833 while(it != itEnd)
834 {
835 if((*it)->getdest() == oldtarget)
836 {
837 m_connected_slots.push_back((*it)->duplicate(newtarget));
838 }
839
840 ++it;
841 }
842 }
843
844 ~_signal_base2()
845 {
846 disconnect_all();
847 }
848
849 bool is_empty()
850 {
851 lock_block<mt_policy> lock(this);
852 typename connections_list::const_iterator it = m_connected_slots.begin();
853 typename connections_list::const_iterator itEnd = m_connected_slots.end();
854 return it == itEnd;
855 }
856
857 void disconnect_all()
858 {
859 lock_block<mt_policy> lock(this);
860 typename connections_list::const_iterator it = m_connected_slots.begin();
861 typename connections_list::const_iterator itEnd = m_connected_slots.end();
862
863 while(it != itEnd)
864 {
865 (*it)->getdest()->signal_disconnect(this);
866 delete *it;
867
868 ++it;
869 }
870
871 m_connected_slots.erase(m_connected_slots.begin(), m_connected_slots.end());
872 }
873
874#ifdef _DEBUG
875 bool connected(has_slots_interface* pclass)
876 {
877 lock_block<mt_policy> lock(this);
878 typename connections_list::const_iterator itNext, it = m_connected_slots.begin();
879 typename connections_list::const_iterator itEnd = m_connected_slots.end();
880 while(it != itEnd)
881 {
882 itNext = it;
883 ++itNext;
884 if ((*it)->getdest() == pclass)
885 return true;
886 it = itNext;
887 }
888 return false;
889 }
890#endif
891
892 void disconnect(has_slots_interface* pclass)
893 {
894 lock_block<mt_policy> lock(this);
895 typename connections_list::iterator it = m_connected_slots.begin();
896 typename connections_list::iterator itEnd = m_connected_slots.end();
897
898 while(it != itEnd)
899 {
900 if((*it)->getdest() == pclass)
901 {
902 delete *it;
903 m_connected_slots.erase(it);
904 pclass->signal_disconnect(this);
905 return;
906 }
907
908 ++it;
909 }
910 }
911
912 void slot_disconnect(has_slots_interface* pslot)
913 {
914 lock_block<mt_policy> lock(this);
915 typename connections_list::iterator it = m_connected_slots.begin();
916 typename connections_list::iterator itEnd = m_connected_slots.end();
917
918 while(it != itEnd)
919 {
920 typename connections_list::iterator itNext = it;
921 ++itNext;
922
923 if((*it)->getdest() == pslot)
924 {
925 delete *it;
926 m_connected_slots.erase(it);
927 }
928
929 it = itNext;
930 }
931 }
932
933 protected:
934 connections_list m_connected_slots;
935 };
936
937 template<class arg1_type, class arg2_type, class arg3_type, class mt_policy>
938 class _signal_base3 : public _signal_base<mt_policy>
939 {
940 public:
941 typedef std::list<_connection_base3<arg1_type, arg2_type, arg3_type, mt_policy> *>
942 connections_list;
943
944 _signal_base3()
945 {
946 ;
947 }
948
949 _signal_base3(const _signal_base3<arg1_type, arg2_type, arg3_type, mt_policy>& s)
950 : _signal_base<mt_policy>(s)
951 {
952 lock_block<mt_policy> lock(this);
953 typename connections_list::const_iterator it = s.m_connected_slots.begin();
954 typename connections_list::const_iterator itEnd = s.m_connected_slots.end();
955
956 while(it != itEnd)
957 {
958 (*it)->getdest()->signal_connect(this);
959 m_connected_slots.push_back((*it)->clone());
960
961 ++it;
962 }
963 }
964
965 void slot_duplicate(const has_slots_interface* oldtarget, has_slots_interface* newtarget)
966 {
967 lock_block<mt_policy> lock(this);
968 typename connections_list::iterator it = m_connected_slots.begin();
969 typename connections_list::iterator itEnd = m_connected_slots.end();
970
971 while(it != itEnd)
972 {
973 if((*it)->getdest() == oldtarget)
974 {
975 m_connected_slots.push_back((*it)->duplicate(newtarget));
976 }
977
978 ++it;
979 }
980 }
981
982 ~_signal_base3()
983 {
984 disconnect_all();
985 }
986
987 bool is_empty()
988 {
989 lock_block<mt_policy> lock(this);
990 typename connections_list::const_iterator it = m_connected_slots.begin();
991 typename connections_list::const_iterator itEnd = m_connected_slots.end();
992 return it == itEnd;
993 }
994
995 void disconnect_all()
996 {
997 lock_block<mt_policy> lock(this);
998 typename connections_list::const_iterator it = m_connected_slots.begin();
999 typename connections_list::const_iterator itEnd = m_connected_slots.end();
1000
1001 while(it != itEnd)
1002 {
1003 (*it)->getdest()->signal_disconnect(this);
1004 delete *it;
1005
1006 ++it;
1007 }
1008
1009 m_connected_slots.erase(m_connected_slots.begin(), m_connected_slots.end());
1010 }
1011
1012#ifdef _DEBUG
1013 bool connected(has_slots_interface* pclass)
1014 {
1015 lock_block<mt_policy> lock(this);
1016 typename connections_list::const_iterator itNext, it = m_connected_slots.begin();
1017 typename connections_list::const_iterator itEnd = m_connected_slots.end();
1018 while(it != itEnd)
1019 {
1020 itNext = it;
1021 ++itNext;
1022 if ((*it)->getdest() == pclass)
1023 return true;
1024 it = itNext;
1025 }
1026 return false;
1027 }
1028#endif
1029
1030 void disconnect(has_slots_interface* pclass)
1031 {
1032 lock_block<mt_policy> lock(this);
1033 typename connections_list::iterator it = m_connected_slots.begin();
1034 typename connections_list::iterator itEnd = m_connected_slots.end();
1035
1036 while(it != itEnd)
1037 {
1038 if((*it)->getdest() == pclass)
1039 {
1040 delete *it;
1041 m_connected_slots.erase(it);
1042 pclass->signal_disconnect(this);
1043 return;
1044 }
1045
1046 ++it;
1047 }
1048 }
1049
1050 void slot_disconnect(has_slots_interface* pslot)
1051 {
1052 lock_block<mt_policy> lock(this);
1053 typename connections_list::iterator it = m_connected_slots.begin();
1054 typename connections_list::iterator itEnd = m_connected_slots.end();
1055
1056 while(it != itEnd)
1057 {
1058 typename connections_list::iterator itNext = it;
1059 ++itNext;
1060
1061 if((*it)->getdest() == pslot)
1062 {
1063 delete *it;
1064 m_connected_slots.erase(it);
1065 }
1066
1067 it = itNext;
1068 }
1069 }
1070
1071 protected:
1072 connections_list m_connected_slots;
1073 };
1074
1075 template<class arg1_type, class arg2_type, class arg3_type, class arg4_type, class mt_policy>
1076 class _signal_base4 : public _signal_base<mt_policy>
1077 {
1078 public:
1079 typedef std::list<_connection_base4<arg1_type, arg2_type, arg3_type,
1080 arg4_type, mt_policy> *> connections_list;
1081
1082 _signal_base4()
1083 {
1084 ;
1085 }
1086
1087 _signal_base4(const _signal_base4<arg1_type, arg2_type, arg3_type, arg4_type, mt_policy>& s)
1088 : _signal_base<mt_policy>(s)
1089 {
1090 lock_block<mt_policy> lock(this);
1091 typename connections_list::const_iterator it = s.m_connected_slots.begin();
1092 typename connections_list::const_iterator itEnd = s.m_connected_slots.end();
1093
1094 while(it != itEnd)
1095 {
1096 (*it)->getdest()->signal_connect(this);
1097 m_connected_slots.push_back((*it)->clone());
1098
1099 ++it;
1100 }
1101 }
1102
1103 void slot_duplicate(const has_slots_interface* oldtarget, has_slots_interface* newtarget)
1104 {
1105 lock_block<mt_policy> lock(this);
1106 typename connections_list::iterator it = m_connected_slots.begin();
1107 typename connections_list::iterator itEnd = m_connected_slots.end();
1108
1109 while(it != itEnd)
1110 {
1111 if((*it)->getdest() == oldtarget)
1112 {
1113 m_connected_slots.push_back((*it)->duplicate(newtarget));
1114 }
1115
1116 ++it;
1117 }
1118 }
1119
1120 ~_signal_base4()
1121 {
1122 disconnect_all();
1123 }
1124
1125 bool is_empty()
1126 {
1127 lock_block<mt_policy> lock(this);
1128 typename connections_list::const_iterator it = m_connected_slots.begin();
1129 typename connections_list::const_iterator itEnd = m_connected_slots.end();
1130 return it == itEnd;
1131 }
1132
1133 void disconnect_all()
1134 {
1135 lock_block<mt_policy> lock(this);
1136 typename connections_list::const_iterator it = m_connected_slots.begin();
1137 typename connections_list::const_iterator itEnd = m_connected_slots.end();
1138
1139 while(it != itEnd)
1140 {
1141 (*it)->getdest()->signal_disconnect(this);
1142 delete *it;
1143
1144 ++it;
1145 }
1146
1147 m_connected_slots.erase(m_connected_slots.begin(), m_connected_slots.end());
1148 }
1149
1150#ifdef _DEBUG
1151 bool connected(has_slots_interface* pclass)
1152 {
1153 lock_block<mt_policy> lock(this);
1154 typename connections_list::const_iterator itNext, it = m_connected_slots.begin();
1155 typename connections_list::const_iterator itEnd = m_connected_slots.end();
1156 while(it != itEnd)
1157 {
1158 itNext = it;
1159 ++itNext;
1160 if ((*it)->getdest() == pclass)
1161 return true;
1162 it = itNext;
1163 }
1164 return false;
1165 }
1166#endif
1167
1168 void disconnect(has_slots_interface* pclass)
1169 {
1170 lock_block<mt_policy> lock(this);
1171 typename connections_list::iterator it = m_connected_slots.begin();
1172 typename connections_list::iterator itEnd = m_connected_slots.end();
1173
1174 while(it != itEnd)
1175 {
1176 if((*it)->getdest() == pclass)
1177 {
1178 delete *it;
1179 m_connected_slots.erase(it);
1180 pclass->signal_disconnect(this);
1181 return;
1182 }
1183
1184 ++it;
1185 }
1186 }
1187
1188 void slot_disconnect(has_slots_interface* pslot)
1189 {
1190 lock_block<mt_policy> lock(this);
1191 typename connections_list::iterator it = m_connected_slots.begin();
1192 typename connections_list::iterator itEnd = m_connected_slots.end();
1193
1194 while(it != itEnd)
1195 {
1196 typename connections_list::iterator itNext = it;
1197 ++itNext;
1198
1199 if((*it)->getdest() == pslot)
1200 {
1201 delete *it;
1202 m_connected_slots.erase(it);
1203 }
1204
1205 it = itNext;
1206 }
1207 }
1208
1209 protected:
1210 connections_list m_connected_slots;
1211 };
1212
1213 template<class arg1_type, class arg2_type, class arg3_type, class arg4_type,
1214 class arg5_type, class mt_policy>
1215 class _signal_base5 : public _signal_base<mt_policy>
1216 {
1217 public:
1218 typedef std::list<_connection_base5<arg1_type, arg2_type, arg3_type,
1219 arg4_type, arg5_type, mt_policy> *> connections_list;
1220
1221 _signal_base5()
1222 {
1223 ;
1224 }
1225
1226 _signal_base5(const _signal_base5<arg1_type, arg2_type, arg3_type, arg4_type,
1227 arg5_type, mt_policy>& s)
1228 : _signal_base<mt_policy>(s)
1229 {
1230 lock_block<mt_policy> lock(this);
1231 typename connections_list::const_iterator it = s.m_connected_slots.begin();
1232 typename connections_list::const_iterator itEnd = s.m_connected_slots.end();
1233
1234 while(it != itEnd)
1235 {
1236 (*it)->getdest()->signal_connect(this);
1237 m_connected_slots.push_back((*it)->clone());
1238
1239 ++it;
1240 }
1241 }
1242
1243 void slot_duplicate(const has_slots_interface* oldtarget, has_slots_interface* newtarget)
1244 {
1245 lock_block<mt_policy> lock(this);
1246 typename connections_list::iterator it = m_connected_slots.begin();
1247 typename connections_list::iterator itEnd = m_connected_slots.end();
1248
1249 while(it != itEnd)
1250 {
1251 if((*it)->getdest() == oldtarget)
1252 {
1253 m_connected_slots.push_back((*it)->duplicate(newtarget));
1254 }
1255
1256 ++it;
1257 }
1258 }
1259
1260 ~_signal_base5()
1261 {
1262 disconnect_all();
1263 }
1264
1265 bool is_empty()
1266 {
1267 lock_block<mt_policy> lock(this);
1268 typename connections_list::const_iterator it = m_connected_slots.begin();
1269 typename connections_list::const_iterator itEnd = m_connected_slots.end();
1270 return it == itEnd;
1271 }
1272
1273 void disconnect_all()
1274 {
1275 lock_block<mt_policy> lock(this);
1276 typename connections_list::const_iterator it = m_connected_slots.begin();
1277 typename connections_list::const_iterator itEnd = m_connected_slots.end();
1278
1279 while(it != itEnd)
1280 {
1281 (*it)->getdest()->signal_disconnect(this);
1282 delete *it;
1283
1284 ++it;
1285 }
1286
1287 m_connected_slots.erase(m_connected_slots.begin(), m_connected_slots.end());
1288 }
1289
1290#ifdef _DEBUG
1291 bool connected(has_slots_interface* pclass)
1292 {
1293 lock_block<mt_policy> lock(this);
1294 typename connections_list::const_iterator itNext, it = m_connected_slots.begin();
1295 typename connections_list::const_iterator itEnd = m_connected_slots.end();
1296 while(it != itEnd)
1297 {
1298 itNext = it;
1299 ++itNext;
1300 if ((*it)->getdest() == pclass)
1301 return true;
1302 it = itNext;
1303 }
1304 return false;
1305 }
1306#endif
1307
1308 void disconnect(has_slots_interface* pclass)
1309 {
1310 lock_block<mt_policy> lock(this);
1311 typename connections_list::iterator it = m_connected_slots.begin();
1312 typename connections_list::iterator itEnd = m_connected_slots.end();
1313
1314 while(it != itEnd)
1315 {
1316 if((*it)->getdest() == pclass)
1317 {
1318 delete *it;
1319 m_connected_slots.erase(it);
1320 pclass->signal_disconnect(this);
1321 return;
1322 }
1323
1324 ++it;
1325 }
1326 }
1327
1328 void slot_disconnect(has_slots_interface* pslot)
1329 {
1330 lock_block<mt_policy> lock(this);
1331 typename connections_list::iterator it = m_connected_slots.begin();
1332 typename connections_list::iterator itEnd = m_connected_slots.end();
1333
1334 while(it != itEnd)
1335 {
1336 typename connections_list::iterator itNext = it;
1337 ++itNext;
1338
1339 if((*it)->getdest() == pslot)
1340 {
1341 delete *it;
1342 m_connected_slots.erase(it);
1343 }
1344
1345 it = itNext;
1346 }
1347 }
1348
1349 protected:
1350 connections_list m_connected_slots;
1351 };
1352
1353 template<class arg1_type, class arg2_type, class arg3_type, class arg4_type,
1354 class arg5_type, class arg6_type, class mt_policy>
1355 class _signal_base6 : public _signal_base<mt_policy>
1356 {
1357 public:
1358 typedef std::list<_connection_base6<arg1_type, arg2_type, arg3_type,
1359 arg4_type, arg5_type, arg6_type, mt_policy> *> connections_list;
1360
1361 _signal_base6()
1362 {
1363 ;
1364 }
1365
1366 _signal_base6(const _signal_base6<arg1_type, arg2_type, arg3_type, arg4_type,
1367 arg5_type, arg6_type, mt_policy>& s)
1368 : _signal_base<mt_policy>(s)
1369 {
1370 lock_block<mt_policy> lock(this);
1371 typename connections_list::const_iterator it = s.m_connected_slots.begin();
1372 typename connections_list::const_iterator itEnd = s.m_connected_slots.end();
1373
1374 while(it != itEnd)
1375 {
1376 (*it)->getdest()->signal_connect(this);
1377 m_connected_slots.push_back((*it)->clone());
1378
1379 ++it;
1380 }
1381 }
1382
1383 void slot_duplicate(const has_slots_interface* oldtarget, has_slots_interface* newtarget)
1384 {
1385 lock_block<mt_policy> lock(this);
1386 typename connections_list::iterator it = m_connected_slots.begin();
1387 typename connections_list::iterator itEnd = m_connected_slots.end();
1388
1389 while(it != itEnd)
1390 {
1391 if((*it)->getdest() == oldtarget)
1392 {
1393 m_connected_slots.push_back((*it)->duplicate(newtarget));
1394 }
1395
1396 ++it;
1397 }
1398 }
1399
1400 ~_signal_base6()
1401 {
1402 disconnect_all();
1403 }
1404
1405 bool is_empty()
1406 {
1407 lock_block<mt_policy> lock(this);
1408 typename connections_list::const_iterator it = m_connected_slots.begin();
1409 typename connections_list::const_iterator itEnd = m_connected_slots.end();
1410 return it == itEnd;
1411 }
1412
1413 void disconnect_all()
1414 {
1415 lock_block<mt_policy> lock(this);
1416 typename connections_list::const_iterator it = m_connected_slots.begin();
1417 typename connections_list::const_iterator itEnd = m_connected_slots.end();
1418
1419 while(it != itEnd)
1420 {
1421 (*it)->getdest()->signal_disconnect(this);
1422 delete *it;
1423
1424 ++it;
1425 }
1426
1427 m_connected_slots.erase(m_connected_slots.begin(), m_connected_slots.end());
1428 }
1429
1430#ifdef _DEBUG
1431 bool connected(has_slots_interface* pclass)
1432 {
1433 lock_block<mt_policy> lock(this);
1434 typename connections_list::const_iterator itNext, it = m_connected_slots.begin();
1435 typename connections_list::const_iterator itEnd = m_connected_slots.end();
1436 while(it != itEnd)
1437 {
1438 itNext = it;
1439 ++itNext;
1440 if ((*it)->getdest() == pclass)
1441 return true;
1442 it = itNext;
1443 }
1444 return false;
1445 }
1446#endif
1447
1448 void disconnect(has_slots_interface* pclass)
1449 {
1450 lock_block<mt_policy> lock(this);
1451 typename connections_list::iterator it = m_connected_slots.begin();
1452 typename connections_list::iterator itEnd = m_connected_slots.end();
1453
1454 while(it != itEnd)
1455 {
1456 if((*it)->getdest() == pclass)
1457 {
1458 delete *it;
1459 m_connected_slots.erase(it);
1460 pclass->signal_disconnect(this);
1461 return;
1462 }
1463
1464 ++it;
1465 }
1466 }
1467
1468 void slot_disconnect(has_slots_interface* pslot)
1469 {
1470 lock_block<mt_policy> lock(this);
1471 typename connections_list::iterator it = m_connected_slots.begin();
1472 typename connections_list::iterator itEnd = m_connected_slots.end();
1473
1474 while(it != itEnd)
1475 {
1476 typename connections_list::iterator itNext = it;
1477 ++itNext;
1478
1479 if((*it)->getdest() == pslot)
1480 {
1481 delete *it;
1482 m_connected_slots.erase(it);
1483 }
1484
1485 it = itNext;
1486 }
1487 }
1488
1489 protected:
1490 connections_list m_connected_slots;
1491 };
1492
1493 template<class arg1_type, class arg2_type, class arg3_type, class arg4_type,
1494 class arg5_type, class arg6_type, class arg7_type, class mt_policy>
1495 class _signal_base7 : public _signal_base<mt_policy>
1496 {
1497 public:
1498 typedef std::list<_connection_base7<arg1_type, arg2_type, arg3_type,
1499 arg4_type, arg5_type, arg6_type, arg7_type, mt_policy> *> connections_list;
1500
1501 _signal_base7()
1502 {
1503 ;
1504 }
1505
1506 _signal_base7(const _signal_base7<arg1_type, arg2_type, arg3_type, arg4_type,
1507 arg5_type, arg6_type, arg7_type, mt_policy>& s)
1508 : _signal_base<mt_policy>(s)
1509 {
1510 lock_block<mt_policy> lock(this);
1511 typename connections_list::const_iterator it = s.m_connected_slots.begin();
1512 typename connections_list::const_iterator itEnd = s.m_connected_slots.end();
1513
1514 while(it != itEnd)
1515 {
1516 (*it)->getdest()->signal_connect(this);
1517 m_connected_slots.push_back((*it)->clone());
1518
1519 ++it;
1520 }
1521 }
1522
1523 void slot_duplicate(const has_slots_interface* oldtarget, has_slots_interface* newtarget)
1524 {
1525 lock_block<mt_policy> lock(this);
1526 typename connections_list::iterator it = m_connected_slots.begin();
1527 typename connections_list::iterator itEnd = m_connected_slots.end();
1528
1529 while(it != itEnd)
1530 {
1531 if((*it)->getdest() == oldtarget)
1532 {
1533 m_connected_slots.push_back((*it)->duplicate(newtarget));
1534 }
1535
1536 ++it;
1537 }
1538 }
1539
1540 ~_signal_base7()
1541 {
1542 disconnect_all();
1543 }
1544
1545 bool is_empty()
1546 {
1547 lock_block<mt_policy> lock(this);
1548 typename connections_list::const_iterator it = m_connected_slots.begin();
1549 typename connections_list::const_iterator itEnd = m_connected_slots.end();
1550 return it == itEnd;
1551 }
1552
1553 void disconnect_all()
1554 {
1555 lock_block<mt_policy> lock(this);
1556 typename connections_list::const_iterator it = m_connected_slots.begin();
1557 typename connections_list::const_iterator itEnd = m_connected_slots.end();
1558
1559 while(it != itEnd)
1560 {
1561 (*it)->getdest()->signal_disconnect(this);
1562 delete *it;
1563
1564 ++it;
1565 }
1566
1567 m_connected_slots.erase(m_connected_slots.begin(), m_connected_slots.end());
1568 }
1569
1570#ifdef _DEBUG
1571 bool connected(has_slots_interface* pclass)
1572 {
1573 lock_block<mt_policy> lock(this);
1574 typename connections_list::const_iterator itNext, it = m_connected_slots.begin();
1575 typename connections_list::const_iterator itEnd = m_connected_slots.end();
1576 while(it != itEnd)
1577 {
1578 itNext = it;
1579 ++itNext;
1580 if ((*it)->getdest() == pclass)
1581 return true;
1582 it = itNext;
1583 }
1584 return false;
1585 }
1586#endif
1587
1588 void disconnect(has_slots_interface* pclass)
1589 {
1590 lock_block<mt_policy> lock(this);
1591 typename connections_list::iterator it = m_connected_slots.begin();
1592 typename connections_list::iterator itEnd = m_connected_slots.end();
1593
1594 while(it != itEnd)
1595 {
1596 if((*it)->getdest() == pclass)
1597 {
1598 delete *it;
1599 m_connected_slots.erase(it);
1600 pclass->signal_disconnect(this);
1601 return;
1602 }
1603
1604 ++it;
1605 }
1606 }
1607
1608 void slot_disconnect(has_slots_interface* pslot)
1609 {
1610 lock_block<mt_policy> lock(this);
1611 typename connections_list::iterator it = m_connected_slots.begin();
1612 typename connections_list::iterator itEnd = m_connected_slots.end();
1613
1614 while(it != itEnd)
1615 {
1616 typename connections_list::iterator itNext = it;
1617 ++itNext;
1618
1619 if((*it)->getdest() == pslot)
1620 {
1621 delete *it;
1622 m_connected_slots.erase(it);
1623 }
1624
1625 it = itNext;
1626 }
1627 }
1628
1629 protected:
1630 connections_list m_connected_slots;
1631 };
1632
1633 template<class arg1_type, class arg2_type, class arg3_type, class arg4_type,
1634 class arg5_type, class arg6_type, class arg7_type, class arg8_type, class mt_policy>
1635 class _signal_base8 : public _signal_base<mt_policy>
1636 {
1637 public:
1638 typedef std::list<_connection_base8<arg1_type, arg2_type, arg3_type,
1639 arg4_type, arg5_type, arg6_type, arg7_type, arg8_type, mt_policy> *>
1640 connections_list;
1641
1642 _signal_base8()
1643 {
1644 ;
1645 }
1646
1647 _signal_base8(const _signal_base8<arg1_type, arg2_type, arg3_type, arg4_type,
1648 arg5_type, arg6_type, arg7_type, arg8_type, mt_policy>& s)
1649 : _signal_base<mt_policy>(s)
1650 {
1651 lock_block<mt_policy> lock(this);
1652 typename connections_list::const_iterator it = s.m_connected_slots.begin();
1653 typename connections_list::const_iterator itEnd = s.m_connected_slots.end();
1654
1655 while(it != itEnd)
1656 {
1657 (*it)->getdest()->signal_connect(this);
1658 m_connected_slots.push_back((*it)->clone());
1659
1660 ++it;
1661 }
1662 }
1663
1664 void slot_duplicate(const has_slots_interface* oldtarget, has_slots_interface* newtarget)
1665 {
1666 lock_block<mt_policy> lock(this);
1667 typename connections_list::iterator it = m_connected_slots.begin();
1668 typename connections_list::iterator itEnd = m_connected_slots.end();
1669
1670 while(it != itEnd)
1671 {
1672 if((*it)->getdest() == oldtarget)
1673 {
1674 m_connected_slots.push_back((*it)->duplicate(newtarget));
1675 }
1676
1677 ++it;
1678 }
1679 }
1680
1681 ~_signal_base8()
1682 {
1683 disconnect_all();
1684 }
1685
1686 bool is_empty()
1687 {
1688 lock_block<mt_policy> lock(this);
1689 typename connections_list::const_iterator it = m_connected_slots.begin();
1690 typename connections_list::const_iterator itEnd = m_connected_slots.end();
1691 return it == itEnd;
1692 }
1693
1694 void disconnect_all()
1695 {
1696 lock_block<mt_policy> lock(this);
1697 typename connections_list::const_iterator it = m_connected_slots.begin();
1698 typename connections_list::const_iterator itEnd = m_connected_slots.end();
1699
1700 while(it != itEnd)
1701 {
1702 (*it)->getdest()->signal_disconnect(this);
1703 delete *it;
1704
1705 ++it;
1706 }
1707
1708 m_connected_slots.erase(m_connected_slots.begin(), m_connected_slots.end());
1709 }
1710
1711#ifdef _DEBUG
1712 bool connected(has_slots_interface* pclass)
1713 {
1714 lock_block<mt_policy> lock(this);
1715 typename connections_list::const_iterator itNext, it = m_connected_slots.begin();
1716 typename connections_list::const_iterator itEnd = m_connected_slots.end();
1717 while(it != itEnd)
1718 {
1719 itNext = it;
1720 ++itNext;
1721 if ((*it)->getdest() == pclass)
1722 return true;
1723 it = itNext;
1724 }
1725 return false;
1726 }
1727#endif
1728
1729 void disconnect(has_slots_interface* pclass)
1730 {
1731 lock_block<mt_policy> lock(this);
1732 typename connections_list::iterator it = m_connected_slots.begin();
1733 typename connections_list::iterator itEnd = m_connected_slots.end();
1734
1735 while(it != itEnd)
1736 {
1737 if((*it)->getdest() == pclass)
1738 {
1739 delete *it;
1740 m_connected_slots.erase(it);
1741 pclass->signal_disconnect(this);
1742 return;
1743 }
1744
1745 ++it;
1746 }
1747 }
1748
1749 void slot_disconnect(has_slots_interface* pslot)
1750 {
1751 lock_block<mt_policy> lock(this);
1752 typename connections_list::iterator it = m_connected_slots.begin();
1753 typename connections_list::iterator itEnd = m_connected_slots.end();
1754
1755 while(it != itEnd)
1756 {
1757 typename connections_list::iterator itNext = it;
1758 ++itNext;
1759
1760 if((*it)->getdest() == pslot)
1761 {
1762 delete *it;
1763 m_connected_slots.erase(it);
1764 }
1765
1766 it = itNext;
1767 }
1768 }
1769
1770 protected:
1771 connections_list m_connected_slots;
1772 };
1773
1774
1775 template<class dest_type, class mt_policy>
1776 class _connection0 : public _connection_base0<mt_policy>
1777 {
1778 public:
1779 _connection0()
1780 {
1781 m_pobject = NULL;
1782 m_pmemfun = NULL;
1783 }
1784
1785 _connection0(dest_type* pobject, void (dest_type::*pmemfun)())
1786 {
1787 m_pobject = pobject;
1788 m_pmemfun = pmemfun;
1789 }
1790
1791 virtual ~_connection0()
1792 {
1793 }
1794
1795 virtual _connection_base0<mt_policy>* clone()
1796 {
1797 return new _connection0<dest_type, mt_policy>(*this);
1798 }
1799
1800 virtual _connection_base0<mt_policy>* duplicate(has_slots_interface* pnewdest)
1801 {
1802 return new _connection0<dest_type, mt_policy>((dest_type *)pnewdest, m_pmemfun);
1803 }
1804
1805 virtual void emit()
1806 {
1807 (m_pobject->*m_pmemfun)();
1808 }
1809
1810 virtual has_slots_interface* getdest() const
1811 {
1812 return m_pobject;
1813 }
1814
1815 private:
1816 dest_type* m_pobject;
1817 void (dest_type::* m_pmemfun)();
1818 };
1819
1820 template<class dest_type, class arg1_type, class mt_policy>
1821 class _connection1 : public _connection_base1<arg1_type, mt_policy>
1822 {
1823 public:
1824 _connection1()
1825 {
1826 m_pobject = NULL;
1827 m_pmemfun = NULL;
1828 }
1829
1830 _connection1(dest_type* pobject, void (dest_type::*pmemfun)(arg1_type))
1831 {
1832 m_pobject = pobject;
1833 m_pmemfun = pmemfun;
1834 }
1835
1836 virtual ~_connection1()
1837 {
1838 }
1839
1840 virtual _connection_base1<arg1_type, mt_policy>* clone()
1841 {
1842 return new _connection1<dest_type, arg1_type, mt_policy>(*this);
1843 }
1844
1845 virtual _connection_base1<arg1_type, mt_policy>* duplicate(has_slots_interface* pnewdest)
1846 {
1847 return new _connection1<dest_type, arg1_type, mt_policy>((dest_type *)pnewdest, m_pmemfun);
1848 }
1849
1850 virtual void emit(arg1_type a1)
1851 {
1852 (m_pobject->*m_pmemfun)(a1);
1853 }
1854
1855 virtual has_slots_interface* getdest() const
1856 {
1857 return m_pobject;
1858 }
1859
1860 private:
1861 dest_type* m_pobject;
1862 void (dest_type::* m_pmemfun)(arg1_type);
1863 };
1864
1865 template<class dest_type, class arg1_type, class arg2_type, class mt_policy>
1866 class _connection2 : public _connection_base2<arg1_type, arg2_type, mt_policy>
1867 {
1868 public:
1869 _connection2()
1870 {
1871 m_pobject = NULL;
1872 m_pmemfun = NULL;
1873 }
1874
1875 _connection2(dest_type* pobject, void (dest_type::*pmemfun)(arg1_type,
1876 arg2_type))
1877 {
1878 m_pobject = pobject;
1879 m_pmemfun = pmemfun;
1880 }
1881
1882 virtual ~_connection2()
1883 {
1884 }
1885
1886 virtual _connection_base2<arg1_type, arg2_type, mt_policy>* clone()
1887 {
1888 return new _connection2<dest_type, arg1_type, arg2_type, mt_policy>(*this);
1889 }
1890
1891 virtual _connection_base2<arg1_type, arg2_type, mt_policy>* duplicate(has_slots_interface* pnewdest)
1892 {
1893 return new _connection2<dest_type, arg1_type, arg2_type, mt_policy>((dest_type *)pnewdest, m_pmemfun);
1894 }
1895
1896 virtual void emit(arg1_type a1, arg2_type a2)
1897 {
1898 (m_pobject->*m_pmemfun)(a1, a2);
1899 }
1900
1901 virtual has_slots_interface* getdest() const
1902 {
1903 return m_pobject;
1904 }
1905
1906 private:
1907 dest_type* m_pobject;
1908 void (dest_type::* m_pmemfun)(arg1_type, arg2_type);
1909 };
1910
1911 template<class dest_type, class arg1_type, class arg2_type, class arg3_type, class mt_policy>
1912 class _connection3 : public _connection_base3<arg1_type, arg2_type, arg3_type, mt_policy>
1913 {
1914 public:
1915 _connection3()
1916 {
1917 m_pobject = NULL;
1918 m_pmemfun = NULL;
1919 }
1920
1921 _connection3(dest_type* pobject, void (dest_type::*pmemfun)(arg1_type,
1922 arg2_type, arg3_type))
1923 {
1924 m_pobject = pobject;
1925 m_pmemfun = pmemfun;
1926 }
1927
1928 virtual ~_connection3()
1929 {
1930 }
1931
1932 virtual _connection_base3<arg1_type, arg2_type, arg3_type, mt_policy>* clone()
1933 {
1934 return new _connection3<dest_type, arg1_type, arg2_type, arg3_type, mt_policy>(*this);
1935 }
1936
1937 virtual _connection_base3<arg1_type, arg2_type, arg3_type, mt_policy>* duplicate(has_slots_interface* pnewdest)
1938 {
1939 return new _connection3<dest_type, arg1_type, arg2_type, arg3_type, mt_policy>((dest_type *)pnewdest, m_pmemfun);
1940 }
1941
1942 virtual void emit(arg1_type a1, arg2_type a2, arg3_type a3)
1943 {
1944 (m_pobject->*m_pmemfun)(a1, a2, a3);
1945 }
1946
1947 virtual has_slots_interface* getdest() const
1948 {
1949 return m_pobject;
1950 }
1951
1952 private:
1953 dest_type* m_pobject;
1954 void (dest_type::* m_pmemfun)(arg1_type, arg2_type, arg3_type);
1955 };
1956
1957 template<class dest_type, class arg1_type, class arg2_type, class arg3_type,
1958 class arg4_type, class mt_policy>
1959 class _connection4 : public _connection_base4<arg1_type, arg2_type,
1960 arg3_type, arg4_type, mt_policy>
1961 {
1962 public:
1963 _connection4()
1964 {
1965 m_pobject = NULL;
1966 m_pmemfun = NULL;
1967 }
1968
1969 _connection4(dest_type* pobject, void (dest_type::*pmemfun)(arg1_type,
1970 arg2_type, arg3_type, arg4_type))
1971 {
1972 m_pobject = pobject;
1973 m_pmemfun = pmemfun;
1974 }
1975
1976 virtual ~_connection4()
1977 {
1978 }
1979
1980 virtual _connection_base4<arg1_type, arg2_type, arg3_type, arg4_type, mt_policy>* clone()
1981 {
1982 return new _connection4<dest_type, arg1_type, arg2_type, arg3_type, arg4_type, mt_policy>(*this);
1983 }
1984
1985 virtual _connection_base4<arg1_type, arg2_type, arg3_type, arg4_type, mt_policy>* duplicate(has_slots_interface* pnewdest)
1986 {
1987 return new _connection4<dest_type, arg1_type, arg2_type, arg3_type, arg4_type, mt_policy>((dest_type *)pnewdest, m_pmemfun);
1988 }
1989
1990 virtual void emit(arg1_type a1, arg2_type a2, arg3_type a3,
1991 arg4_type a4)
1992 {
1993 (m_pobject->*m_pmemfun)(a1, a2, a3, a4);
1994 }
1995
1996 virtual has_slots_interface* getdest() const
1997 {
1998 return m_pobject;
1999 }
2000
2001 private:
2002 dest_type* m_pobject;
2003 void (dest_type::* m_pmemfun)(arg1_type, arg2_type, arg3_type,
2004 arg4_type);
2005 };
2006
2007 template<class dest_type, class arg1_type, class arg2_type, class arg3_type,
2008 class arg4_type, class arg5_type, class mt_policy>
2009 class _connection5 : public _connection_base5<arg1_type, arg2_type,
2010 arg3_type, arg4_type, arg5_type, mt_policy>
2011 {
2012 public:
2013 _connection5()
2014 {
2015 m_pobject = NULL;
2016 m_pmemfun = NULL;
2017 }
2018
2019 _connection5(dest_type* pobject, void (dest_type::*pmemfun)(arg1_type,
2020 arg2_type, arg3_type, arg4_type, arg5_type))
2021 {
2022 m_pobject = pobject;
2023 m_pmemfun = pmemfun;
2024 }
2025
2026 virtual ~_connection5()
2027 {
2028 }
2029
2030 virtual _connection_base5<arg1_type, arg2_type, arg3_type, arg4_type,
2031 arg5_type, mt_policy>* clone()
2032 {
2033 return new _connection5<dest_type, arg1_type, arg2_type, arg3_type, arg4_type,
2034 arg5_type, mt_policy>(*this);
2035 }
2036
2037 virtual _connection_base5<arg1_type, arg2_type, arg3_type, arg4_type,
2038 arg5_type, mt_policy>* duplicate(has_slots_interface* pnewdest)
2039 {
2040 return new _connection5<dest_type, arg1_type, arg2_type, arg3_type, arg4_type,
2041 arg5_type, mt_policy>((dest_type *)pnewdest, m_pmemfun);
2042 }
2043
2044 virtual void emit(arg1_type a1, arg2_type a2, arg3_type a3, arg4_type a4,
2045 arg5_type a5)
2046 {
2047 (m_pobject->*m_pmemfun)(a1, a2, a3, a4, a5);
2048 }
2049
2050 virtual has_slots_interface* getdest() const
2051 {
2052 return m_pobject;
2053 }
2054
2055 private:
2056 dest_type* m_pobject;
2057 void (dest_type::* m_pmemfun)(arg1_type, arg2_type, arg3_type, arg4_type,
2058 arg5_type);
2059 };
2060
2061 template<class dest_type, class arg1_type, class arg2_type, class arg3_type,
2062 class arg4_type, class arg5_type, class arg6_type, class mt_policy>
2063 class _connection6 : public _connection_base6<arg1_type, arg2_type,
2064 arg3_type, arg4_type, arg5_type, arg6_type, mt_policy>
2065 {
2066 public:
2067 _connection6()
2068 {
2069 m_pobject = NULL;
2070 m_pmemfun = NULL;
2071 }
2072
2073 _connection6(dest_type* pobject, void (dest_type::*pmemfun)(arg1_type,
2074 arg2_type, arg3_type, arg4_type, arg5_type, arg6_type))
2075 {
2076 m_pobject = pobject;
2077 m_pmemfun = pmemfun;
2078 }
2079
2080 virtual ~_connection6()
2081 {
2082 }
2083
2084 virtual _connection_base6<arg1_type, arg2_type, arg3_type, arg4_type,
2085 arg5_type, arg6_type, mt_policy>* clone()
2086 {
2087 return new _connection6<dest_type, arg1_type, arg2_type, arg3_type, arg4_type,
2088 arg5_type, arg6_type, mt_policy>(*this);
2089 }
2090
2091 virtual _connection_base6<arg1_type, arg2_type, arg3_type, arg4_type,
2092 arg5_type, arg6_type, mt_policy>* duplicate(has_slots_interface* pnewdest)
2093 {
2094 return new _connection6<dest_type, arg1_type, arg2_type, arg3_type, arg4_type,
2095 arg5_type, arg6_type, mt_policy>((dest_type *)pnewdest, m_pmemfun);
2096 }
2097
2098 virtual void emit(arg1_type a1, arg2_type a2, arg3_type a3, arg4_type a4,
2099 arg5_type a5, arg6_type a6)
2100 {
2101 (m_pobject->*m_pmemfun)(a1, a2, a3, a4, a5, a6);
2102 }
2103
2104 virtual has_slots_interface* getdest() const
2105 {
2106 return m_pobject;
2107 }
2108
2109 private:
2110 dest_type* m_pobject;
2111 void (dest_type::* m_pmemfun)(arg1_type, arg2_type, arg3_type, arg4_type,
2112 arg5_type, arg6_type);
2113 };
2114
2115 template<class dest_type, class arg1_type, class arg2_type, class arg3_type,
2116 class arg4_type, class arg5_type, class arg6_type, class arg7_type, class mt_policy>
2117 class _connection7 : public _connection_base7<arg1_type, arg2_type,
2118 arg3_type, arg4_type, arg5_type, arg6_type, arg7_type, mt_policy>
2119 {
2120 public:
2121 _connection7()
2122 {
2123 m_pobject = NULL;
2124 m_pmemfun = NULL;
2125 }
2126
2127 _connection7(dest_type* pobject, void (dest_type::*pmemfun)(arg1_type,
2128 arg2_type, arg3_type, arg4_type, arg5_type, arg6_type, arg7_type))
2129 {
2130 m_pobject = pobject;
2131 m_pmemfun = pmemfun;
2132 }
2133
2134 virtual ~_connection7()
2135 {
2136 }
2137
2138 virtual _connection_base7<arg1_type, arg2_type, arg3_type, arg4_type,
2139 arg5_type, arg6_type, arg7_type, mt_policy>* clone()
2140 {
2141 return new _connection7<dest_type, arg1_type, arg2_type, arg3_type, arg4_type,
2142 arg5_type, arg6_type, arg7_type, mt_policy>(*this);
2143 }
2144
2145 virtual _connection_base7<arg1_type, arg2_type, arg3_type, arg4_type,
2146 arg5_type, arg6_type, arg7_type, mt_policy>* duplicate(has_slots_interface* pnewdest)
2147 {
2148 return new _connection7<dest_type, arg1_type, arg2_type, arg3_type, arg4_type,
2149 arg5_type, arg6_type, arg7_type, mt_policy>((dest_type *)pnewdest, m_pmemfun);
2150 }
2151
2152 virtual void emit(arg1_type a1, arg2_type a2, arg3_type a3, arg4_type a4,
2153 arg5_type a5, arg6_type a6, arg7_type a7)
2154 {
2155 (m_pobject->*m_pmemfun)(a1, a2, a3, a4, a5, a6, a7);
2156 }
2157
2158 virtual has_slots_interface* getdest() const
2159 {
2160 return m_pobject;
2161 }
2162
2163 private:
2164 dest_type* m_pobject;
2165 void (dest_type::* m_pmemfun)(arg1_type, arg2_type, arg3_type, arg4_type,
2166 arg5_type, arg6_type, arg7_type);
2167 };
2168
2169 template<class dest_type, class arg1_type, class arg2_type, class arg3_type,
2170 class arg4_type, class arg5_type, class arg6_type, class arg7_type,
2171 class arg8_type, class mt_policy>
2172 class _connection8 : public _connection_base8<arg1_type, arg2_type,
2173 arg3_type, arg4_type, arg5_type, arg6_type, arg7_type, arg8_type, mt_policy>
2174 {
2175 public:
2176 _connection8()
2177 {
2178 m_pobject = NULL;
2179 m_pmemfun = NULL;
2180 }
2181
2182 _connection8(dest_type* pobject, void (dest_type::*pmemfun)(arg1_type,
2183 arg2_type, arg3_type, arg4_type, arg5_type, arg6_type,
2184 arg7_type, arg8_type))
2185 {
2186 m_pobject = pobject;
2187 m_pmemfun = pmemfun;
2188 }
2189
2190 virtual ~_connection8()
2191 {
2192 }
2193
2194 virtual _connection_base8<arg1_type, arg2_type, arg3_type, arg4_type,
2195 arg5_type, arg6_type, arg7_type, arg8_type, mt_policy>* clone()
2196 {
2197 return new _connection8<dest_type, arg1_type, arg2_type, arg3_type, arg4_type,
2198 arg5_type, arg6_type, arg7_type, arg8_type, mt_policy>(*this);
2199 }
2200
2201 virtual _connection_base8<arg1_type, arg2_type, arg3_type, arg4_type,
2202 arg5_type, arg6_type, arg7_type, arg8_type, mt_policy>* duplicate(has_slots_interface* pnewdest)
2203 {
2204 return new _connection8<dest_type, arg1_type, arg2_type, arg3_type, arg4_type,
2205 arg5_type, arg6_type, arg7_type, arg8_type, mt_policy>((dest_type *)pnewdest, m_pmemfun);
2206 }
2207
2208 virtual void emit(arg1_type a1, arg2_type a2, arg3_type a3, arg4_type a4,
2209 arg5_type a5, arg6_type a6, arg7_type a7, arg8_type a8)
2210 {
2211 (m_pobject->*m_pmemfun)(a1, a2, a3, a4, a5, a6, a7, a8);
2212 }
2213
2214 virtual has_slots_interface* getdest() const
2215 {
2216 return m_pobject;
2217 }
2218
2219 private:
2220 dest_type* m_pobject;
2221 void (dest_type::* m_pmemfun)(arg1_type, arg2_type, arg3_type, arg4_type,
2222 arg5_type, arg6_type, arg7_type, arg8_type);
2223 };
2224
2225 template<class mt_policy = SIGSLOT_DEFAULT_MT_POLICY>
2226 class signal0 : public _signal_base0<mt_policy>
2227 {
2228 public:
2229 typedef _signal_base0<mt_policy> base;
2230 typedef typename base::connections_list connections_list;
2231 using base::m_connected_slots;
2232
2233 signal0()
2234 {
2235 ;
2236 }
2237
2238 signal0(const signal0<mt_policy>& s)
2239 : _signal_base0<mt_policy>(s)
2240 {
2241 ;
2242 }
2243
2244 template<class desttype>
2245 void connect(desttype* pclass, void (desttype::*pmemfun)())
2246 {
2247 lock_block<mt_policy> lock(this);
2248 _connection0<desttype, mt_policy>* conn =
2249 new _connection0<desttype, mt_policy>(pclass, pmemfun);
2250 m_connected_slots.push_back(conn);
2251 pclass->signal_connect(this);
2252 }
2253
2254 void emit()
2255 {
2256 lock_block<mt_policy> lock(this);
2257 typename connections_list::const_iterator itNext, it = m_connected_slots.begin();
2258 typename connections_list::const_iterator itEnd = m_connected_slots.end();
2259
2260 while(it != itEnd)
2261 {
2262 itNext = it;
2263 ++itNext;
2264
2265 (*it)->emit();
2266
2267 it = itNext;
2268 }
2269 }
2270
2271 void operator()()
2272 {
2273 lock_block<mt_policy> lock(this);
2274 typename connections_list::const_iterator itNext, it = m_connected_slots.begin();
2275 typename connections_list::const_iterator itEnd = m_connected_slots.end();
2276
2277 while(it != itEnd)
2278 {
2279 itNext = it;
2280 ++itNext;
2281
2282 (*it)->emit();
2283
2284 it = itNext;
2285 }
2286 }
2287 };
2288
2289 template<class arg1_type, class mt_policy = SIGSLOT_DEFAULT_MT_POLICY>
2290 class signal1 : public _signal_base1<arg1_type, mt_policy>
2291 {
2292 public:
2293 typedef _signal_base1<arg1_type, mt_policy> base;
2294 typedef typename base::connections_list connections_list;
2295 using base::m_connected_slots;
2296
2297 signal1()
2298 {
2299 ;
2300 }
2301
2302 signal1(const signal1<arg1_type, mt_policy>& s)
2303 : _signal_base1<arg1_type, mt_policy>(s)
2304 {
2305 ;
2306 }
2307
2308 template<class desttype>
2309 void connect(desttype* pclass, void (desttype::*pmemfun)(arg1_type))
2310 {
2311 lock_block<mt_policy> lock(this);
2312 _connection1<desttype, arg1_type, mt_policy>* conn =
2313 new _connection1<desttype, arg1_type, mt_policy>(pclass, pmemfun);
2314 m_connected_slots.push_back(conn);
2315 pclass->signal_connect(this);
2316 }
2317
2318 void emit(arg1_type a1)
2319 {
2320 lock_block<mt_policy> lock(this);
2321 typename connections_list::const_iterator itNext, it = m_connected_slots.begin();
2322 typename connections_list::const_iterator itEnd = m_connected_slots.end();
2323
2324 while(it != itEnd)
2325 {
2326 itNext = it;
2327 ++itNext;
2328
2329 (*it)->emit(a1);
2330
2331 it = itNext;
2332 }
2333 }
2334
2335 void operator()(arg1_type a1)
2336 {
2337 lock_block<mt_policy> lock(this);
2338 typename connections_list::const_iterator itNext, it = m_connected_slots.begin();
2339 typename connections_list::const_iterator itEnd = m_connected_slots.end();
2340
2341 while(it != itEnd)
2342 {
2343 itNext = it;
2344 ++itNext;
2345
2346 (*it)->emit(a1);
2347
2348 it = itNext;
2349 }
2350 }
2351 };
2352
2353 template<class arg1_type, class arg2_type, class mt_policy = SIGSLOT_DEFAULT_MT_POLICY>
2354 class signal2 : public _signal_base2<arg1_type, arg2_type, mt_policy>
2355 {
2356 public:
2357 typedef _signal_base2<arg1_type, arg2_type, mt_policy> base;
2358 typedef typename base::connections_list connections_list;
2359 using base::m_connected_slots;
2360
2361 signal2()
2362 {
2363 ;
2364 }
2365
2366 signal2(const signal2<arg1_type, arg2_type, mt_policy>& s)
2367 : _signal_base2<arg1_type, arg2_type, mt_policy>(s)
2368 {
2369 ;
2370 }
2371
2372 template<class desttype>
2373 void connect(desttype* pclass, void (desttype::*pmemfun)(arg1_type,
2374 arg2_type))
2375 {
2376 lock_block<mt_policy> lock(this);
2377 _connection2<desttype, arg1_type, arg2_type, mt_policy>* conn = new
2378 _connection2<desttype, arg1_type, arg2_type, mt_policy>(pclass, pmemfun);
2379 m_connected_slots.push_back(conn);
2380 pclass->signal_connect(this);
2381 }
2382
2383 void emit(arg1_type a1, arg2_type a2)
2384 {
2385 lock_block<mt_policy> lock(this);
2386 typename connections_list::const_iterator itNext, it = m_connected_slots.begin();
2387 typename connections_list::const_iterator itEnd = m_connected_slots.end();
2388
2389 while(it != itEnd)
2390 {
2391 itNext = it;
2392 ++itNext;
2393
2394 (*it)->emit(a1, a2);
2395
2396 it = itNext;
2397 }
2398 }
2399
2400 void operator()(arg1_type a1, arg2_type a2)
2401 {
2402 lock_block<mt_policy> lock(this);
2403 typename connections_list::const_iterator itNext, it = m_connected_slots.begin();
2404 typename connections_list::const_iterator itEnd = m_connected_slots.end();
2405
2406 while(it != itEnd)
2407 {
2408 itNext = it;
2409 ++itNext;
2410
2411 (*it)->emit(a1, a2);
2412
2413 it = itNext;
2414 }
2415 }
2416 };
2417
2418 template<class arg1_type, class arg2_type, class arg3_type, class mt_policy = SIGSLOT_DEFAULT_MT_POLICY>
2419 class signal3 : public _signal_base3<arg1_type, arg2_type, arg3_type, mt_policy>
2420 {
2421 public:
2422 typedef _signal_base3<arg1_type, arg2_type, arg3_type, mt_policy> base;
2423 typedef typename base::connections_list connections_list;
2424 using base::m_connected_slots;
2425
2426 signal3()
2427 {
2428 ;
2429 }
2430
2431 signal3(const signal3<arg1_type, arg2_type, arg3_type, mt_policy>& s)
2432 : _signal_base3<arg1_type, arg2_type, arg3_type, mt_policy>(s)
2433 {
2434 ;
2435 }
2436
2437 template<class desttype>
2438 void connect(desttype* pclass, void (desttype::*pmemfun)(arg1_type,
2439 arg2_type, arg3_type))
2440 {
2441 lock_block<mt_policy> lock(this);
2442 _connection3<desttype, arg1_type, arg2_type, arg3_type, mt_policy>* conn =
2443 new _connection3<desttype, arg1_type, arg2_type, arg3_type, mt_policy>(pclass,
2444 pmemfun);
2445 m_connected_slots.push_back(conn);
2446 pclass->signal_connect(this);
2447 }
2448
2449 void emit(arg1_type a1, arg2_type a2, arg3_type a3)
2450 {
2451 lock_block<mt_policy> lock(this);
2452 typename connections_list::const_iterator itNext, it = m_connected_slots.begin();
2453 typename connections_list::const_iterator itEnd = m_connected_slots.end();
2454
2455 while(it != itEnd)
2456 {
2457 itNext = it;
2458 ++itNext;
2459
2460 (*it)->emit(a1, a2, a3);
2461
2462 it = itNext;
2463 }
2464 }
2465
2466 void operator()(arg1_type a1, arg2_type a2, arg3_type a3)
2467 {
2468 lock_block<mt_policy> lock(this);
2469 typename connections_list::const_iterator itNext, it = m_connected_slots.begin();
2470 typename connections_list::const_iterator itEnd = m_connected_slots.end();
2471
2472 while(it != itEnd)
2473 {
2474 itNext = it;
2475 ++itNext;
2476
2477 (*it)->emit(a1, a2, a3);
2478
2479 it = itNext;
2480 }
2481 }
2482 };
2483
2484 template<class arg1_type, class arg2_type, class arg3_type, class arg4_type, class mt_policy = SIGSLOT_DEFAULT_MT_POLICY>
2485 class signal4 : public _signal_base4<arg1_type, arg2_type, arg3_type,
2486 arg4_type, mt_policy>
2487 {
2488 public:
2489 typedef _signal_base4<arg1_type, arg2_type, arg3_type, arg4_type, mt_policy> base;
2490 typedef typename base::connections_list connections_list;
2491 using base::m_connected_slots;
2492
2493 signal4()
2494 {
2495 ;
2496 }
2497
2498 signal4(const signal4<arg1_type, arg2_type, arg3_type, arg4_type, mt_policy>& s)
2499 : _signal_base4<arg1_type, arg2_type, arg3_type, arg4_type, mt_policy>(s)
2500 {
2501 ;
2502 }
2503
2504 template<class desttype>
2505 void connect(desttype* pclass, void (desttype::*pmemfun)(arg1_type,
2506 arg2_type, arg3_type, arg4_type))
2507 {
2508 lock_block<mt_policy> lock(this);
2509 _connection4<desttype, arg1_type, arg2_type, arg3_type, arg4_type, mt_policy>*
2510 conn = new _connection4<desttype, arg1_type, arg2_type, arg3_type,
2511 arg4_type, mt_policy>(pclass, pmemfun);
2512 m_connected_slots.push_back(conn);
2513 pclass->signal_connect(this);
2514 }
2515
2516 void emit(arg1_type a1, arg2_type a2, arg3_type a3, arg4_type a4)
2517 {
2518 lock_block<mt_policy> lock(this);
2519 typename connections_list::const_iterator itNext, it = m_connected_slots.begin();
2520 typename connections_list::const_iterator itEnd = m_connected_slots.end();
2521
2522 while(it != itEnd)
2523 {
2524 itNext = it;
2525 ++itNext;
2526
2527 (*it)->emit(a1, a2, a3, a4);
2528
2529 it = itNext;
2530 }
2531 }
2532
2533 void operator()(arg1_type a1, arg2_type a2, arg3_type a3, arg4_type a4)
2534 {
2535 lock_block<mt_policy> lock(this);
2536 typename connections_list::const_iterator itNext, it = m_connected_slots.begin();
2537 typename connections_list::const_iterator itEnd = m_connected_slots.end();
2538
2539 while(it != itEnd)
2540 {
2541 itNext = it;
2542 ++itNext;
2543
2544 (*it)->emit(a1, a2, a3, a4);
2545
2546 it = itNext;
2547 }
2548 }
2549 };
2550
2551 template<class arg1_type, class arg2_type, class arg3_type, class arg4_type,
2552 class arg5_type, class mt_policy = SIGSLOT_DEFAULT_MT_POLICY>
2553 class signal5 : public _signal_base5<arg1_type, arg2_type, arg3_type,
2554 arg4_type, arg5_type, mt_policy>
2555 {
2556 public:
2557 typedef _signal_base5<arg1_type, arg2_type, arg3_type, arg4_type, arg5_type, mt_policy> base;
2558 typedef typename base::connections_list connections_list;
2559 using base::m_connected_slots;
2560
2561 signal5()
2562 {
2563 ;
2564 }
2565
2566 signal5(const signal5<arg1_type, arg2_type, arg3_type, arg4_type,
2567 arg5_type, mt_policy>& s)
2568 : _signal_base5<arg1_type, arg2_type, arg3_type, arg4_type,
2569 arg5_type, mt_policy>(s)
2570 {
2571 ;
2572 }
2573
2574 template<class desttype>
2575 void connect(desttype* pclass, void (desttype::*pmemfun)(arg1_type,
2576 arg2_type, arg3_type, arg4_type, arg5_type))
2577 {
2578 lock_block<mt_policy> lock(this);
2579 _connection5<desttype, arg1_type, arg2_type, arg3_type, arg4_type,
2580 arg5_type, mt_policy>* conn = new _connection5<desttype, arg1_type, arg2_type,
2581 arg3_type, arg4_type, arg5_type, mt_policy>(pclass, pmemfun);
2582 m_connected_slots.push_back(conn);
2583 pclass->signal_connect(this);
2584 }
2585
2586 void emit(arg1_type a1, arg2_type a2, arg3_type a3, arg4_type a4,
2587 arg5_type a5)
2588 {
2589 lock_block<mt_policy> lock(this);
2590 typename connections_list::const_iterator itNext, it = m_connected_slots.begin();
2591 typename connections_list::const_iterator itEnd = m_connected_slots.end();
2592
2593 while(it != itEnd)
2594 {
2595 itNext = it;
2596 ++itNext;
2597
2598 (*it)->emit(a1, a2, a3, a4, a5);
2599
2600 it = itNext;
2601 }
2602 }
2603
2604 void operator()(arg1_type a1, arg2_type a2, arg3_type a3, arg4_type a4,
2605 arg5_type a5)
2606 {
2607 lock_block<mt_policy> lock(this);
2608 typename connections_list::const_iterator itNext, it = m_connected_slots.begin();
2609 typename connections_list::const_iterator itEnd = m_connected_slots.end();
2610
2611 while(it != itEnd)
2612 {
2613 itNext = it;
2614 ++itNext;
2615
2616 (*it)->emit(a1, a2, a3, a4, a5);
2617
2618 it = itNext;
2619 }
2620 }
2621 };
2622
2623
2624 template<class arg1_type, class arg2_type, class arg3_type, class arg4_type,
2625 class arg5_type, class arg6_type, class mt_policy = SIGSLOT_DEFAULT_MT_POLICY>
2626 class signal6 : public _signal_base6<arg1_type, arg2_type, arg3_type,
2627 arg4_type, arg5_type, arg6_type, mt_policy>
2628 {
2629 public:
2630 typedef _signal_base6<arg1_type, arg2_type, arg3_type, arg4_type, arg5_type, arg6_type, mt_policy> base;
2631 typedef typename base::connections_list connections_list;
2632 using base::m_connected_slots;
2633
2634 signal6()
2635 {
2636 ;
2637 }
2638
2639 signal6(const signal6<arg1_type, arg2_type, arg3_type, arg4_type,
2640 arg5_type, arg6_type, mt_policy>& s)
2641 : _signal_base6<arg1_type, arg2_type, arg3_type, arg4_type,
2642 arg5_type, arg6_type, mt_policy>(s)
2643 {
2644 ;
2645 }
2646
2647 template<class desttype>
2648 void connect(desttype* pclass, void (desttype::*pmemfun)(arg1_type,
2649 arg2_type, arg3_type, arg4_type, arg5_type, arg6_type))
2650 {
2651 lock_block<mt_policy> lock(this);
2652 _connection6<desttype, arg1_type, arg2_type, arg3_type, arg4_type,
2653 arg5_type, arg6_type, mt_policy>* conn =
2654 new _connection6<desttype, arg1_type, arg2_type, arg3_type,
2655 arg4_type, arg5_type, arg6_type, mt_policy>(pclass, pmemfun);
2656 m_connected_slots.push_back(conn);
2657 pclass->signal_connect(this);
2658 }
2659
2660 void emit(arg1_type a1, arg2_type a2, arg3_type a3, arg4_type a4,
2661 arg5_type a5, arg6_type a6)
2662 {
2663 lock_block<mt_policy> lock(this);
2664 typename connections_list::const_iterator itNext, it = m_connected_slots.begin();
2665 typename connections_list::const_iterator itEnd = m_connected_slots.end();
2666
2667 while(it != itEnd)
2668 {
2669 itNext = it;
2670 ++itNext;
2671
2672 (*it)->emit(a1, a2, a3, a4, a5, a6);
2673
2674 it = itNext;
2675 }
2676 }
2677
2678 void operator()(arg1_type a1, arg2_type a2, arg3_type a3, arg4_type a4,
2679 arg5_type a5, arg6_type a6)
2680 {
2681 lock_block<mt_policy> lock(this);
2682 typename connections_list::const_iterator itNext, it = m_connected_slots.begin();
2683 typename connections_list::const_iterator itEnd = m_connected_slots.end();
2684
2685 while(it != itEnd)
2686 {
2687 itNext = it;
2688 ++itNext;
2689
2690 (*it)->emit(a1, a2, a3, a4, a5, a6);
2691
2692 it = itNext;
2693 }
2694 }
2695 };
2696
2697 template<class arg1_type, class arg2_type, class arg3_type, class arg4_type,
2698 class arg5_type, class arg6_type, class arg7_type, class mt_policy = SIGSLOT_DEFAULT_MT_POLICY>
2699 class signal7 : public _signal_base7<arg1_type, arg2_type, arg3_type,
2700 arg4_type, arg5_type, arg6_type, arg7_type, mt_policy>
2701 {
2702 public:
2703 typedef _signal_base7<arg1_type, arg2_type, arg3_type, arg4_type,
2704 arg5_type, arg6_type, arg7_type, mt_policy> base;
2705 typedef typename base::connections_list connections_list;
2706 using base::m_connected_slots;
2707
2708 signal7()
2709 {
2710 ;
2711 }
2712
2713 signal7(const signal7<arg1_type, arg2_type, arg3_type, arg4_type,
2714 arg5_type, arg6_type, arg7_type, mt_policy>& s)
2715 : _signal_base7<arg1_type, arg2_type, arg3_type, arg4_type,
2716 arg5_type, arg6_type, arg7_type, mt_policy>(s)
2717 {
2718 ;
2719 }
2720
2721 template<class desttype>
2722 void connect(desttype* pclass, void (desttype::*pmemfun)(arg1_type,
2723 arg2_type, arg3_type, arg4_type, arg5_type, arg6_type,
2724 arg7_type))
2725 {
2726 lock_block<mt_policy> lock(this);
2727 _connection7<desttype, arg1_type, arg2_type, arg3_type, arg4_type,
2728 arg5_type, arg6_type, arg7_type, mt_policy>* conn =
2729 new _connection7<desttype, arg1_type, arg2_type, arg3_type,
2730 arg4_type, arg5_type, arg6_type, arg7_type, mt_policy>(pclass, pmemfun);
2731 m_connected_slots.push_back(conn);
2732 pclass->signal_connect(this);
2733 }
2734
2735 void emit(arg1_type a1, arg2_type a2, arg3_type a3, arg4_type a4,
2736 arg5_type a5, arg6_type a6, arg7_type a7)
2737 {
2738 lock_block<mt_policy> lock(this);
2739 typename connections_list::const_iterator itNext, it = m_connected_slots.begin();
2740 typename connections_list::const_iterator itEnd = m_connected_slots.end();
2741
2742 while(it != itEnd)
2743 {
2744 itNext = it;
2745 ++itNext;
2746
2747 (*it)->emit(a1, a2, a3, a4, a5, a6, a7);
2748
2749 it = itNext;
2750 }
2751 }
2752
2753 void operator()(arg1_type a1, arg2_type a2, arg3_type a3, arg4_type a4,
2754 arg5_type a5, arg6_type a6, arg7_type a7)
2755 {
2756 lock_block<mt_policy> lock(this);
2757 typename connections_list::const_iterator itNext, it = m_connected_slots.begin();
2758 typename connections_list::const_iterator itEnd = m_connected_slots.end();
2759
2760 while(it != itEnd)
2761 {
2762 itNext = it;
2763 ++itNext;
2764
2765 (*it)->emit(a1, a2, a3, a4, a5, a6, a7);
2766
2767 it = itNext;
2768 }
2769 }
2770 };
2771
2772 template<class arg1_type, class arg2_type, class arg3_type, class arg4_type,
2773 class arg5_type, class arg6_type, class arg7_type, class arg8_type, class mt_policy = SIGSLOT_DEFAULT_MT_POLICY>
2774 class signal8 : public _signal_base8<arg1_type, arg2_type, arg3_type,
2775 arg4_type, arg5_type, arg6_type, arg7_type, arg8_type, mt_policy>
2776 {
2777 public:
2778 typedef _signal_base8<arg1_type, arg2_type, arg3_type, arg4_type,
2779 arg5_type, arg6_type, arg7_type, arg8_type, mt_policy> base;
2780 typedef typename base::connections_list connections_list;
2781 using base::m_connected_slots;
2782
2783 signal8()
2784 {
2785 ;
2786 }
2787
2788 signal8(const signal8<arg1_type, arg2_type, arg3_type, arg4_type,
2789 arg5_type, arg6_type, arg7_type, arg8_type, mt_policy>& s)
2790 : _signal_base8<arg1_type, arg2_type, arg3_type, arg4_type,
2791 arg5_type, arg6_type, arg7_type, arg8_type, mt_policy>(s)
2792 {
2793 ;
2794 }
2795
2796 template<class desttype>
2797 void connect(desttype* pclass, void (desttype::*pmemfun)(arg1_type,
2798 arg2_type, arg3_type, arg4_type, arg5_type, arg6_type,
2799 arg7_type, arg8_type))
2800 {
2801 lock_block<mt_policy> lock(this);
2802 _connection8<desttype, arg1_type, arg2_type, arg3_type, arg4_type,
2803 arg5_type, arg6_type, arg7_type, arg8_type, mt_policy>* conn =
2804 new _connection8<desttype, arg1_type, arg2_type, arg3_type,
2805 arg4_type, arg5_type, arg6_type, arg7_type,
2806 arg8_type, mt_policy>(pclass, pmemfun);
2807 m_connected_slots.push_back(conn);
2808 pclass->signal_connect(this);
2809 }
2810
2811 void emit(arg1_type a1, arg2_type a2, arg3_type a3, arg4_type a4,
2812 arg5_type a5, arg6_type a6, arg7_type a7, arg8_type a8)
2813 {
2814 lock_block<mt_policy> lock(this);
2815 typename connections_list::const_iterator itNext, it = m_connected_slots.begin();
2816 typename connections_list::const_iterator itEnd = m_connected_slots.end();
2817
2818 while(it != itEnd)
2819 {
2820 itNext = it;
2821 ++itNext;
2822
2823 (*it)->emit(a1, a2, a3, a4, a5, a6, a7, a8);
2824
2825 it = itNext;
2826 }
2827 }
2828
2829 void operator()(arg1_type a1, arg2_type a2, arg3_type a3, arg4_type a4,
2830 arg5_type a5, arg6_type a6, arg7_type a7, arg8_type a8)
2831 {
2832 lock_block<mt_policy> lock(this);
2833 typename connections_list::const_iterator itNext, it = m_connected_slots.begin();
2834 typename connections_list::const_iterator itEnd = m_connected_slots.end();
2835
2836 while(it != itEnd)
2837 {
2838 itNext = it;
2839 ++itNext;
2840
2841 (*it)->emit(a1, a2, a3, a4, a5, a6, a7, a8);
2842
2843 it = itNext;
2844 }
2845 }
2846 };
2847
2848}; // namespace sigslot
2849
2850#endif // WEBRTC_BASE_SIGSLOT_H__