00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #ifndef _CIvfPointer_h_
00026 #define _CIvfPointer_h_
00027
00028 #include <ivf/ivfconfig.h>
00029 #include <ivfdef/IvfDef.h>
00030
00053 template <class T,class R> class CIvfPointerRefBase {
00054 private:
00055 T* m_object;
00056 public:
00057 CIvfPointerRefBase(T* object = 0)
00058 {
00059 m_object = object;
00060 if (m_object)
00061 {
00062 IvfDbg1("CIvfPointerRefBase: created for " << m_object->getClassName());
00063 m_object->R::addReference();
00064 }
00065 else
00066 {
00067 IvfDbg1("CIvfPointerRefBase: assigned 0");
00068 }
00069 }
00070
00071 CIvfPointerRefBase(const CIvfPointerRefBase& ivfObject)
00072 {
00073 m_object = ivfObject.m_object;
00074 if (m_object)
00075 {
00076 IvfDbg1("CIvfPointerRefBase: assigned " << m_object->getClassName());
00077 m_object->R::addReference();
00078 }
00079 else
00080 {
00081 IvfDbg1("CIvfPointerRefBase: assigned 0");
00082 }
00083 }
00084
00085 virtual ~CIvfPointerRefBase()
00086 {
00087 if (m_object)
00088 {
00089 m_object->R::deleteReference();
00090 IvfDbg1("CIvfPointerRefBase: " << m_object->getClassName() << " dereferenced.");
00091 if (!m_object->R::referenced())
00092 {
00093 IvfDbg1("CIvfPointerRefBase: " << m_object->getClassName() << " deleted.");
00094 delete m_object;
00095 }
00096 }
00097 }
00098
00099 operator T* () const { return m_object; }
00100 T& operator* () const { return *m_object; }
00101 T* operator-> () const { return m_object; }
00102
00103 CIvfPointerRefBase& operator= (const CIvfPointerRefBase& IvfPointerRefBase)
00104 {
00105 if (m_object!=IvfPointerRefBase.m_object)
00106 {
00107 if (m_object)
00108 {
00109 m_object->R::deleteReference();
00110 IvfDbg1("CIvfPointerRefBase(=): " << m_object->getClassName() << " dereferenced.");
00111 if (!m_object->R::referenced())
00112 {
00113 IvfDbg1("CIvfPointerRefBase(=): " << m_object->getClassName() << " deleted.");
00114 delete m_object;
00115 }
00116 }
00117
00118 m_object = IvfPointerRefBase.m_object;
00119
00120 if (m_object)
00121 {
00122 IvfDbg1("CIvfPointerRefBase(=): assigned " << m_object->getClassName());
00123 m_object->R::addReference();
00124 }
00125 else
00126 {
00127 IvfDbg1("CIvfPointerRefBase(=): assigned 0");
00128 }
00129 }
00130 return *this;
00131 }
00132
00133 CIvfPointerRefBase& operator= (T* ivfObject)
00134 {
00135 if (m_object!=ivfObject)
00136 {
00137 if (m_object)
00138 {
00139 m_object->R::deleteReference();
00140 IvfDbg1("CIvfPointerRefBase(=): " << m_object->getClassName() << " dereferenced.");
00141 if (!m_object->R::referenced())
00142 {
00143 IvfDbg1("CIvfPointerRefBase(=): " << m_object->getClassName() << " deleted.");
00144 delete m_object;
00145 }
00146 }
00147
00148 m_object = ivfObject;
00149
00150 if (m_object)
00151 {
00152 IvfDbg1("CIvfPointerRefBase(=): assigned " << m_object->getClassName());
00153 m_object->R::addReference();
00154 }
00155 else
00156 {
00157 IvfDbg1("CIvfPointerRefBase(=): assigned 0");
00158 }
00159 }
00160 return *this;
00161 }
00162
00163 bool operator== (T* ivfObject) const { return m_object == ivfObject; }
00164 bool operator!= (T* ivfObject) const { return m_object != ivfObject; }
00165 bool operator== (const CIvfPointerRefBase& IvfPointerRefBase) const
00166 {
00167 return m_object == IvfPointerRefBase.m_object;
00168 }
00169
00170 bool operator!= (const CIvfPointerRefBase& IvfPointerRefBase) const
00171 {
00172 return m_object != IvfPointerRefBase.m_object;
00173 }
00174 };
00175
00176 template <class T> class CIvfPointer {
00177 private:
00178 T* m_object;
00179 public:
00180 CIvfPointer(T* object = 0)
00181 {
00182 m_object = object;
00183 if (m_object)
00184 {
00185 IvfDbg1("CIvfPointer: created for " << m_object->getClassName());
00186 m_object->addReference();
00187 }
00188 else
00189 {
00190 IvfDbg1("CIvfPointer: assigned 0");
00191 }
00192 }
00193
00194 CIvfPointer(const CIvfPointer& ivfObject)
00195 {
00196 m_object = ivfObject.m_object;
00197 if (m_object)
00198 {
00199 IvfDbg1("CIvfPointer: assigned " << m_object->getClassName());
00200 m_object->addReference();
00201 }
00202 else
00203 {
00204 IvfDbg1("CIvfPointer: assigned 0");
00205 }
00206 }
00207
00208 virtual ~CIvfPointer()
00209 {
00210 if (m_object)
00211 {
00212 m_object->deleteReference();
00213 IvfDbg1("CIvfPointer: " << m_object->getClassName() << " dereferenced.");
00214 if (!m_object->referenced())
00215 {
00216 IvfDbg1("CIvfPointer: " << m_object->getClassName() << " deleted.");
00217 delete m_object;
00218 }
00219 }
00220 }
00221
00222 operator T* () const { return m_object; }
00223 T& operator* () const { return *m_object; }
00224 T* operator-> () const { return m_object; }
00225
00226 CIvfPointer& operator= (const CIvfPointer& ivfPointer)
00227 {
00228 if (m_object!=ivfPointer.m_object)
00229 {
00230 if (m_object)
00231 {
00232 m_object->deleteReference();
00233 IvfDbg1("CIvfPointer(=): " << m_object->getClassName() << " dereferenced.");
00234 if (!m_object->referenced())
00235 {
00236 IvfDbg1("CIvfPointer(=): " << m_object->getClassName() << " deleted.");
00237 delete m_object;
00238 }
00239 }
00240
00241 m_object = ivfPointer.m_object;
00242
00243 if (m_object)
00244 {
00245 IvfDbg1("CIvfPointer(=): assigned " << m_object->getClassName());
00246 m_object->addReference();
00247 }
00248 else
00249 {
00250 IvfDbg1("CIvfPointer(=): assigned 0");
00251 }
00252 }
00253 return *this;
00254 }
00255
00256 CIvfPointer& operator= (T* ivfObject)
00257 {
00258 if (m_object!=ivfObject)
00259 {
00260 if (m_object)
00261 {
00262 m_object->deleteReference();
00263 IvfDbg1("CIvfPointer(=): " << m_object->getClassName() << " dereferenced.");
00264 if (!m_object->referenced())
00265 {
00266 IvfDbg1("CIvfPointer(=): " << m_object->getClassName() << " deleted.");
00267 delete m_object;
00268 }
00269 }
00270
00271 m_object = ivfObject;
00272
00273 if (m_object)
00274 {
00275 IvfDbg1("CIvfPointer(=): assigned " << m_object->getClassName());
00276 m_object->addReference();
00277 }
00278 else
00279 {
00280 IvfDbg1("CIvfPointer(=): assigned 0");
00281 }
00282 }
00283 return *this;
00284 }
00285
00286 bool operator== (T* ivfObject) const { return m_object == ivfObject; }
00287 bool operator!= (T* ivfObject) const { return m_object != ivfObject; }
00288 bool operator== (const CIvfPointer& ivfPointer) const
00289 {
00290 return m_object == ivfPointer.m_object;
00291 }
00292
00293 bool operator!= (const CIvfPointer& ivfPointer) const
00294 {
00295 return m_object != ivfPointer.m_object;
00296 }
00297 };
00298
00299
00300 #endif