IvfPointer.h

00001 //
00002 // Copyright 1999-2006 by Structural Mechanics, Lund University.
00003 //
00004 // This library is free software; you can redistribute it and/or
00005 // modify it under the terms of the GNU Library General Public
00006 // License as published by the Free Software Foundation; either
00007 // version 2 of the License, or (at your option) any later version.
00008 //
00009 // This library is distributed in the hope that it will be useful,
00010 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00011 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00012 // Library General Public License for more details.
00013 //
00014 // You should have received a copy of the GNU Library General Public
00015 // License along with this library; if not, write to the Free Software
00016 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
00017 // USA.
00018 //
00019 // Please report all bugs and problems to "ivf@byggmek.lth.se".
00020 //
00021 //
00022 // Written by Jonas Lindemann
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 

Generated on Fri Sep 1 15:36:46 2006 for Interactive Visualisation Framework - Ivf++ by  doxygen 1.4.6-NO