sead
Loading...
Searching...
No Matches
seadDisposer.h
Go to the documentation of this file.
1#ifndef SEAD_DISPOSER_H_
2#define SEAD_DISPOSER_H_
3
4#include <basis/seadNew.h>
5#include <container/seadListImpl.h>
6
7namespace sead {
8
9class Heap;
10
12{
13public:
14 IDisposer();
15 virtual ~IDisposer();
16
17private:
20
21 friend class Heap;
22};
23#ifdef cafe
24static_assert(sizeof(IDisposer) == 0x10, "sead::IDisposer size mismatch");
25#endif // cafe
26
27} // namespace sead
28
29#define SEAD_SINGLETON_DISPOSER(CLASS)
30 public:
31 static CLASS* instance() { return sInstance; }
32 static CLASS* createInstance(sead::Heap* heap);
33 static void deleteInstance();
34
35 protected:
36 class SingletonDisposer_ : public sead::IDisposer
37 {
38 public:
39 SingletonDisposer_() : sead::IDisposer() { }
40 ~SingletonDisposer_() override;
41
42 static SingletonDisposer_* sStaticDisposer;
43 };
44
45 private:
46 CLASS(const CLASS&);
47 const CLASS& operator=(const CLASS&);
48
49 protected:
50 u32 mSingletonDisposerBuf_[sizeof(SingletonDisposer_) / sizeof(u32)];
51
52 static CLASS* sInstance;
53
54 friend class SingletonDisposer_;
55
56#define SEAD_CREATE_SINGLETON_INSTANCE(CLASS)
57 CLASS* CLASS::createInstance(sead::Heap* heap)
58 {
59 CLASS::SingletonDisposer_* staticDisposer = CLASS::SingletonDisposer_::sStaticDisposer;
60 CLASS* instance = CLASS::sInstance;
61
62 if (CLASS::sInstance == nullptr)
63 {
64 instance = reinterpret_cast<CLASS*>(new(heap, 4) u8[sizeof(CLASS)]);
65
66 /*SEAD_ASSERT_MSG(staticDisposer == nullptr, "Create Singleton Twice (%s).", "CLASS");*/
67 staticDisposer = reinterpret_cast<CLASS::SingletonDisposer_*>(instance->mSingletonDisposerBuf_);
68
69 CLASS::SingletonDisposer_::sStaticDisposer = new (staticDisposer) SingletonDisposer_();
70 CLASS::sInstance = new (instance) CLASS;
71 }
72 else
73 {
74 /*SEAD_ASSERT_MSG(false, "Create Singleton Twice (%s) : addr %x", "CLASS", CLASS::sInstance);*/
75 }
76
77 return CLASS::sInstance;
78 }
79
80#define SEAD_DELETE_SINGLETON_INSTANCE(CLASS)
81 void CLASS::deleteInstance()
82 {
83 CLASS::SingletonDisposer_* staticDisposer = CLASS::SingletonDisposer_::sStaticDisposer;
84 if (CLASS::SingletonDisposer_::sStaticDisposer != nullptr)
85 {
86 CLASS::SingletonDisposer_::sStaticDisposer = nullptr;
87 staticDisposer->~SingletonDisposer_();
88
89 if (CLASS::sInstance != nullptr)
90 delete CLASS::sInstance;
91
92 CLASS::sInstance = nullptr;
93 }
94 }
95
96#define SEAD_SINGLETON_DISPOSER_IMPL(CLASS)
97 CLASS* CLASS::sInstance = nullptr;
98 CLASS::SingletonDisposer_* CLASS::SingletonDisposer_::sStaticDisposer = nullptr;
99
102
103 CLASS::SingletonDisposer_::~SingletonDisposer_()
104 {
105 if (this == sStaticDisposer)
106 {
107 sStaticDisposer = nullptr;
108 CLASS::sInstance->~CLASS();
109 CLASS::sInstance = nullptr;
110 }
111 }
112
113#endif // SEAD_DISPOSER_H_
Definition seadHeap.h:23
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