Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef __mitkWeakPointer_h
00019 #define __mitkWeakPointer_h
00020
00021 #include "mitkCommon.h"
00022 #include "mitkMessage.h"
00023
00024 #include <itkCommand.h>
00025 #include <iostream>
00026
00027 namespace mitk
00028 {
00029
00039 template <class TObjectType>
00040 class WeakPointer
00041 {
00042 public:
00044 typedef TObjectType ObjectType;
00045
00046 typedef Message1<const itk::Object*> itkObjectEvent;
00047
00048
00049 itkObjectEvent ObjectDelete;
00050
00051
00052
00053 itkObjectEvent ObjectModified;
00054
00056 WeakPointer ()
00057 : m_DeleteObserverTag(-1)
00058 , m_ModifiedObserverTag(-1)
00059 , m_Pointer(0)
00060 {
00061 }
00062
00064 WeakPointer (const WeakPointer<ObjectType> &p)
00065 : m_DeleteObserverTag(-1)
00066 , m_ModifiedObserverTag(-1)
00067 , m_Pointer(p.m_Pointer)
00068 {
00069 this->AddDeleteAndModifiedObserver();
00070 }
00071
00073 WeakPointer (ObjectType *p)
00074 : m_DeleteObserverTag(-1),
00075 m_ModifiedObserverTag(-1),
00076 m_Pointer(p)
00077 {
00078 this->AddDeleteAndModifiedObserver();
00079 }
00080
00082 ~WeakPointer ()
00083 {
00084 this->RemoveDeleteAndModifiedObserver();
00085
00086 m_Pointer = 0;
00087 }
00088
00090 ObjectType *operator -> () const
00091 { return m_Pointer; }
00092
00094 operator ObjectType * () const
00095 { return m_Pointer; }
00096
00098 template <typename R>
00099 bool operator == (R r) const
00100 {
00101 return (m_Pointer == (ObjectType*)r);
00102 }
00103 template <typename R>
00104 bool operator != (R r) const
00105 {
00106 return (m_Pointer != (ObjectType*)r);
00107 }
00108
00110 ObjectType *GetPointer () const
00111 { return m_Pointer; }
00112
00114 bool operator < (const WeakPointer &r) const
00115 { return (void*)m_Pointer < (void*) r.m_Pointer; }
00116
00118 bool operator > (const WeakPointer &r) const
00119 { return (void*)m_Pointer > (void*) r.m_Pointer; }
00120
00122 bool operator <= (const WeakPointer &r) const
00123 { return (void*)m_Pointer <= (void*) r.m_Pointer; }
00124
00126 bool operator >= (const WeakPointer &r) const
00127 { return (void*)m_Pointer >= (void*) r.m_Pointer; }
00128
00130 bool IsNotNull() const
00131 { return m_Pointer != 0; }
00132 bool IsNull() const
00133 { return m_Pointer == 0; }
00134
00136 WeakPointer &operator = (const WeakPointer &r)
00137 { return this->operator = (r.GetPointer()); }
00138
00140 WeakPointer &operator = (ObjectType *r)
00141 {
00142 this->RemoveDeleteAndModifiedObserver();
00143 m_Pointer = r;
00144 this->AddDeleteAndModifiedObserver();
00145 return *this;
00146 }
00147
00149 ObjectType *Print (std::ostream& os) const
00150 {
00151
00152 (*m_Pointer).Print(os);
00153 return m_Pointer;
00154 }
00155
00159 void OnObjectDelete( const itk::Object *caller, const itk::EventObject & )
00160 {
00161
00162
00163
00164
00165 m_Pointer = 0;
00166 m_DeleteObserverTag = -1;
00167 m_ModifiedObserverTag = -1;
00168 ObjectDelete.Send(caller);
00169
00170 }
00171
00172 void OnObjectModified( const itk::Object *caller, const itk::EventObject & )
00173 {
00174 ObjectModified.Send(caller);
00175 }
00176
00177 private:
00178 void AddDeleteAndModifiedObserver()
00179 {
00180 if(m_DeleteObserverTag == -1 && m_ModifiedObserverTag == -1 && m_Pointer != 0)
00181 {
00182
00183 typename itk::MemberCommand<WeakPointer<TObjectType> >::Pointer onObjectDelete =
00184 itk::MemberCommand<WeakPointer<TObjectType> >::New();
00185
00186 onObjectDelete->SetCallbackFunction(this, &WeakPointer<TObjectType>::OnObjectDelete);
00187 m_DeleteObserverTag = m_Pointer->AddObserver(itk::DeleteEvent(), onObjectDelete);
00188
00189
00190 typename itk::MemberCommand<WeakPointer<TObjectType> >::Pointer onObjectModified =
00191 itk::MemberCommand<WeakPointer<TObjectType> >::New();
00192
00193 onObjectModified->SetCallbackFunction(this, &WeakPointer<TObjectType>::OnObjectModified);
00194 m_ModifiedObserverTag = m_Pointer->AddObserver(itk::ModifiedEvent(), onObjectModified);
00195 }
00196 }
00197
00198 void RemoveDeleteAndModifiedObserver()
00199 {
00200 if(m_DeleteObserverTag >= 0 && m_ModifiedObserverTag >= 0 && m_Pointer != 0)
00201 {
00202 m_Pointer->RemoveObserver(m_DeleteObserverTag);
00203 m_Pointer->RemoveObserver(m_ModifiedObserverTag);
00204
00205 m_DeleteObserverTag = -1;
00206 m_ModifiedObserverTag = -1;
00207 }
00208 }
00209
00210 long m_DeleteObserverTag;
00211 long m_ModifiedObserverTag;
00212
00214 ObjectType* m_Pointer;
00215 };
00216
00217
00218 template <typename T>
00219 std::ostream& operator<< (std::ostream& os, WeakPointer<T> p)
00220 {
00221 p.Print(os);
00222 return os;
00223 }
00224
00225 }
00226
00227 #endif