54 lines
965 B
C++
54 lines
965 B
C++
#pragma once
|
|
|
|
#include "common/IErrors.h"
|
|
|
|
#pragma warning(push)
|
|
#pragma warning(disable: 4311 4312)
|
|
|
|
/**
|
|
* A singleton base class
|
|
*
|
|
* Singletons are useful when you have a class that will be instantiated once,
|
|
* like a global manager.
|
|
*/
|
|
template <typename T>
|
|
class ISingleton
|
|
{
|
|
static T * ms_Singleton;
|
|
|
|
public:
|
|
ISingleton()
|
|
{
|
|
ASSERT(!ms_Singleton);
|
|
intptr_t offset = (intptr_t)(T *)1 - (intptr_t)(ISingleton <T> *)(T *)1;
|
|
ms_Singleton = (T *)((intptr_t)this + offset);
|
|
}
|
|
|
|
virtual ~ISingleton()
|
|
{
|
|
ASSERT(ms_Singleton);
|
|
ms_Singleton = 0;
|
|
}
|
|
|
|
/**
|
|
* Returns the single instance of the derived class
|
|
*/
|
|
static T& GetSingleton(void)
|
|
{
|
|
ASSERT(ms_Singleton);
|
|
return *ms_Singleton;
|
|
}
|
|
|
|
/**
|
|
* Returns a pointer to the single instance of the derived class
|
|
*/
|
|
static T * GetSingletonPtr(void)
|
|
{
|
|
return ms_Singleton;
|
|
}
|
|
};
|
|
|
|
template <typename T> T * ISingleton <T>::ms_Singleton = 0;
|
|
|
|
#pragma warning(pop)
|