Files
pcas/src/libCom/cxxTemplates/epicsSingleton.h
T
2002-04-19 17:54:44 +00:00

104 lines
2.0 KiB
C++

/*
* $Id$
*
* Author: Jeff O. Hill
*
*/
#ifndef epicsSingleton_h
#define epicsSingleton_h
#include "shareLib.h"
#include "epicsMutex.h"
#include "epicsGuard.h"
#include "epicsThread.h"
template < class TYPE >
class epicsSingleton {
public:
epicsSingleton ();
~epicsSingleton ();
TYPE * operator -> ();
const TYPE * operator -> () const;
TYPE & operator * ();
const TYPE & operator * () const;
TYPE * instance ();
const TYPE * instance () const;
bool isInstantiated () const;
private:
TYPE * pSingleton;
void factory ();
};
template < class TYPE >
inline epicsSingleton<TYPE>::epicsSingleton () : pSingleton ( 0 )
{
}
template < class TYPE >
inline epicsSingleton<TYPE>::~epicsSingleton ()
{
delete this->pSingleton;
}
epicsShareFunc epicsMutex & epicsSingletonPrivateMutex ();
template < class TYPE >
void epicsSingleton<TYPE>::factory ()
{
epicsGuard < epicsMutex > guard ( epicsSingletonPrivateMutex() );
if ( ! this->pSingleton ) {
this->pSingleton = new TYPE;
}
}
template < class TYPE >
inline TYPE * epicsSingleton<TYPE>::operator -> ()
{
if ( ! this->pSingleton ) {
this->factory ();
}
return this->pSingleton;
}
template < class TYPE >
inline const TYPE * epicsSingleton<TYPE>::operator -> () const
{
epicsSingleton<TYPE> *p = const_cast < epicsSingleton<TYPE> * > ( this );
return const_cast <const TYPE *> ( p->operator -> () );
}
template < class TYPE >
inline TYPE & epicsSingleton<TYPE>::operator * ()
{
return * this->operator -> ();
}
template < class TYPE >
inline const TYPE & epicsSingleton<TYPE>::operator * () const
{
return * this->operator -> ();
}
template < class TYPE >
inline TYPE * epicsSingleton<TYPE>::instance ()
{
return this->operator -> ();
}
template < class TYPE >
inline const TYPE * epicsSingleton<TYPE>::instance () const
{
return this->operator -> ();
}
template < class TYPE >
inline bool epicsSingleton<TYPE>::isInstantiated () const
{
return ( this->pSingleton ? true : false );
}
#endif // epicsSingleton_h