1#ifndef SEAD_DISPOSER_H_
2#define SEAD_DISPOSER_H_
4#include <basis/seadNew.h>
5#include <container/seadListImpl.h>
24static_assert(
sizeof(
IDisposer) == 0x10,
"sead::IDisposer size mismatch");
29#define SEAD_SINGLETON_DISPOSER(CLASS)
31 static CLASS* instance() { return sInstance; }
32 static CLASS* createInstance(sead::Heap* heap);
33 static void deleteInstance();
36 class SingletonDisposer_ : public sead::IDisposer
39 SingletonDisposer_() : sead::IDisposer() { }
40 ~SingletonDisposer_() override;
42 static SingletonDisposer_* sStaticDisposer;
47 const CLASS& operator
=(const CLASS&);
50 u32 mSingletonDisposerBuf_[sizeof(SingletonDisposer_) / sizeof(u32)];
52 static CLASS* sInstance;
54 friend class SingletonDisposer_;
56#define SEAD_CREATE_SINGLETON_INSTANCE(CLASS)
57 CLASS* CLASS::createInstance(sead::Heap* heap)
59 CLASS::SingletonDisposer_* staticDisposer = CLASS::SingletonDisposer_::sStaticDisposer;
60 CLASS* instance = CLASS::sInstance;
62 if (CLASS::sInstance == nullptr)
64 instance = reinterpret_cast<CLASS*>(new(heap, 4
) u8[sizeof(CLASS)]);
67 staticDisposer = reinterpret_cast<CLASS::SingletonDisposer_*>(instance->mSingletonDisposerBuf_);
69 CLASS::SingletonDisposer_::sStaticDisposer = new (staticDisposer) SingletonDisposer_();
70 CLASS::sInstance = new (instance) CLASS;
77 return CLASS::sInstance;
80#define SEAD_DELETE_SINGLETON_INSTANCE(CLASS)
81 void CLASS::deleteInstance()
83 CLASS::SingletonDisposer_* staticDisposer = CLASS::SingletonDisposer_::sStaticDisposer;
84 if (CLASS::SingletonDisposer_::sStaticDisposer != nullptr)
86 CLASS::SingletonDisposer_::sStaticDisposer = nullptr;
87 staticDisposer->~SingletonDisposer_();
89 if (CLASS::sInstance != nullptr)
90 delete CLASS::sInstance;
92 CLASS::sInstance = nullptr;
96#define SEAD_SINGLETON_DISPOSER_IMPL(CLASS)
97 CLASS* CLASS::sInstance = nullptr;
98 CLASS::SingletonDisposer_* CLASS::SingletonDisposer_::sStaticDisposer = nullptr;
103 CLASS::SingletonDisposer_::~SingletonDisposer_()
105 if (this == sStaticDisposer)
107 sStaticDisposer = nullptr;
108 CLASS::sInstance->~CLASS();
109 CLASS::sInstance = nullptr;
friend IDisposer::~IDisposer()
friend IDisposer::IDisposer()
Definition seadDisposer.h:12
ListNode mListNode
Definition seadDisposer.h:19
Heap * mDisposerHeap
Definition seadDisposer.h:18
Definition seadListImpl.h:11
Definition seadAssert.h:44
#define SEAD_CREATE_SINGLETON_INSTANCE(CLASS)
Definition seadDisposer.h:56
#define SEAD_DELETE_SINGLETON_INSTANCE(CLASS)
Definition seadDisposer.h:80