mirror of
https://github.com/zeldaret/ss
synced 2026-05-23 15:01:38 -04:00
56 lines
4.8 KiB
C++
56 lines
4.8 KiB
C++
#ifndef EGG_CORE_SINGLETON_H
|
|
#define EGG_CORE_SINGLETON_H
|
|
|
|
#include "egg/core/eggDisposer.h"
|
|
#include "egg/prim/eggAssert.h"
|
|
|
|
/**
|
|
* @brief Declares functions and data for a disposable singleton class
|
|
*/
|
|
#define EGG_SINGLETON_DECL(T) \
|
|
protected: \
|
|
class T__Disposer : public EGG::Disposer { \
|
|
public: \
|
|
virtual ~T__Disposer(); /* at 0x8 */ \
|
|
static T__Disposer *sStaticDisposer; \
|
|
}; \
|
|
\
|
|
T__Disposer mDisposer; \
|
|
\
|
|
public: \
|
|
static T *createInstance(); \
|
|
static void deleteInstance(); \
|
|
\
|
|
static T *instance() { \
|
|
return sInstance; \
|
|
} \
|
|
\
|
|
protected: \
|
|
static T *sInstance;
|
|
|
|
/**
|
|
* @brief Defines functions and data for a disposable singleton class
|
|
*/
|
|
#define EGG_SINGLETON_IMPL(T) \
|
|
T::T__Disposer::~T__Disposer() { \
|
|
T::deleteInstance(); \
|
|
} \
|
|
\
|
|
T *T::createInstance() { \
|
|
if (sInstance == NULL) { \
|
|
sInstance = new T(); \
|
|
} else { \
|
|
EGG_ASSERT_MSG(false, "Create Singleton Twice (%s) : addr %x\n", #T, sInstance); \
|
|
} \
|
|
\
|
|
return sInstance; \
|
|
} \
|
|
\
|
|
void T::deleteInstance() { \
|
|
sInstance = NULL; \
|
|
} \
|
|
\
|
|
T *T::sInstance = NULL;
|
|
|
|
#endif
|