mirror of
https://github.com/ACreTeam/ac-decomp
synced 2026-05-23 06:34:18 -04:00
136 lines
4.5 KiB
C++
136 lines
4.5 KiB
C++
#ifndef JKREXPHEAP_H
|
|
#define JKREXPHEAP_H
|
|
|
|
#include "JSystem/JKernel/JKRHeap.h"
|
|
#include "types.h"
|
|
|
|
#ifdef __cplusplus
|
|
class JKRExpHeap : public JKRHeap {
|
|
public:
|
|
class CMemBlock {
|
|
public:
|
|
CMemBlock* allocBack(u32, u8, u8, u8, u8);
|
|
CMemBlock* allocFore(u32, u8, u8, u8, u8);
|
|
void* free(JKRExpHeap*);
|
|
static CMemBlock* getHeapBlock(void*);
|
|
void initiate(CMemBlock*, CMemBlock*, u32, u8, u8);
|
|
|
|
void newGroupId(u8 groupId) {
|
|
mGroupID = groupId;
|
|
}
|
|
bool isValid() const {
|
|
return mUsageHeader == 'HM';
|
|
}
|
|
bool _isTempMemBlock() const {
|
|
return (mFlags & 0x80) ? true : false;
|
|
}
|
|
int getAlignment() const {
|
|
return mFlags & 0x7f;
|
|
}
|
|
void* getContent() const {
|
|
return (void*)(this + 1);
|
|
}
|
|
CMemBlock* getPrevBlock() const {
|
|
return mPrev;
|
|
}
|
|
CMemBlock* getNextBlock() const {
|
|
return mNext;
|
|
}
|
|
u32 getSize() const {
|
|
return mAllocatedSpace;
|
|
}
|
|
u8 getGroupId() const {
|
|
return mGroupID;
|
|
}
|
|
static CMemBlock* getBlock(void* data) {
|
|
return (CMemBlock*)((u32)data + -0x10);
|
|
}
|
|
|
|
u16 mUsageHeader; // _00
|
|
u8 mFlags; // _02, a|bbbbbbb = a=temp, b=aln
|
|
u8 mGroupID; // _03
|
|
int mAllocatedSpace; // _04
|
|
CMemBlock* mPrev; // _08
|
|
CMemBlock* mNext; // _0C
|
|
};
|
|
|
|
JKRExpHeap(void*, u32, JKRHeap*, bool);
|
|
|
|
virtual ~JKRExpHeap(); // _08
|
|
virtual void* do_alloc(u32, int); // _10
|
|
virtual void do_free(void*); // _14
|
|
virtual void do_freeTail(); // _18
|
|
virtual void do_freeAll(); // _1C
|
|
virtual s32 do_resize(void*, u32); // _20
|
|
virtual s32 do_getSize(void*); // _24
|
|
virtual s32 do_getFreeSize(); // _28
|
|
virtual s32 do_getTotalFreeSize(); // _2C
|
|
virtual bool check(); // _34
|
|
virtual bool dump_sort(); // _38
|
|
virtual bool dump(); // _3C
|
|
virtual s32 do_changeGroupID(u8); // _40
|
|
virtual void state_register(TState*, u32) const; // _48
|
|
virtual bool state_compare(const TState&, const TState&) const; // _4C
|
|
|
|
virtual u8 do_getCurrentGroupId() {
|
|
return mCurrentGroupID;
|
|
} // _44 (weak)
|
|
virtual u32 getHeapType() {
|
|
return 'EXPH';
|
|
} // _30 (weak)
|
|
|
|
void* allocFromHead(u32, int);
|
|
void* allocFromHead(u32);
|
|
void* allocFromTail(u32, int);
|
|
void* allocFromTail(u32);
|
|
void appendUsedList(CMemBlock*);
|
|
static JKRExpHeap* create(u32, JKRHeap*, bool);
|
|
static JKRExpHeap* create(void*, u32, JKRHeap*, bool);
|
|
static JKRExpHeap* createRoot(int, bool);
|
|
int freeGroup(u8 groupID);
|
|
void joinTwoBlocks(CMemBlock*);
|
|
void recycleFreeBlock(CMemBlock*);
|
|
void removeFreeBlock(CMemBlock*);
|
|
void setFreeBlock(CMemBlock*, CMemBlock*, CMemBlock*);
|
|
|
|
// unused/inlined:
|
|
void removeUsedBlock(CMemBlock*);
|
|
bool isEmpty();
|
|
s32 getUsedSize(u8 groupId) const;
|
|
|
|
CMemBlock* getHeadUsedList() const {
|
|
return mHeadUsedList;
|
|
}
|
|
void setAllocationMode(EAllocMode mode) {
|
|
mCurrentAllocMode = mode;
|
|
}
|
|
|
|
static s32 getUsedSize_(JKRExpHeap* expHeap) {
|
|
// s32 totalFreeSize = expHeap->getTotalFreeSize();
|
|
return expHeap->mSize - expHeap->getTotalFreeSize();
|
|
}
|
|
static u32 getState_(TState* state) {
|
|
return getState_buf_(state);
|
|
} // might instead be a pointer to a next state?
|
|
|
|
private:
|
|
// _00 = VTBL
|
|
// _00-_6C = JKRHeap
|
|
u8 mCurrentAllocMode; // _6C
|
|
u8 mCurrentGroupID; // _6D
|
|
u8 _6E; // _6E
|
|
void* _70; // _70
|
|
u32 _74; // _74
|
|
CMemBlock* mHead; // _78, free list
|
|
CMemBlock* mTail; // _7C, free list
|
|
CMemBlock* mHeadUsedList; // _80
|
|
CMemBlock* mTailUsedList; // _84
|
|
};
|
|
|
|
inline JKRExpHeap* JKRCreateExpHeap(u32 size, JKRHeap* parent, bool errorFlag) {
|
|
return JKRExpHeap::create(size, parent, errorFlag);
|
|
}
|
|
#endif
|
|
|
|
#endif /* JKREXPHEAP_H */
|