--- /dev/null
+// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+//
+// File : SALOME_GenericObjPtr.cc
+// Author : Oleg UVAROV
+// Module : SALOME
+
+#include "SALOME_GenericObjPtr.hh"
+
+using namespace SALOME;
+
+//----------------------------------------------------------------------------
+GenericObjPtrBase
+::GenericObjPtrBase() :
+ Object(0)
+{
+ // Add a reference to the object.
+ this->Register();
+}
+
+//----------------------------------------------------------------------------
+GenericObjPtrBase
+::GenericObjPtrBase(GenericObj_i* r):
+ Object(r)
+{
+ // Add a reference to the object.
+ this->Register();
+}
+
+//----------------------------------------------------------------------------
+GenericObjPtrBase
+::GenericObjPtrBase(const GenericObjPtrBase& r):
+ Object(r.Object)
+{
+ // Add a reference to the object.
+ this->Register();
+}
+
+//----------------------------------------------------------------------------
+GenericObjPtrBase
+::GenericObjPtrBase(GenericObj_i* r, const GenericObjPtrBase::NoReference&):
+ Object(r)
+{
+ // Do not add a reference to the object because we received the
+ // NoReference argument.
+}
+
+//----------------------------------------------------------------------------
+GenericObjPtrBase
+::~GenericObjPtrBase()
+{
+ // The main pointer must be set to NULL before calling UnRegister,
+ // so use a local variable to save the pointer. This is because the
+ // garbage collection reference graph traversal may make it back to
+ // this smart pointer, and we do not want to include this reference.
+ if(GenericObj_i* object = this->Object)
+ {
+ this->Object = 0;
+ object->Destroy();
+ }
+}
+
+//----------------------------------------------------------------------------
+GenericObjPtrBase&
+GenericObjPtrBase
+::operator=(GenericObj_i* r)
+{
+ // This is an exception-safe assignment idiom that also gives the
+ // correct order of register/unregister calls to all objects
+ // involved. A temporary is constructed that references the new
+ // object. Then the main pointer and temporary are swapped and the
+ // temporary's destructor unreferences the old object.
+ GenericObjPtrBase(r).Swap(*this);
+ return *this;
+}
+
+//----------------------------------------------------------------------------
+GenericObjPtrBase&
+GenericObjPtrBase
+::operator=(const GenericObjPtrBase& r)
+{
+ // This is an exception-safe assignment idiom that also gives the
+ // correct order of register/unregister calls to all objects
+ // involved. A temporary is constructed that references the new
+ // object. Then the main pointer and temporary are swapped and the
+ // temporary's destructor unreferences the old object.
+ GenericObjPtrBase(r).Swap(*this);
+ return *this;
+}
+
+//----------------------------------------------------------------------------
+void GenericObjPtrBase
+::Swap(GenericObjPtrBase& r)
+{
+ // Just swap the pointers. This is used internally by the
+ // assignment operator.
+ GenericObj_i* temp = r.Object;
+ r.Object = this->Object;
+ this->Object = temp;
+}
+
+//----------------------------------------------------------------------------
+void GenericObjPtrBase
+::Register()
+{
+ // Add a reference only if the object is not NULL.
+ if(this->Object)
+ this->Object->Register();
+}
--- /dev/null
+// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+//
+// File : SALOME_GenericObjPtr.hh
+// Author : Oleg UVAROV
+// Module : SALOME
+
+#ifndef SALOME_GenericObjPtr_HH
+#define SALOME_GenericObjPtr_HH
+
+#include "SALOME_GenericObj_i.hh"
+
+namespace SALOME
+{
+ class GenericObjPtrBase
+ {
+ public:
+ // Description:
+ // Initialize smart pointer to NULL.
+ GenericObjPtrBase();
+
+ // Description:
+ // Initialize smart pointer to given object.
+ GenericObjPtrBase( GenericObj_i* );
+
+ // Description:
+ // Initialize smart pointer with a new reference to the same object
+ // referenced by given smart pointer.
+ GenericObjPtrBase( const GenericObjPtrBase& );
+
+ // Description:
+ // Destroy smart pointer and remove the reference to its object.
+ ~GenericObjPtrBase();
+
+ // Description:
+ // Assign object to reference. This removes any reference to an old object.
+ GenericObjPtrBase& operator=( GenericObj_i* );
+ GenericObjPtrBase& operator=( const GenericObjPtrBase& );
+
+ // Description:
+ // Get the contained pointer.
+ GenericObj_i* GetPointer() const
+ {
+ return this->Object;
+ }
+
+ protected:
+ // Initialize smart pointer to given object, but do not increment
+ // reference count. The destructor will still decrement the count.
+ // This effectively makes it an auto-ptr.
+ class NoReference {};
+ GenericObjPtrBase(GenericObj_i* r, const NoReference&);
+
+ // Pointer to the actual object.
+ GenericObj_i* Object;
+
+ private:
+ // Internal utility methods.
+ void Swap( GenericObjPtrBase& );
+ void Register();
+ };
+
+ template <class T>
+ class GenericObjPtr: public GenericObjPtrBase
+ {
+ public:
+ // Description:
+ // Initialize smart pointer to NULL.
+ GenericObjPtr() {}
+
+ // Description:
+ // Initialize smart pointer to given object.
+ GenericObjPtr(T* r): GenericObjPtrBase(r) {}
+
+ // Description:
+ // Initialize smart pointer with a new reference to the same object
+ // referenced by given smart pointer.
+ GenericObjPtr(const GenericObjPtrBase& r): GenericObjPtrBase(r) {}
+
+ // Description:
+ // Assign object to reference. This removes any reference to an old
+ // object.
+ GenericObjPtr& operator=(T* r)
+ {
+ this->GenericObjPtrBase::operator=(r);
+ return *this;
+ }
+
+ // Description:
+ // Assign object to reference. This removes any reference to an old
+ // object.
+ GenericObjPtr& operator=(const GenericObjPtrBase& r)
+ {
+ this->GenericObjPtrBase::operator=(r);
+ return *this;
+ }
+
+ // Description:
+ // Get the contained pointer.
+ T* GetPointer() const
+ {
+ return dynamic_cast<T*>(this->Object);
+ }
+
+ // Description:
+ // Get the contained pointer.
+ operator T* () const
+ {
+ return dynamic_cast<T*>(this->Object);
+ }
+
+ // Description:
+ // Dereference the pointer and return a reference to the contained
+ // object.
+ T& operator*() const
+ {
+ return *dynamic_cast<T*>(this->Object);
+ }
+
+ // Description:
+ // Provides normal pointer target member access using operator ->.
+ T* operator->() const
+ {
+ return dynamic_cast<T*>(this->Object);
+ }
+
+ // Description:
+ // Create an instance of an object.
+ static GenericObjPtr<T> New()
+ {
+ return GenericObjPtr<T>(T::New(), NoReference());
+ }
+
+ protected:
+ GenericObjPtr(T* r, const NoReference& n): GenericObjPtrBase(r, n) {}
+ };
+}
+
+#endif