1 // SALOME Utils : general SALOME's definitions and tools
3 // Copyright (C) 2003 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
24 // File : Utils_SINGLETON.hxx
25 // Author : Antoine YESSAYAN, EDF
29 # if !defined( __SINGLETON__H__ )
30 # define __SINGLETON__H__
32 # include "Utils_DESTRUCTEUR_GENERIQUE.hxx"
39 * A singleton is a data which is created and deleted only once in the application.
40 * The C++ compiler allow the user to create static data before the first executable statement.
41 * They are deleted after the last statement.statement.
43 * The SINGLETON_ template class deals with dynamic singleton. It is useful for functor objects.
44 * For example, an object which, when created, connects the application to a system and
45 * disconnects the application at deletion.
50 * To create a single instance a POINT_ object :
52 * # include "Utils_SINGLETON.hxx"
54 * ptrPoint = SINGLETON_<POINT_>::Instance() ;
57 * <B>Design description</B>
59 * -# the user creates an object of class TYPE By using a class method : SINGLETON_<TYPE>::Instance() which
60 * returns a pointer to the single object ;
61 * -# this class method uses the default constructor to create an object ;
62 * -# at the same time, this class method reate a destructor object which is added to the generic list
63 * of destructors objects to be executed at the end of the application (atexit) ;
64 * -# at the end of the application process all the deletions are performed by the Nettoyage() C function
65 * which execute the destructions objects then deletes the destructions objects themselves ;
66 * -# the Nettoyage() C function is recorded using atexit() C function through the creation of a static
67 * single object ATEXIT_().
71 template <class TYPE> class SINGLETON_
76 static TYPE *Instance( void ); //!< Singleton dynamic creation using the default builder
77 static bool IsAlreadyExisting( void ); //!< returns True if the singleton is already existing
78 static int Destruction( void ); //!< destroys the Singleton before the end of the application process
83 static SINGLETON_ *PtrSingleton ;
88 } ; /* class SINGLETON_<TYPE> */
93 template <class TYPE> SINGLETON_<TYPE> *SINGLETON_<TYPE>::PtrSingleton=NULL ;
98 * The class method Instance :
99 * -# creates an object of class TYPE ;
100 * -# creates a destruction object DESTRUCTEUR_DE_<TYPE> which is appended to the list of destruction objects to be
102 * -# returns a pointer to the created object.
104 * Note that the two created objects are deleted at the end of the process in the function Nettoyage().
106 template <class TYPE> TYPE *SINGLETON_<TYPE>::Instance( void )
108 if ( ! PtrSingleton )
110 MESSAGE("SINGLETON_<TYPE>::Instance( void )") ;
111 PtrSingleton = new SINGLETON_<TYPE> ;
112 new DESTRUCTEUR_DE_<TYPE>( PtrSingleton->_Instance ) ;
114 return &PtrSingleton->_Instance ;
118 template <class TYPE> bool SINGLETON_<TYPE>::IsAlreadyExisting( void )
120 return PtrSingleton ? true : false ;
126 template <class TYPE> SINGLETON_<TYPE>::SINGLETON_( void )
128 MESSAGE("CREATION d'un SINGLETON_") ;
135 The method SINGLETON_<TYPE>::Destruction can be called by the user. If it is not
136 the function nettoyage() calls it atexit.
138 N.B. : the singleton objects are destroyed in the reverse order of there creation.
140 template <class TYPE> int SINGLETON_<TYPE>::Destruction( void )
143 BEGIN_OF("SINGLETON_<TYPE>::Destruction( void )") ;
146 MESSAGE("Destruction du SINGLETON_") ;
149 list<DESTRUCTEUR_GENERIQUE_ *>::iterator k ;
150 for( k=DESTRUCTEUR_GENERIQUE_::Destructeurs.begin() ; k!=DESTRUCTEUR_GENERIQUE_::Destructeurs.end();k++)
152 if ( *k == PtrSingleton->_Instance )
154 DESTRUCTEUR_GENERIQUE_::Destructeurs.erase( k ) ;
158 delete PtrSingleton ;
159 PtrSingleton = NULL ;
161 END_OF("SINGLETON_<TYPE>::Destruction( void )") ;
166 template <class TYPE> SINGLETON_<TYPE>::~SINGLETON_()
168 MESSAGE("passage dans SINGLETON_<TYPE>::~SINGLETON_( void )") ;
171 # endif /* # if !defined( __SINGLETON__H__ ) */