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