00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef mitkMessageHIncluded
00019 #define mitkMessageHIncluded
00020
00021 #include <vector>
00022 #include <itkSimpleFastMutexLock.h>
00023
00028 #define mitkNewMessageMacro(msgHandleObject) \
00029 private: ::mitk::Message<> m_##msgHandleObject##Message; \
00030 public: \
00031 inline void Add##msgHandleObject##Listener(const ::mitk::MessageAbstractDelegate<>& delegate) \
00032 { m_##msgHandleObject##Message += delegate; } \
00033 inline void Remove##msgHandleObject##Listener(const ::mitk::MessageAbstractDelegate<>& delegate) \
00034 { m_##msgHandleObject##Message -= delegate; } \
00035
00036
00037 #define mitkNewMessageWithReturnMacro(msgHandleObject, returnType) \
00038 private: ::mitk::Message<returnType> m_##msgHandleObject##Message; \
00039 public: \
00040 inline void Add##msgHandleObject##Listener(const ::mitk::MessageAbstractDelegate<returnType>& delegate) \
00041 { m_##msgHandleObject##Message += delegate; } \
00042 inline void Remove##msgHandleObject##Listener(const ::mitk::MessageAbstractDelegate<returnType>& delegate) \
00043 { m_##msgHandleObject##Message -= delegate; } \
00044
00045
00046 #define mitkNewMessage1Macro(msgHandleObject, type1) \
00047 private: ::mitk::Message1< type1 > m_##msgHandleObject##Message; \
00048 public: \
00049 void Add##msgHandleObject##Listener(const ::mitk::MessageAbstractDelegate1< type1 >& delegate) \
00050 { m_##msgHandleObject##Message += delegate; } \
00051 void Remove##msgHandleObject##Listener(const ::mitk::MessageAbstractDelegate1< type1 >& delegate) \
00052 { m_##msgHandleObject##Message -= delegate; }
00053
00054 #define mitkNewMessage2Macro(msgHandleObject, type1, type2) \
00055 private: ::mitk::Message2< type1, type2 > m_##msgHandleObject##Message; \
00056 public: \
00057 void Add##msgHandleObject##Listener(const ::mitk::MessageAbstractDelegate2< type1, type2 >& delegate) \
00058 { m_##msgHandleObject##Message += delegate; } \
00059 void Remove##msgHandleObject##Listener(const ::mitk::MessageAbstractDelegate2< type1, type2 >& delegate) \
00060 { m_##msgHandleObject##Message -= delegate; }
00061
00062
00063 namespace mitk {
00064
00065 template<typename A = void>
00066 class MessageAbstractDelegate
00067 {
00068 public:
00069
00070 virtual ~MessageAbstractDelegate()
00071 {
00072 }
00073
00074 virtual A Execute() = 0;
00075 virtual bool operator==(const MessageAbstractDelegate* cmd) = 0;
00076 virtual MessageAbstractDelegate* Clone() const = 0;
00077 };
00078
00079
00080 template <typename T, typename A = void>
00081 class MessageAbstractDelegate1
00082 {
00083 public:
00084
00085 virtual ~MessageAbstractDelegate1()
00086 {
00087 }
00088
00089 virtual A Execute(T t) = 0;
00090 virtual bool operator==(const MessageAbstractDelegate1* cmd) = 0;
00091 virtual MessageAbstractDelegate1* Clone() const = 0;
00092 };
00093
00094 template <typename T, typename U, typename A = void>
00095 class MessageAbstractDelegate2
00096 {
00097 public:
00098
00099 virtual ~MessageAbstractDelegate2()
00100 {
00101 }
00102
00103 virtual A Execute(T t, U u) const = 0;
00104 virtual bool operator==(const MessageAbstractDelegate2* cmd) = 0;
00105 virtual MessageAbstractDelegate2* Clone() const = 0;
00106 };
00107
00108 template <typename T, typename U, typename V, typename A = void>
00109 class MessageAbstractDelegate3
00110 {
00111 public:
00112
00113 virtual ~MessageAbstractDelegate3()
00114 {
00115 }
00116
00117 virtual A Execute(T t, U u, V v) const = 0;
00118 virtual bool operator==(const MessageAbstractDelegate3* cmd) = 0;
00119 virtual MessageAbstractDelegate3* Clone() const = 0;
00120 };
00121
00122 template <typename T, typename U, typename V, typename W, typename A = void>
00123 class MessageAbstractDelegate4
00124 {
00125 public:
00126
00127 virtual ~MessageAbstractDelegate4()
00128 {
00129 }
00130
00131 virtual A Execute(T t, U u, V v, W w) const = 0;
00132 virtual bool operator==(const MessageAbstractDelegate4* cmd) = 0;
00133 virtual MessageAbstractDelegate4* Clone() const = 0;
00134 };
00135
00144 template <class R, typename A = void>
00145 class MessageDelegate : public MessageAbstractDelegate<A>
00146 {
00147 public:
00148
00149
00150
00151 MessageDelegate(R* object, A(R::*memberFunctionPointer)())
00152 :m_Object(object),
00153 m_MemberFunctionPointer(memberFunctionPointer)
00154 {
00155 }
00156
00157 virtual ~MessageDelegate()
00158 {
00159 }
00160
00161
00162 virtual A Execute()
00163 {
00164 return (m_Object->*m_MemberFunctionPointer)();
00165 }
00166
00167 bool operator==(const MessageAbstractDelegate<A>* c)
00168 {
00169 const MessageDelegate<R,A>* cmd = dynamic_cast<const MessageDelegate<R,A>* >(c);
00170 if (!cmd) return false;
00171
00172 if ((void*)this->m_Object != (void*)cmd->m_Object) return false;
00173 if (this->m_MemberFunctionPointer != cmd->m_MemberFunctionPointer) return false;
00174 return true;
00175 }
00176
00177 MessageAbstractDelegate<A>* Clone() const
00178 {
00179 return new MessageDelegate(m_Object, m_MemberFunctionPointer);
00180 }
00181
00182 private:
00183 R* m_Object;
00184 A (R::*m_MemberFunctionPointer)();
00185 };
00186
00187
00199 template <class R, typename T, typename A = void>
00200 class MessageDelegate1 : public MessageAbstractDelegate1<T,A>
00201 {
00202 public:
00203
00204
00205
00206 MessageDelegate1(R* object, A(R::*memberFunctionPointer)(T))
00207 :m_Object(object),
00208 m_MemberFunctionPointer(memberFunctionPointer)
00209 {
00210 }
00211
00212 virtual ~MessageDelegate1()
00213 {
00214 }
00215
00216
00217 virtual A Execute(T t)
00218 {
00219 return (m_Object->*m_MemberFunctionPointer)(t);
00220 }
00221
00222 bool operator==(const MessageAbstractDelegate1<T,A>* c)
00223 {
00224 const MessageDelegate1<R,T,A>* cmd = dynamic_cast<const MessageDelegate1<R,T,A>* >(c);
00225 if (!cmd) return false;
00226
00227 if ((void*)this->m_Object != (void*)cmd->m_Object) return false;
00228 if (this->m_MemberFunctionPointer != cmd->m_MemberFunctionPointer) return false;
00229 return true;
00230 }
00231
00232 MessageAbstractDelegate1<T,A>* Clone() const
00233 {
00234 return new MessageDelegate1(m_Object, m_MemberFunctionPointer);
00235 }
00236
00237 private:
00238 R* m_Object;
00239 A (R::*m_MemberFunctionPointer)(T);
00240 };
00241
00242
00243 template <class R, typename T, typename U, typename A = void>
00244 class MessageDelegate2 : public MessageAbstractDelegate2<T,U,A>
00245 {
00246 public:
00247
00248
00249
00250 MessageDelegate2(R* object, A(R::*memberFunctionPointer)(T, U))
00251 :m_Object(object),
00252 m_MemberFunctionPointer(memberFunctionPointer)
00253 {
00254 }
00255
00256 virtual ~MessageDelegate2()
00257 {
00258 }
00259
00260
00261 virtual A Execute(T t, U u) const
00262 {
00263 return (m_Object->*m_MemberFunctionPointer)(t,u);
00264 }
00265
00266 bool operator==(const MessageAbstractDelegate2<T,U,A>* c)
00267 {
00268 const MessageDelegate2<R,T,U,A>* cmd = dynamic_cast<const MessageDelegate2<R,T,U,A>* >(c);
00269 if (!cmd) return false;
00270
00271 if ((void*)this->m_Object != (void*)cmd->m_Object) return false;
00272 if (this->m_MemberFunctionPointer != cmd->m_MemberFunctionPointer) return false;
00273 return true;
00274 }
00275
00276 MessageAbstractDelegate2<T,U,A>* Clone() const
00277 {
00278 return new MessageDelegate2(m_Object, m_MemberFunctionPointer);
00279 }
00280
00281 private:
00282 R* m_Object;
00283 A (R::*m_MemberFunctionPointer)(T, U);
00284 };
00285
00286 template <class R, typename T, typename U, typename V, typename A = void>
00287 class MessageDelegate3 : public MessageAbstractDelegate3<T,U,V,A>
00288 {
00289 public:
00290
00291
00292
00293 MessageDelegate3(R* object, A(R::*memberFunctionPointer)(T, U, V))
00294 :m_Object(object),
00295 m_MemberFunctionPointer(memberFunctionPointer)
00296 {
00297 }
00298
00299 virtual ~MessageDelegate3()
00300 {
00301 }
00302
00303
00304 virtual A Execute(T t, U u, V v) const
00305 {
00306 return (m_Object->*m_MemberFunctionPointer)(t,u,v);
00307 }
00308
00309 bool operator==(const MessageAbstractDelegate3<T,U,V,A>* c)
00310 {
00311 const MessageDelegate3<R,T,U,V,A>* cmd = dynamic_cast<const MessageDelegate3<R,T,U,V,A>* >(c);
00312 if (!cmd) return false;
00313
00314 if ((void*)this->m_Object != (void*)cmd->m_Object) return false;
00315 if (this->m_MemberFunctionPointer != cmd->m_MemberFunctionPointer) return false;
00316 return true;
00317 }
00318
00319 MessageAbstractDelegate3<T,U,V,A>* Clone() const
00320 {
00321 return new MessageDelegate3(m_Object, m_MemberFunctionPointer);
00322 }
00323
00324 private:
00325 R* m_Object;
00326 A (R::*m_MemberFunctionPointer)(T, U, V);
00327 };
00328
00329 template <class R, typename T, typename U, typename V, typename W, typename A = void>
00330 class MessageDelegate4 : public MessageAbstractDelegate4<T,U,V,W,A>
00331 {
00332 public:
00333
00334
00335
00336 MessageDelegate4(R* object, A(R::*memberFunctionPointer)(T, U, V, W))
00337 :m_Object(object),
00338 m_MemberFunctionPointer(memberFunctionPointer)
00339 {
00340 }
00341
00342 virtual ~MessageDelegate4()
00343 {
00344 }
00345
00346
00347 virtual A Execute(T t, U u, V v, W w) const
00348 {
00349 return (m_Object->*m_MemberFunctionPointer)(t,u,v,w);
00350 }
00351
00352 bool operator==(const MessageAbstractDelegate4<T,U,V,W,A>* c)
00353 {
00354 const MessageDelegate4<R,T,U,V,W,A>* cmd = dynamic_cast<const MessageDelegate4<R,T,U,V,W,A>* >(c);
00355 if (!cmd) return false;
00356
00357 if ((void*)this->m_Object != (void*)cmd->m_Object) return false;
00358 if (this->m_MemberFunctionPointer != cmd->m_MemberFunctionPointer) return false;
00359 return true;
00360 }
00361
00362 MessageAbstractDelegate4<T,U,V,W,A>* Clone() const
00363 {
00364 return new MessageDelegate4(m_Object, m_MemberFunctionPointer);
00365 }
00366
00367 private:
00368 R* m_Object;
00369 A (R::*m_MemberFunctionPointer)(T, U, V, W);
00370 };
00371
00503 template<typename A = void>
00504 class Message
00505 {
00506 public:
00507
00508 typedef Message Self;
00509 typedef MessageAbstractDelegate<A> AbstractDelegate;
00510 typedef std::vector<AbstractDelegate* > ListenerList;
00511
00512 ~Message() {
00513 for (typename ListenerList::iterator iter = m_Listeners.begin();
00514 iter != m_Listeners.end(); ++iter )
00515 {
00516 delete *iter;
00517 }
00518 }
00519
00520 void AddListener( const AbstractDelegate& delegate ) const
00521 {
00522 AbstractDelegate* msgCmd = delegate.Clone();
00523
00524 m_Mutex.Lock();
00525 for (typename ListenerList::iterator iter = m_Listeners.begin();
00526 iter != m_Listeners.end();
00527 ++iter )
00528 {
00529 if ((*iter)->operator==(msgCmd)) {
00530 delete msgCmd;
00531 m_Mutex.Unlock();
00532 return;
00533 }
00534 }
00535 m_Listeners.push_back(msgCmd);
00536 m_Mutex.Unlock();
00537 }
00538
00539 void operator += ( const AbstractDelegate& delegate ) const
00540 {
00541 this->AddListener(delegate);
00542 }
00543
00544 void RemoveListener( const AbstractDelegate& delegate ) const
00545 {
00546 m_Mutex.Lock();
00547 for (typename ListenerList::iterator iter = m_Listeners.begin();
00548 iter != m_Listeners.end();
00549 ++iter )
00550 {
00551 if ((*iter)->operator==(&delegate))
00552 {
00553 delete *iter;
00554 m_Listeners.erase( iter );
00555 m_Mutex.Unlock();
00556 return;
00557 }
00558 }
00559 m_Mutex.Unlock();
00560 }
00561
00562 void operator -= ( const AbstractDelegate& delegate) const
00563 {
00564 this->RemoveListener(delegate);
00565 }
00566
00567 void Send()
00568 {
00569 ListenerList listeners;
00570
00571 {
00572 m_Mutex.Lock();
00573 listeners.assign(m_Listeners.begin(), m_Listeners.end());
00574 m_Mutex.Unlock();
00575 }
00576
00577 for (typename ListenerList::iterator iter = listeners.begin();
00578 iter != listeners.end();
00579 ++iter )
00580 {
00581
00582 (*iter)->Execute();
00583 }
00584 }
00585
00586 void operator()()
00587 {
00588 this->Send();
00589 }
00590
00591 const ListenerList& GetListeners() const
00592 {
00593 return m_Listeners;
00594 }
00595
00596 bool HasListeners() const
00597 {
00598 return !m_Listeners.empty();
00599 }
00600
00601 bool IsEmpty() const
00602 {
00603 return m_Listeners.empty();
00604 }
00605
00606 protected:
00607
00625 mutable ListenerList m_Listeners;
00626 mutable itk::SimpleFastMutexLock m_Mutex;
00627
00628 };
00629
00630
00631
00632 template <typename T, typename A = void>
00633 class Message1
00634 {
00635 public:
00636
00637 typedef Message1 Self;
00638 typedef MessageAbstractDelegate1<T,A> AbstractDelegate;
00639 typedef std::vector<AbstractDelegate*> ListenerList;
00640
00641 ~Message1()
00642 {
00643 for (typename ListenerList::iterator iter = m_Listeners.begin();
00644 iter != m_Listeners.end(); ++iter )
00645 {
00646 delete *iter;
00647 }
00648 }
00649
00650 void AddListener( const AbstractDelegate& delegate ) const
00651 {
00652 AbstractDelegate* msgCmd = delegate.Clone();
00653
00654 m_Mutex.Lock();
00655 for (typename ListenerList::iterator iter = m_Listeners.begin();
00656 iter != m_Listeners.end();
00657 ++iter )
00658 {
00659 if ((*iter)->operator==(msgCmd)) {
00660 delete msgCmd;
00661 m_Mutex.Unlock();
00662 return;
00663 }
00664 }
00665 m_Listeners.push_back(msgCmd);
00666 m_Mutex.Unlock();
00667 }
00668
00669 void operator += ( const AbstractDelegate& delegate ) const
00670 {
00671 this->AddListener(delegate);
00672 }
00673
00674 void RemoveListener( const AbstractDelegate& delegate ) const
00675 {
00676 m_Mutex.Lock();
00677 for (typename ListenerList::iterator iter = m_Listeners.begin();
00678 iter != m_Listeners.end();
00679 ++iter )
00680 {
00681 if ((*iter)->operator==(&delegate))
00682 {
00683 delete *iter;
00684 m_Listeners.erase( iter );
00685 m_Mutex.Unlock();
00686 return;
00687 }
00688 }
00689 m_Mutex.Unlock();
00690 }
00691
00692 void operator -= ( const AbstractDelegate& delegate) const
00693 {
00694 this->RemoveListener(delegate);
00695 }
00696
00697 void Send(T t)
00698 {
00699 ListenerList listeners;
00700
00701 {
00702 m_Mutex.Lock();
00703 listeners.assign(m_Listeners.begin(), m_Listeners.end());
00704 m_Mutex.Unlock();
00705 }
00706
00707 for ( typename ListenerList::iterator iter = listeners.begin();
00708 iter != listeners.end();
00709 ++iter )
00710 {
00711
00712 (*iter)->Execute(t);
00713 }
00714 }
00715
00716 void operator()(T t)
00717 {
00718 this->Send(t);
00719 }
00720
00721 const ListenerList& GetListeners() const
00722 {
00723 return m_Listeners;
00724 }
00725
00726 bool HasListeners() const
00727 {
00728 return !m_Listeners.empty();
00729 }
00730
00731 bool IsEmpty() const
00732 {
00733 return m_Listeners.empty();
00734 }
00735
00736 protected:
00737
00738 mutable ListenerList m_Listeners;
00739 mutable itk::SimpleFastMutexLock m_Mutex;
00740
00741 };
00742
00743
00744
00745 template <typename T, typename U, typename A = void>
00746 class Message2
00747 {
00748 public:
00749
00750 typedef Message2 Self;
00751 typedef MessageAbstractDelegate2<T,U,A> AbstractDelegate;
00752 typedef std::vector<AbstractDelegate* > ListenerList;
00753
00754 ~Message2() {
00755 for (typename ListenerList::iterator iter = m_Listeners.begin();
00756 iter != m_Listeners.end(); ++iter )
00757 {
00758 delete *iter;
00759 }
00760 }
00761
00762 void AddListener( const AbstractDelegate& delegate ) const
00763 {
00764 AbstractDelegate* msgCmd = delegate.Clone();
00765
00766 m_Mutex.Lock();
00767 for (typename ListenerList::iterator iter = m_Listeners.begin();
00768 iter != m_Listeners.end();
00769 ++iter )
00770 {
00771 if ((*iter)->operator==(msgCmd)) {
00772 delete msgCmd;
00773 m_Mutex.Unlock();
00774 return;
00775 }
00776 }
00777 m_Listeners.push_back(msgCmd);
00778 m_Mutex.Unlock();
00779 }
00780
00781 void operator += ( const AbstractDelegate& delegate ) const
00782 {
00783 this->AddListener(delegate);
00784 }
00785
00786 void RemoveListener( const AbstractDelegate& delegate ) const
00787 {
00788 m_Mutex.Lock();
00789 for (typename ListenerList::iterator iter = m_Listeners.begin();
00790 iter != m_Listeners.end();
00791 ++iter )
00792 {
00793 if ((*iter)->operator==(&delegate))
00794 {
00795 delete *iter;
00796 m_Listeners.erase( iter );
00797 m_Mutex.Unlock();
00798 return;
00799 }
00800 }
00801 m_Mutex.Unlock();
00802 }
00803
00804 void operator -= ( const AbstractDelegate& delegate) const
00805 {
00806 this->RemoveListener(delegate);
00807 }
00808
00809 void Send(T t, U u)
00810 {
00811 ListenerList listeners;
00812
00813 {
00814 m_Mutex.Lock();
00815 listeners.assign(m_Listeners.begin(), m_Listeners.end());
00816 m_Mutex.Unlock();
00817 }
00818
00819 for ( typename ListenerList::iterator iter = listeners.begin();
00820 iter != listeners.end();
00821 ++iter )
00822 {
00823
00824 (*iter)->Execute(t,u);
00825 }
00826 }
00827
00828 void operator()(T t, U u)
00829 {
00830 this->Send(t, u);
00831 }
00832
00833 const ListenerList& GetListeners() const
00834 {
00835 return m_Listeners;
00836 }
00837
00838 bool HasListeners() const
00839 {
00840 return !m_Listeners.empty();
00841 }
00842
00843 bool IsEmpty() const
00844 {
00845 return m_Listeners.empty();
00846 }
00847
00848 protected:
00849
00850 mutable ListenerList m_Listeners;
00851 mutable itk::SimpleFastMutexLock m_Mutex;
00852
00853 };
00854
00855
00856 template <typename T, typename U, typename V, typename A = void>
00857 class Message3
00858 {
00859 public:
00860
00861 typedef Message3 Self;
00862 typedef MessageAbstractDelegate3<T,U,V,A> AbstractDelegate;
00863 typedef std::vector<AbstractDelegate* > ListenerList;
00864
00865 ~Message3() {
00866 for (typename ListenerList::iterator iter = m_Listeners.begin();
00867 iter != m_Listeners.end(); ++iter )
00868 {
00869 delete *iter;
00870 }
00871 }
00872
00873 void AddListener( const AbstractDelegate& delegate ) const
00874 {
00875 AbstractDelegate* msgCmd = delegate.Clone();
00876
00877 m_Mutex.Lock();
00878 for (typename ListenerList::iterator iter = m_Listeners.begin();
00879 iter != m_Listeners.end();
00880 ++iter )
00881 {
00882 if ((*iter)->operator==(msgCmd)) {
00883 delete msgCmd;
00884 m_Mutex.Unlock();
00885 return;
00886 }
00887 }
00888 m_Listeners.push_back(msgCmd);
00889 m_Mutex.Unlock();
00890 }
00891
00892 void operator += ( const AbstractDelegate& delegate ) const
00893 {
00894 this->AddListener(delegate);
00895 }
00896
00897 void RemoveListener(const AbstractDelegate& delegate ) const
00898 {
00899 m_Mutex.Lock();
00900 for (typename ListenerList::iterator iter = m_Listeners.begin();
00901 iter != m_Listeners.end();
00902 ++iter )
00903 {
00904 if ((*iter)->operator==(&delegate))
00905 {
00906 delete *iter;
00907 m_Listeners.erase( iter );
00908 m_Mutex.Unlock();
00909 return;
00910 }
00911 }
00912 m_Mutex.Unlock();
00913 }
00914
00915 void operator -= ( const AbstractDelegate& delegate) const
00916 {
00917 this->RemoveListener(delegate);
00918 }
00919
00920 void Send(T t, U u, V v)
00921 {
00922 ListenerList listeners;
00923
00924 {
00925 m_Mutex.Lock();
00926 listeners.assign(m_Listeners.begin(), m_Listeners.end());
00927 m_Mutex.Unlock();
00928 }
00929
00930 for ( typename ListenerList::iterator iter = listeners.begin();
00931 iter != listeners.end();
00932 ++iter )
00933 {
00934
00935 (*iter)->Execute(t,u,v);
00936 }
00937 }
00938
00939 void operator()(T t, U u, V v)
00940 {
00941 this->Send(t, u, v);
00942 }
00943
00944 const ListenerList& GetListeners() const
00945 {
00946 return m_Listeners;
00947 }
00948
00949 bool HasListeners() const
00950 {
00951 return !m_Listeners.empty();
00952 }
00953
00954 bool IsEmpty() const
00955 {
00956 return m_Listeners.empty();
00957 }
00958
00959 protected:
00960
00961 mutable ListenerList m_Listeners;
00962 mutable itk::SimpleFastMutexLock m_Mutex;
00963
00964 };
00965
00966
00967 template <typename T, typename U, typename V, typename W, typename A = void>
00968 class Message4
00969 {
00970 public:
00971
00972 typedef Message4 Self;
00973 typedef MessageAbstractDelegate4<T,U,V,W,A> AbstractDelegate;
00974 typedef std::vector<AbstractDelegate* > ListenerList;
00975
00976 ~Message4() {
00977 for (typename ListenerList::iterator iter = m_Listeners.begin();
00978 iter != m_Listeners.end(); ++iter )
00979 {
00980 delete *iter;
00981 }
00982 }
00983
00984 void AddListener( const AbstractDelegate& delegate ) const
00985 {
00986 AbstractDelegate* msgCmd = delegate.Clone();
00987
00988 m_Mutex.Lock();
00989 for (typename ListenerList::iterator iter = m_Listeners.begin();
00990 iter != m_Listeners.end();
00991 ++iter )
00992 {
00993 if ((*iter)->operator==(msgCmd)) {
00994 delete msgCmd;
00995 m_Mutex.Unlock();
00996 return;
00997 }
00998 }
00999 m_Listeners.push_back(msgCmd);
01000 m_Mutex.Unlock();
01001 }
01002
01003 void operator += ( const AbstractDelegate& delegate ) const
01004 {
01005 this->AddListener(delegate);
01006 }
01007
01008 void RemoveListener( const AbstractDelegate& delegate ) const
01009 {
01010 m_Mutex.Lock();
01011 for (typename ListenerList::iterator iter = m_Listeners.begin();
01012 iter != m_Listeners.end();
01013 ++iter )
01014 {
01015 if ((*iter)->operator==(&delegate))
01016 {
01017 delete *iter;
01018 m_Listeners.erase( iter );
01019 m_Mutex.Unlock();
01020 return;
01021 }
01022 }
01023 m_Mutex.Unlock();
01024 }
01025
01026 void operator -= ( const AbstractDelegate& delegate) const
01027 {
01028 this->RemoveListener(delegate);
01029 }
01030
01031 void Send(T t, U u, V v, W w)
01032 {
01033 ListenerList listeners;
01034
01035 {
01036 m_Mutex.Lock();
01037 listeners.assign(m_Listeners.begin(), m_Listeners.end());
01038 m_Mutex.Unlock();
01039 }
01040
01041 for ( typename ListenerList::iterator iter = listeners.begin();
01042 iter != listeners.end();
01043 ++iter )
01044 {
01045
01046 (*iter)->Execute(t,u,v,w);
01047 }
01048 }
01049
01050 void operator()(T t, U u, V v, W w)
01051 {
01052 this->Send(t, u, v, w);
01053 }
01054
01055 const ListenerList& GetListeners() const
01056 {
01057 return this->m_Listeners;
01058 }
01059
01060 bool HasListeners() const
01061 {
01062 return !m_Listeners.empty();
01063 }
01064
01065 bool IsEmpty() const
01066 {
01067 return m_Listeners.empty();
01068 }
01069
01070 protected:
01071
01072 mutable ListenerList m_Listeners;
01073 mutable itk::SimpleFastMutexLock m_Mutex;
01074
01075 };
01076
01077 }
01078
01079 #endif
01080