1 // Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE
3 // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License.
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 // Lesser General Public License for more details.
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
22 // SALOME Utils : general SALOME's definitions and tools
23 // File : Utils_SINGLETON.hxx
24 // Author : Antoine YESSAYAN, EDF
28 # if !defined( __SINGLETON__H__ )
29 # define __SINGLETON__H__
31 #include "SALOME_Utils.hxx"
33 # include "Utils_DESTRUCTEUR_GENERIQUE.hxx"
40 * A singleton is a data which is created and deleted only once in the application.
41 * The C++ compiler allow the user to create static data before the first executable statement.
42 * They are deleted after the last statement.statement.
44 * The SINGLETON_ template class deals with dynamic singleton. It is useful for functor objects.
45 * For example, an object which, when created, connects the application to a system and
46 * disconnects the application at deletion.
51 * To create a single instance a POINT_ object :
53 * # include "Utils_SINGLETON.hxx"
55 * ptrPoint = SINGLETON_<POINT_>::Instance() ;
58 * <B>Design description</B>
60 * -# the user creates an object of class TYPE By using a class method : SINGLETON_<TYPE>::Instance() which
61 * returns a pointer to the single object ;
62 * -# this class method uses the default constructor to create an object ;
63 * -# at the same time, this class method reate a destructor object which is added to the generic list
64 * of destructors objects to be executed at the end of the application (atexit) ;
65 * -# at the end of the application process all the deletions are performed by the Nettoyage() C function
66 * which execute the destructions objects then deletes the destructions objects themselves ;
67 * -# the Nettoyage() C function is recorded using atexit() C function through the creation of a static
68 * single object ATEXIT_().
72 template <class TYPE> class SINGLETON_
77 static TYPE *Instance( void ); //!< Singleton dynamic creation using the default builder
78 static bool IsAlreadyExisting( void ); //!< returns True if the singleton is already existing
79 static int Destruction( void ); //!< destroys the Singleton before the end of the application process
84 static SINGLETON_ *PtrSingleton ;
89 } ; /* class SINGLETON_<TYPE> */
94 template <class TYPE> SINGLETON_<TYPE> *SINGLETON_<TYPE>::PtrSingleton=NULL ;
99 * The class method Instance :
100 * -# creates an object of class TYPE ;
101 * -# creates a destruction object DESTRUCTEUR_DE_<TYPE> which is appended to the list of destruction objects to be
103 * -# returns a pointer to the created object.
105 * Note that the two created objects are deleted at the end of the process in the function Nettoyage().
107 template <class TYPE> TYPE *SINGLETON_<TYPE>::Instance( void )
109 if ( ! PtrSingleton )
111 //MESSAGE("SINGLETON_<TYPE>::Instance( void )") ;
112 PtrSingleton = new SINGLETON_<TYPE> ;
113 new DESTRUCTEUR_DE_<TYPE>( PtrSingleton->_Instance ) ;
115 return &PtrSingleton->_Instance ;
119 template <class TYPE> bool SINGLETON_<TYPE>::IsAlreadyExisting( void )
121 return PtrSingleton ? true : false ;
127 template <class TYPE> SINGLETON_<TYPE>::SINGLETON_( void )
129 //MESSAGE("CREATION d'un SINGLETON_") ;
136 The method SINGLETON_<TYPE>::Destruction can be called by the user. If it is not
137 the function nettoyage() calls it atexit.
139 N.B. : the singleton objects are destroyed in the reverse order of there creation.
141 template <class TYPE> int SINGLETON_<TYPE>::Destruction( void )
144 //BEGIN_OF("SINGLETON_<TYPE>::Destruction( void )") ;
147 //MESSAGE("Destruction du SINGLETON_") ;
150 std::list<DESTRUCTEUR_GENERIQUE_ *>::iterator k ;
151 for( k=DESTRUCTEUR_GENERIQUE_::Destructeurs->begin() ; k!=DESTRUCTEUR_GENERIQUE_::Destructeurs->end();k++)
153 if ( *k == PtrSingleton->_Instance )
155 DESTRUCTEUR_GENERIQUE_::Destructeurs->erase( k ) ;
159 delete PtrSingleton ;
160 PtrSingleton = NULL ;
162 //END_OF("SINGLETON_<TYPE>::Destruction( void )") ;
167 template <class TYPE> SINGLETON_<TYPE>::~SINGLETON_()
169 //MESSAGE("passage dans SINGLETON_<TYPE>::~SINGLETON_( void )") ;
172 # endif /* # if !defined( __SINGLETON__H__ ) */