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