Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef __itkSmartPointer_h
00018 #define __itkSmartPointer_h
00019
00020 #include <iostream>
00021
00022 namespace itk
00023 {
00024
00041 template <class TObjectType>
00042 class SmartPointer
00043 {
00044 public:
00045 typedef TObjectType ObjectType;
00046
00048 SmartPointer ()
00049 { m_Pointer = 0; }
00050
00052 SmartPointer (const SmartPointer<ObjectType> &p):
00053 m_Pointer(p.m_Pointer)
00054 { this->Register(); }
00055
00057 SmartPointer (ObjectType *p):
00058 m_Pointer(p)
00059 { this->Register(); }
00060
00062 ~SmartPointer ()
00063 {
00064 this->UnRegister();
00065 m_Pointer = 0;
00066 }
00068
00070 ObjectType *operator -> () const
00071 { return m_Pointer; }
00072
00074 operator ObjectType * () const
00075 { return m_Pointer; }
00076
00078 bool IsNotNull() const
00079 { return m_Pointer != 0; }
00080 bool IsNull() const
00081 { return m_Pointer == 0; }
00083
00085 template <typename TR>
00086 bool operator == ( TR r ) const
00087 { return (m_Pointer == static_cast<const ObjectType*>(r) ); }
00088
00089 template <typename TR>
00090 bool operator != ( TR r ) const
00091 { return (m_Pointer != static_cast<const ObjectType*>(r) ); }
00092
00094 ObjectType *GetPointer () const
00095 { return m_Pointer; }
00096
00098 bool operator < (const SmartPointer &r) const
00099 { return (void*)m_Pointer < (void*) r.m_Pointer; }
00100
00102 bool operator > (const SmartPointer &r) const
00103 { return (void*)m_Pointer > (void*) r.m_Pointer; }
00104
00106 bool operator <= (const SmartPointer &r) const
00107 { return (void*)m_Pointer <= (void*) r.m_Pointer; }
00108
00110 bool operator >= (const SmartPointer &r) const
00111 { return (void*)m_Pointer >= (void*) r.m_Pointer; }
00112
00114 SmartPointer &operator = (const SmartPointer &r)
00115 { return this->operator = (r.GetPointer()); }
00116
00118 SmartPointer &operator = (ObjectType *r)
00119 {
00120 if (m_Pointer != r)
00121 {
00122 ObjectType* tmp = m_Pointer;
00123 m_Pointer = r;
00124 this->Register();
00125 if ( tmp ) { tmp->UnRegister(); }
00126 }
00127 return *this;
00128 }
00130
00132 ObjectType *Print (std::ostream& os) const
00133 {
00134
00135 (*m_Pointer).Print(os);
00136 return m_Pointer;
00137 }
00139
00140 private:
00142 ObjectType* m_Pointer;
00143
00144 void Register()
00145 {
00146 if(m_Pointer) { m_Pointer->Register(); }
00147 }
00148
00149 void UnRegister()
00150 {
00151 if(m_Pointer) { m_Pointer->UnRegister(); }
00152 }
00153 };
00154
00155
00156 template <typename T>
00157 std::ostream& operator<< (std::ostream& os, SmartPointer<T> p)
00158 {
00159 p.Print(os);
00160 return os;
00161 }
00162
00163 }
00164
00165 #endif
00166