+++ /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