sead
Loading...
Searching...
No Matches
seadDisposer.h File Reference

Go to the source code of this file.

Classes

class  sead::IDisposer

Namespaces

namespace  sead

Macros

#define SEAD_SINGLETON_DISPOSER(CLASS)
#define SEAD_CREATE_SINGLETON_INSTANCE(CLASS)
#define SEAD_DELETE_SINGLETON_INSTANCE(CLASS)
#define SEAD_SINGLETON_DISPOSER_IMPL(CLASS)

Macro Definition Documentation

◆ SEAD_SINGLETON_DISPOSER

#define SEAD_SINGLETON_DISPOSER ( CLASS)
Value:
public: \
static CLASS* instance() { return sInstance; } \
static CLASS* createInstance(sead::Heap* heap); \
static void deleteInstance(); \
\
protected: \
class SingletonDisposer_ : public sead::IDisposer \
{ \
public: \
SingletonDisposer_() : sead::IDisposer() { } \
~SingletonDisposer_() override; \
\
static SingletonDisposer_* sStaticDisposer; \
}; \
\
private: \
CLASS(const CLASS&); \
const CLASS& operator=(const CLASS&); \
\
protected: \
u32 mSingletonDisposerBuf_[sizeof(SingletonDisposer_) / sizeof(u32)]; \
\
static CLASS* sInstance; \
\
friend class SingletonDisposer_;
Definition seadHeap.h:23
Definition seadDisposer.h:12
IDisposer()
Definition seadDisposer.cpp:14
Definition seadAssert.h:44

◆ SEAD_CREATE_SINGLETON_INSTANCE

#define SEAD_CREATE_SINGLETON_INSTANCE ( CLASS)
Value:
CLASS* CLASS::createInstance(sead::Heap* heap) \
{ \
CLASS::SingletonDisposer_* staticDisposer = CLASS::SingletonDisposer_::sStaticDisposer; \
CLASS* instance = CLASS::sInstance; \
\
if (CLASS::sInstance == nullptr) \
{ \
instance = reinterpret_cast<CLASS*>(new(heap, 4) u8[sizeof(CLASS)]); \
\
/*SEAD_ASSERT_MSG(staticDisposer == nullptr, "Create Singleton Twice (%s).", "CLASS");*/ \
staticDisposer = reinterpret_cast<CLASS::SingletonDisposer_*>(instance->mSingletonDisposerBuf_); \
\
CLASS::SingletonDisposer_::sStaticDisposer = new (staticDisposer) SingletonDisposer_(); \
CLASS::sInstance = new (instance) CLASS; \
} \
else \
{ \
/*SEAD_ASSERT_MSG(false, "Create Singleton Twice (%s) : addr %x", "CLASS", CLASS::sInstance);*/ \
} \
\
return CLASS::sInstance; \
}

◆ SEAD_DELETE_SINGLETON_INSTANCE

#define SEAD_DELETE_SINGLETON_INSTANCE ( CLASS)
Value:
void CLASS::deleteInstance() \
{ \
CLASS::SingletonDisposer_* staticDisposer = CLASS::SingletonDisposer_::sStaticDisposer; \
if (CLASS::SingletonDisposer_::sStaticDisposer != nullptr) \
{ \
CLASS::SingletonDisposer_::sStaticDisposer = nullptr; \
staticDisposer->~SingletonDisposer_(); \
\
if (CLASS::sInstance != nullptr) \
delete CLASS::sInstance; \
\
CLASS::sInstance = nullptr; \
} \
}

◆ SEAD_SINGLETON_DISPOSER_IMPL

#define SEAD_SINGLETON_DISPOSER_IMPL ( CLASS)
Value:
CLASS* CLASS::sInstance = nullptr; \
CLASS::SingletonDisposer_* CLASS::SingletonDisposer_::sStaticDisposer = nullptr; \
\
SEAD_CREATE_SINGLETON_INSTANCE(CLASS) \
SEAD_DELETE_SINGLETON_INSTANCE(CLASS) \
\
CLASS::SingletonDisposer_::~SingletonDisposer_() \
{ \
if (this == sStaticDisposer) \
{ \
sStaticDisposer = nullptr; \
CLASS::sInstance->~CLASS(); \
CLASS::sInstance = nullptr; \
} \
}