1#include <heap/seadDisposer.h>
2#include <heap/seadHeap.h>
3#include <heap/seadHeapMgr.h>
4
5namespace
6{
7const u32 cDestructedFlag = 1;
8
9} // namespace
10
11namespace sead
12{
13IDisposer::IDisposer() : IDisposer(nullptr, HeapNullOption::UseSpecifiedOrContainHeap) {}
14
15IDisposer::IDisposer(Heap* const disposer_heap, HeapNullOption option)
16{
17 mDisposerHeap = disposer_heap;
18 if (mDisposerHeap)
19 {
20 mDisposerHeap->appendDisposer_(disposer: this);
21 return;
22 }
23
24 switch (option)
25 {
26 case HeapNullOption::AlwaysUseSpecifiedHeap:
27 SEAD_ASSERT_MSG(false, "disposer_heap must not be nullptr");
28 case HeapNullOption::UseSpecifiedOrContainHeap:
29 if (!sead::HeapMgr::sInstancePtr)
30 return;
31 mDisposerHeap = sead::HeapMgr::sInstancePtr->findContainHeap(ptr: this);
32 if (mDisposerHeap)
33 mDisposerHeap->appendDisposer_(disposer: this);
34 return;
35 case HeapNullOption::DoNotAppendDisposerIfNoHeapSpecified:
36 return;
37 case HeapNullOption::UseSpecifiedOrCurrentHeap:
38 if (!sead::HeapMgr::sInstancePtr)
39 return;
40 mDisposerHeap = sead::HeapMgr::sInstancePtr->getCurrentHeap();
41 if (mDisposerHeap)
42 mDisposerHeap->appendDisposer_(disposer: this);
43 return;
44 default:
45 SEAD_ASSERT_MSG(false, "illegal option[%d]", int(option));
46 return;
47 }
48}
49
50IDisposer::~IDisposer()
51{
52 if (reinterpret_cast<uintptr_t>(mDisposerHeap) != cDestructedFlag)
53 {
54 if (mDisposerHeap != NULL)
55 mDisposerHeap->removeDisposer_(disposer: this);
56
57 *reinterpret_cast<uintptr_t*>(&mDisposerHeap) = cDestructedFlag;
58 }
59}
60
61} // namespace sead
62