NSMBW-Decomp
A decompilation of New Super Mario Bros. Wii
Loading...
Searching...
No Matches
snd_FrameHeap.h
1#ifndef NW4R_SND_FRAME_HEAP_H
2#define NW4R_SND_FRAME_HEAP_H
3#include "nw4r/types_nw4r.h" // IWYU pragma: export
4#include "nw4r/ut.h" // IWYU pragma: export
5#include <revolution/MEM.h> // IWYU pragma: export
6
7namespace nw4r {
8namespace snd {
9namespace detail {
10
11class FrameHeap {
12public:
13 typedef void (*FreeCallback)(void *pBuffer, ulong size, void *pCallbackArg);
14
15public:
16 FrameHeap();
17 ~FrameHeap();
18
19 bool Create(void *pBase, ulong size);
20 void Destroy();
21 void Clear();
22 void *Alloc(ulong size, FreeCallback pCallback, void *pCallbackArg);
23
24 int SaveState();
25 void LoadState(int id);
26
27 int GetCurrentLevel() const;
28 ulong GetFreeSize() const;
29
30 bool IsValid() const {
31 return mHandle != NULL;
32 }
33
34private:
35 struct Block {
36 NW4R_UT_LINKLIST_NODE_DECL(); // at 0x0
37 void *mpBuffer; // at 0x8
38 ulong mSize; // at 0xC
39 FreeCallback mCallback; // at 0x10
40 void *mCallbackArg; // at 0x14
41
42 Block(void *pBuffer2, ulong size, FreeCallback pCallback, void *pCallbackArg)
43 : mSize(size), mCallback(pCallback), mCallbackArg(pCallbackArg), mpBuffer(pBuffer2) {}
44
45 ~Block() {
46 if (mCallback != NULL) {
47 mCallback(mpBuffer, mSize, mCallbackArg);
48 }
49 }
50 };
51
52 NW4R_UT_LINKLIST_TYPEDEF_DECL(Block);
53
54 struct Section {
55 NW4R_UT_LINKLIST_NODE_DECL(); // at 0x0
56 BlockList mBlockList; // at 0x8
57
58 ~Section() {
59 for (BlockList::Iterator it = mBlockList.GetEndIter(); it != mBlockList.GetBeginIter();) {
60 (--it)->~Block();
61 }
62 }
63
64 void AppendBlock(Block *pBlock) {
65 mBlockList.PushBack(pBlock);
66 }
67 };
68
69 NW4R_UT_LINKLIST_TYPEDEF_DECL(Section);
70
71 static const int BLOCK_BUFFER_SIZE = ROUND_UP(sizeof(Block), 32);
72 static const int HEAP_ALIGN = 32;
73
74private:
75 bool NewSection();
76 void ClearSection();
77
78private:
79 MEMiHeapHead *mHandle; // at 0x0
80 SectionList mSectionList; // at 0x4
81};
82
83} // namespace detail
84} // namespace snd
85} // namespace nw4r
86
87#endif