Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(80)

Side by Side Diff: webrtc/base/sigslot.h

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

Powered by Google App Engine
This is Rietveld 408576698