• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // 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 WIN32 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 TALK_BASE_SIGSLOT_H__
88 #define TALK_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(WIN32) && !defined(__GNUG__) && !defined(SIGSLOT_USE_POSIX_THREADS))
98 #	define _SIGSLOT_SINGLE_THREADED
99 #elif defined(WIN32)
100 #	define _SIGSLOT_HAS_WIN32_THREADS
101 #	if !defined(WIN32_LEAN_AND_MEAN)
102 #		define WIN32_LEAN_AND_MEAN
103 #	endif
104 #	include "talk/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 talk_base?
121 namespace sigslot {
122 
123 	class single_threaded
124 	{
125 	public:
single_threaded()126 		single_threaded()
127 		{
128 			;
129 		}
130 
~single_threaded()131 		virtual ~single_threaded()
132 		{
133 			;
134 		}
135 
lock()136 		virtual void lock()
137 		{
138 			;
139 		}
140 
unlock()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:
multi_threaded_global()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 
multi_threaded_global(const multi_threaded_global &)163 		multi_threaded_global(const multi_threaded_global&)
164 		{
165 			;
166 		}
167 
~multi_threaded_global()168 		virtual ~multi_threaded_global()
169 		{
170 			;
171 		}
172 
lock()173 		virtual void lock()
174 		{
175 			EnterCriticalSection(get_critsec());
176 		}
177 
unlock()178 		virtual void unlock()
179 		{
180 			LeaveCriticalSection(get_critsec());
181 		}
182 
183 	private:
get_critsec()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:
multi_threaded_local()194 		multi_threaded_local()
195 		{
196 			InitializeCriticalSection(&m_critsec);
197 		}
198 
multi_threaded_local(const multi_threaded_local &)199 		multi_threaded_local(const multi_threaded_local&)
200 		{
201 			InitializeCriticalSection(&m_critsec);
202 		}
203 
~multi_threaded_local()204 		virtual ~multi_threaded_local()
205 		{
206 			DeleteCriticalSection(&m_critsec);
207 		}
208 
lock()209 		virtual void lock()
210 		{
211 			EnterCriticalSection(&m_critsec);
212 		}
213 
unlock()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:
multi_threaded_global()229 		multi_threaded_global()
230 		{
231 			pthread_mutex_init(get_mutex(), NULL);
232 		}
233 
multi_threaded_global(const multi_threaded_global &)234 		multi_threaded_global(const multi_threaded_global&)
235 		{
236 			;
237 		}
238 
~multi_threaded_global()239 		virtual ~multi_threaded_global()
240 		{
241 			;
242 		}
243 
lock()244 		virtual void lock()
245 		{
246 			pthread_mutex_lock(get_mutex());
247 		}
248 
unlock()249 		virtual void unlock()
250 		{
251 			pthread_mutex_unlock(get_mutex());
252 		}
253 
254 	private:
get_mutex()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:
multi_threaded_local()265 		multi_threaded_local()
266 		{
267 			pthread_mutex_init(&m_mutex, NULL);
268 		}
269 
multi_threaded_local(const multi_threaded_local &)270 		multi_threaded_local(const multi_threaded_local&)
271 		{
272 			pthread_mutex_init(&m_mutex, NULL);
273 		}
274 
~multi_threaded_local()275 		virtual ~multi_threaded_local()
276 		{
277 			pthread_mutex_destroy(&m_mutex);
278 		}
279 
lock()280 		virtual void lock()
281 		{
282 			pthread_mutex_lock(&m_mutex);
283 		}
284 
unlock()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 
lock_block(mt_policy * mtx)301 		lock_block(mt_policy *mtx)
302 			: m_mutex(mtx)
303 		{
304 			m_mutex->lock();
305 		}
306 
~lock_block()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:
~_connection_base0()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:
~_connection_base1()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:
~_connection_base2()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:
~_connection_base3()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:
~_connection_base4()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:
~_connection_base5()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:
~_connection_base6()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:
~_connection_base7()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:
~_connection_base8()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:
has_slots_interface()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 
~has_slots_interface()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:
has_slots()469 		has_slots()
470 		{
471 			;
472 		}
473 
has_slots(const has_slots & hs)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 
signal_connect(_signal_base_interface * sender)488 		void signal_connect(_signal_base_interface* sender)
489 		{
490 			lock_block<mt_policy> lock(this);
491 			m_senders.insert(sender);
492 		}
493 
signal_disconnect(_signal_base_interface * sender)494 		void signal_disconnect(_signal_base_interface* sender)
495 		{
496 			lock_block<mt_policy> lock(this);
497 			m_senders.erase(sender);
498 		}
499 
~has_slots()500 		virtual ~has_slots()
501 		{
502 			disconnect_all();
503 		}
504 
disconnect_all()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 
_signal_base0()530 		_signal_base0()
531 		{
532 			;
533 		}
534 
_signal_base0(const _signal_base0 & s)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 
~_signal_base0()551 		~_signal_base0()
552 		{
553 			disconnect_all();
554 		}
555 
is_empty()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 
disconnect_all()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
connected(has_slots_interface * pclass)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 
disconnect(has_slots_interface * pclass)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 
slot_disconnect(has_slots_interface * pslot)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 
slot_duplicate(const has_slots_interface * oldtarget,has_slots_interface * newtarget)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 
_signal_base1()667 		_signal_base1()
668 		{
669 			;
670 		}
671 
_signal_base1(const _signal_base1<arg1_type,mt_policy> & s)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 
slot_duplicate(const has_slots_interface * oldtarget,has_slots_interface * newtarget)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 
~_signal_base1()705 		~_signal_base1()
706 		{
707 			disconnect_all();
708 		}
709 
is_empty()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 
disconnect_all()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
connected(has_slots_interface * pclass)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 
disconnect(has_slots_interface * pclass)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 
slot_disconnect(has_slots_interface * pslot)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 
_signal_base2()806 		_signal_base2()
807 		{
808 			;
809 		}
810 
_signal_base2(const _signal_base2<arg1_type,arg2_type,mt_policy> & s)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 
slot_duplicate(const has_slots_interface * oldtarget,has_slots_interface * newtarget)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 
~_signal_base2()844 		~_signal_base2()
845 		{
846 			disconnect_all();
847 		}
848 
is_empty()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 
disconnect_all()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
connected(has_slots_interface * pclass)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 
disconnect(has_slots_interface * pclass)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 
slot_disconnect(has_slots_interface * pslot)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 
_signal_base3()944 		_signal_base3()
945 		{
946 			;
947 		}
948 
_signal_base3(const _signal_base3<arg1_type,arg2_type,arg3_type,mt_policy> & s)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 
slot_duplicate(const has_slots_interface * oldtarget,has_slots_interface * newtarget)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 
~_signal_base3()982 		~_signal_base3()
983 		{
984 			disconnect_all();
985 		}
986 
is_empty()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 
disconnect_all()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
connected(has_slots_interface * pclass)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 
disconnect(has_slots_interface * pclass)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 
slot_disconnect(has_slots_interface * pslot)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 
_signal_base4()1082 		_signal_base4()
1083 		{
1084 			;
1085 		}
1086 
_signal_base4(const _signal_base4<arg1_type,arg2_type,arg3_type,arg4_type,mt_policy> & s)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 
slot_duplicate(const has_slots_interface * oldtarget,has_slots_interface * newtarget)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 
~_signal_base4()1120 		~_signal_base4()
1121 		{
1122 			disconnect_all();
1123 		}
1124 
is_empty()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 
disconnect_all()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
connected(has_slots_interface * pclass)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 
disconnect(has_slots_interface * pclass)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 
slot_disconnect(has_slots_interface * pslot)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 
_signal_base5()1221 		_signal_base5()
1222 		{
1223 			;
1224 		}
1225 
_signal_base5(const _signal_base5<arg1_type,arg2_type,arg3_type,arg4_type,arg5_type,mt_policy> & s)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 
slot_duplicate(const has_slots_interface * oldtarget,has_slots_interface * newtarget)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 
~_signal_base5()1260 		~_signal_base5()
1261 		{
1262 			disconnect_all();
1263 		}
1264 
is_empty()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 
disconnect_all()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
connected(has_slots_interface * pclass)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 
disconnect(has_slots_interface * pclass)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 
slot_disconnect(has_slots_interface * pslot)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 
_signal_base6()1361 		_signal_base6()
1362 		{
1363 			;
1364 		}
1365 
_signal_base6(const _signal_base6<arg1_type,arg2_type,arg3_type,arg4_type,arg5_type,arg6_type,mt_policy> & s)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 
slot_duplicate(const has_slots_interface * oldtarget,has_slots_interface * newtarget)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 
~_signal_base6()1400 		~_signal_base6()
1401 		{
1402 			disconnect_all();
1403 		}
1404 
is_empty()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 
disconnect_all()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
connected(has_slots_interface * pclass)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 
disconnect(has_slots_interface * pclass)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 
slot_disconnect(has_slots_interface * pslot)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 
_signal_base7()1501 		_signal_base7()
1502 		{
1503 			;
1504 		}
1505 
_signal_base7(const _signal_base7<arg1_type,arg2_type,arg3_type,arg4_type,arg5_type,arg6_type,arg7_type,mt_policy> & s)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 
slot_duplicate(const has_slots_interface * oldtarget,has_slots_interface * newtarget)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 
~_signal_base7()1540 		~_signal_base7()
1541 		{
1542 			disconnect_all();
1543 		}
1544 
is_empty()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 
disconnect_all()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
connected(has_slots_interface * pclass)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 
disconnect(has_slots_interface * pclass)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 
slot_disconnect(has_slots_interface * pslot)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 
_signal_base8()1642 		_signal_base8()
1643 		{
1644 			;
1645 		}
1646 
_signal_base8(const _signal_base8<arg1_type,arg2_type,arg3_type,arg4_type,arg5_type,arg6_type,arg7_type,arg8_type,mt_policy> & s)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 
slot_duplicate(const has_slots_interface * oldtarget,has_slots_interface * newtarget)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 
~_signal_base8()1681 		~_signal_base8()
1682 		{
1683 			disconnect_all();
1684 		}
1685 
is_empty()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 
disconnect_all()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
connected(has_slots_interface * pclass)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 
disconnect(has_slots_interface * pclass)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 
slot_disconnect(has_slots_interface * pslot)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:
_connection0()1779 		_connection0()
1780 		{
1781 			m_pobject = NULL;
1782 			m_pmemfun = NULL;
1783 		}
1784 
_connection0(dest_type * pobject,void (dest_type::* pmemfun)())1785 		_connection0(dest_type* pobject, void (dest_type::*pmemfun)())
1786 		{
1787 			m_pobject = pobject;
1788 			m_pmemfun = pmemfun;
1789 		}
1790 
~_connection0()1791 		virtual ~_connection0()
1792 		{
1793                 }
1794 
clone()1795 		virtual _connection_base0<mt_policy>* clone()
1796 		{
1797 			return new _connection0<dest_type, mt_policy>(*this);
1798 		}
1799 
duplicate(has_slots_interface * pnewdest)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 
emit()1805 		virtual void emit()
1806 		{
1807 			(m_pobject->*m_pmemfun)();
1808 		}
1809 
getdest()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:
_connection1()1824 		_connection1()
1825 		{
1826 			m_pobject = NULL;
1827 			m_pmemfun = NULL;
1828 		}
1829 
_connection1(dest_type * pobject,void (dest_type::* pmemfun)(arg1_type))1830 		_connection1(dest_type* pobject, void (dest_type::*pmemfun)(arg1_type))
1831 		{
1832 			m_pobject = pobject;
1833 			m_pmemfun = pmemfun;
1834 		}
1835 
~_connection1()1836 		virtual ~_connection1()
1837 		{
1838                 }
1839 
clone()1840 		virtual _connection_base1<arg1_type, mt_policy>* clone()
1841 		{
1842 			return new _connection1<dest_type, arg1_type, mt_policy>(*this);
1843 		}
1844 
duplicate(has_slots_interface * pnewdest)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 
emit(arg1_type a1)1850 		virtual void emit(arg1_type a1)
1851 		{
1852 			(m_pobject->*m_pmemfun)(a1);
1853 		}
1854 
getdest()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:
_connection2()1869 		_connection2()
1870 		{
1871 			m_pobject = NULL;
1872 			m_pmemfun = NULL;
1873 		}
1874 
_connection2(dest_type * pobject,void (dest_type::* pmemfun)(arg1_type,arg2_type))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 
~_connection2()1882 		virtual ~_connection2()
1883 		{
1884                 }
1885 
clone()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 
duplicate(has_slots_interface * pnewdest)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 
emit(arg1_type a1,arg2_type a2)1896 		virtual void emit(arg1_type a1, arg2_type a2)
1897 		{
1898 			(m_pobject->*m_pmemfun)(a1, a2);
1899 		}
1900 
getdest()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:
_connection3()1915 		_connection3()
1916 		{
1917 			m_pobject = NULL;
1918 			m_pmemfun = NULL;
1919 		}
1920 
_connection3(dest_type * pobject,void (dest_type::* pmemfun)(arg1_type,arg2_type,arg3_type))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 
~_connection3()1928 		virtual ~_connection3()
1929 		{
1930                 }
1931 
clone()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 
duplicate(has_slots_interface * pnewdest)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 
emit(arg1_type a1,arg2_type a2,arg3_type a3)1942 		virtual void emit(arg1_type a1, arg2_type a2, arg3_type a3)
1943 		{
1944 			(m_pobject->*m_pmemfun)(a1, a2, a3);
1945 		}
1946 
getdest()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:
_connection4()1963 		_connection4()
1964 		{
1965 			m_pobject = NULL;
1966 			m_pmemfun = NULL;
1967 		}
1968 
_connection4(dest_type * pobject,void (dest_type::* pmemfun)(arg1_type,arg2_type,arg3_type,arg4_type))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 
~_connection4()1976 		virtual ~_connection4()
1977 		{
1978                 }
1979 
clone()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 
duplicate(has_slots_interface * pnewdest)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 
emit(arg1_type a1,arg2_type a2,arg3_type a3,arg4_type a4)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 
getdest()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:
_connection5()2013 		_connection5()
2014 		{
2015 			m_pobject = NULL;
2016 			m_pmemfun = NULL;
2017 		}
2018 
_connection5(dest_type * pobject,void (dest_type::* pmemfun)(arg1_type,arg2_type,arg3_type,arg4_type,arg5_type))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 
~_connection5()2026 		virtual ~_connection5()
2027 		{
2028                 }
2029 
2030 		virtual _connection_base5<arg1_type, arg2_type, arg3_type, arg4_type,
clone()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,
duplicate(has_slots_interface * pnewdest)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 
emit(arg1_type a1,arg2_type a2,arg3_type a3,arg4_type a4,arg5_type a5)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 
getdest()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:
_connection6()2067 		_connection6()
2068 		{
2069 			m_pobject = NULL;
2070 			m_pmemfun = NULL;
2071 		}
2072 
_connection6(dest_type * pobject,void (dest_type::* pmemfun)(arg1_type,arg2_type,arg3_type,arg4_type,arg5_type,arg6_type))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 
~_connection6()2080 		virtual ~_connection6()
2081 		{
2082                 }
2083 
2084 		virtual _connection_base6<arg1_type, arg2_type, arg3_type, arg4_type,
clone()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,
duplicate(has_slots_interface * pnewdest)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 
emit(arg1_type a1,arg2_type a2,arg3_type a3,arg4_type a4,arg5_type a5,arg6_type a6)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 
getdest()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:
_connection7()2121 		_connection7()
2122 		{
2123 			m_pobject = NULL;
2124 			m_pmemfun = NULL;
2125 		}
2126 
_connection7(dest_type * pobject,void (dest_type::* pmemfun)(arg1_type,arg2_type,arg3_type,arg4_type,arg5_type,arg6_type,arg7_type))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 
~_connection7()2134 		virtual ~_connection7()
2135 		{
2136                 }
2137 
2138 		virtual _connection_base7<arg1_type, arg2_type, arg3_type, arg4_type,
clone()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,
duplicate(has_slots_interface * pnewdest)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 
emit(arg1_type a1,arg2_type a2,arg3_type a3,arg4_type a4,arg5_type a5,arg6_type a6,arg7_type a7)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 
getdest()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:
_connection8()2176 		_connection8()
2177 		{
2178 			m_pobject = NULL;
2179 			m_pmemfun = NULL;
2180 		}
2181 
_connection8(dest_type * pobject,void (dest_type::* pmemfun)(arg1_type,arg2_type,arg3_type,arg4_type,arg5_type,arg6_type,arg7_type,arg8_type))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 
~_connection8()2190 		virtual ~_connection8()
2191 		{
2192                 }
2193 
2194 		virtual _connection_base8<arg1_type, arg2_type, arg3_type, arg4_type,
clone()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,
duplicate(has_slots_interface * pnewdest)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 
emit(arg1_type a1,arg2_type a2,arg3_type a3,arg4_type a4,arg5_type a5,arg6_type a6,arg7_type a7,arg8_type a8)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 
getdest()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 
signal0()2233 		signal0()
2234 		{
2235 			;
2236 		}
2237 
signal0(const signal0<mt_policy> & s)2238 		signal0(const signal0<mt_policy>& s)
2239 			: _signal_base0<mt_policy>(s)
2240 		{
2241 			;
2242 		}
2243 
2244 		template<class desttype>
connect(desttype * pclass,void (desttype::* pmemfun)())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 
emit()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 
operator()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 
signal1()2297 		signal1()
2298 		{
2299 			;
2300 		}
2301 
signal1(const signal1<arg1_type,mt_policy> & s)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>
connect(desttype * pclass,void (desttype::* pmemfun)(arg1_type))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 
emit(arg1_type a1)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 
operator()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 
signal2()2361 		signal2()
2362 		{
2363 			;
2364 		}
2365 
signal2(const signal2<arg1_type,arg2_type,mt_policy> & s)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>
connect(desttype * pclass,void (desttype::* pmemfun)(arg1_type,arg2_type))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 
emit(arg1_type a1,arg2_type a2)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 
operator()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 
signal3()2426 		signal3()
2427 		{
2428 			;
2429 		}
2430 
signal3(const signal3<arg1_type,arg2_type,arg3_type,mt_policy> & s)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>
connect(desttype * pclass,void (desttype::* pmemfun)(arg1_type,arg2_type,arg3_type))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 
emit(arg1_type a1,arg2_type a2,arg3_type a3)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 
operator()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 
signal4()2493 		signal4()
2494 		{
2495 			;
2496 		}
2497 
signal4(const signal4<arg1_type,arg2_type,arg3_type,arg4_type,mt_policy> & s)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>
connect(desttype * pclass,void (desttype::* pmemfun)(arg1_type,arg2_type,arg3_type,arg4_type))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 
emit(arg1_type a1,arg2_type a2,arg3_type a3,arg4_type a4)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 
operator()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 
signal5()2561 		signal5()
2562 		{
2563 			;
2564 		}
2565 
signal5(const signal5<arg1_type,arg2_type,arg3_type,arg4_type,arg5_type,mt_policy> & s)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>
connect(desttype * pclass,void (desttype::* pmemfun)(arg1_type,arg2_type,arg3_type,arg4_type,arg5_type))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 
emit(arg1_type a1,arg2_type a2,arg3_type a3,arg4_type a4,arg5_type a5)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 
operator()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 
signal6()2634 		signal6()
2635 		{
2636 			;
2637 		}
2638 
signal6(const signal6<arg1_type,arg2_type,arg3_type,arg4_type,arg5_type,arg6_type,mt_policy> & s)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>
connect(desttype * pclass,void (desttype::* pmemfun)(arg1_type,arg2_type,arg3_type,arg4_type,arg5_type,arg6_type))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 
emit(arg1_type a1,arg2_type a2,arg3_type a3,arg4_type a4,arg5_type a5,arg6_type a6)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 
operator()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 
signal7()2708 		signal7()
2709 		{
2710 			;
2711 		}
2712 
signal7(const signal7<arg1_type,arg2_type,arg3_type,arg4_type,arg5_type,arg6_type,arg7_type,mt_policy> & s)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>
connect(desttype * pclass,void (desttype::* pmemfun)(arg1_type,arg2_type,arg3_type,arg4_type,arg5_type,arg6_type,arg7_type))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 
emit(arg1_type a1,arg2_type a2,arg3_type a3,arg4_type a4,arg5_type a5,arg6_type a6,arg7_type a7)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 
operator()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 
signal8()2783 		signal8()
2784 		{
2785 			;
2786 		}
2787 
signal8(const signal8<arg1_type,arg2_type,arg3_type,arg4_type,arg5_type,arg6_type,arg7_type,arg8_type,mt_policy> & s)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>
connect(desttype * pclass,void (desttype::* pmemfun)(arg1_type,arg2_type,arg3_type,arg4_type,arg5_type,arg6_type,arg7_type,arg8_type))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 
emit(arg1_type a1,arg2_type a2,arg3_type a3,arg4_type a4,arg5_type a5,arg6_type a6,arg7_type a7,arg8_type a8)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 
operator()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 // TALK_BASE_SIGSLOT_H__
2851