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