Files
botw/lib/sead/include/heap/seadExpHeap.h
T
Léo Lam 18c60323a9 Switch to subrepos
git subrepo clone https://github.com/open-ead/sead lib/sead

subrepo:
  subdir:   "lib/sead"
  merged:   "1b66e825d"
upstream:
  origin:   "https://github.com/open-ead/sead"
  branch:   "master"
  commit:   "1b66e825d"
git-subrepo:
  version:  "0.4.3"
  origin:   "https://github.com/ingydotnet/git-subrepo"
  commit:   "2f68596"

git subrepo clone (merge) https://github.com/open-ead/nnheaders lib/NintendoSDK

subrepo:
  subdir:   "lib/NintendoSDK"
  merged:   "9ee21399f"
upstream:
  origin:   "https://github.com/open-ead/nnheaders"
  branch:   "master"
  commit:   "9ee21399f"
git-subrepo:
  version:  "0.4.3"
  origin:   "ssh://git@github.com/ingydotnet/git-subrepo"
  commit:   "2f68596"

git subrepo clone https://github.com/open-ead/agl lib/agl

subrepo:
  subdir:   "lib/agl"
  merged:   "7c063271b"
upstream:
  origin:   "https://github.com/open-ead/agl"
  branch:   "master"
  commit:   "7c063271b"
git-subrepo:
  version:  "0.4.3"
  origin:   "ssh://git@github.com/ingydotnet/git-subrepo"
  commit:   "2f68596"

git subrepo clone https://github.com/open-ead/EventFlow lib/EventFlow

subrepo:
  subdir:   "lib/EventFlow"
  merged:   "c35d21b34"
upstream:
  origin:   "https://github.com/open-ead/EventFlow"
  branch:   "master"
  commit:   "c35d21b34"
git-subrepo:
  version:  "0.4.3"
  origin:   "ssh://git@github.com/ingydotnet/git-subrepo"
  commit:   "2f68596"
2022-03-21 21:31:42 +01:00

111 lines
3.5 KiB
C++

#pragma once
#include "heap/seadHeap.h"
#include "heap/seadMemBlock.h"
#include "prim/seadSizedEnum.h"
namespace sead
{
class ExpHeap : public Heap
{
SEAD_RTTI_OVERRIDE(ExpHeap, Heap)
public:
enum class AllocMode
{
FirstFit = 0,
BestFit = 1,
};
enum class FindFreeBlockMode
{
Auto = 0,
FromFreeList = 1,
ByIteratingMemBlock = 2,
};
// FIXME: incomplete
enum class FindMode
{
};
static ExpHeap* create(size_t size, const SafeString& name, Heap* parent, s32 alignment,
HeapDirection direction, bool);
static ExpHeap* create(void* address, size_t size, const SafeString& name, bool);
static ExpHeap* tryCreate(size_t size, const SafeString& name, Heap* parent, s32 alignment,
HeapDirection direction, bool);
static ExpHeap* tryCreate(void* address, size_t size, const SafeString& name, bool);
static size_t getManagementAreaSize(s32);
void destroy() override;
size_t adjust() override;
void* tryAlloc(size_t size, s32 alignment) override;
void free(void* ptr) override;
void* resizeFront(void* p_void, size_t size) override;
void* resizeBack(void* p_void, size_t size) override;
void* tryRealloc(void* ptr, size_t size, s32 alignment) override;
void freeAll() override;
uintptr_t getStartAddress() const override;
uintptr_t getEndAddress() const override;
size_t getSize() const override;
size_t getFreeSize() const override;
size_t getMaxAllocatableSize(int alignment) const override;
bool isInclude(const void* p_void) const override;
bool isEmpty() const override;
bool isFreeable() const override;
bool isResizable() const override;
bool isAdjustable() const override;
void dump() const override;
void dumpYAML(WriteStream& stream, int i) const override;
void genInformation_(hostio::Context* context) override;
virtual s32 destroyAndGetAllocatableSize(s32);
virtual void setFindFreeBlockMode(FindFreeBlockMode mode);
AllocMode getAllocMode() const { return mAllocMode; }
void setAllocMode(AllocMode mode) { mAllocMode = mode; }
void dumpFreeList() const;
void dumpUseList() const;
void checkFreeList() const;
bool tryCheckFreeList() const;
void checkUseList() const;
bool tryCheckUseList() const;
protected:
ExpHeap(const SafeString& name, Heap* parent, void* address, size_t size,
HeapDirection direction, bool);
~ExpHeap() override;
static void doCreate(ExpHeap*, Heap*);
static void createMaxSizeFreeMemBlock_(ExpHeap*);
MemBlock* findFreeMemBlockFromHead_(size_t, FindMode) const;
MemBlock* findFreeMemBlockFromHead_(size_t, s32, FindMode) const;
MemBlock* findFreeMemBlockFromTail_(size_t, FindMode) const;
MemBlock* findFreeMemBlockFromTail_(size_t, s32, FindMode) const;
MemBlock* findLastMemBlockIfFree_();
MemBlock* findFirstMemBlockIfFree_();
void pushToUseList_(MemBlock*);
void pushToFreeList_(MemBlock*);
size_t adjustBack_();
size_t adjustFront_();
MemBlock* allocFromHead_(size_t);
MemBlock* allocFromHead_(size_t, s32);
MemBlock* allocFromTail_(size_t);
MemBlock* allocFromTail_(size_t, s32);
static s32 compareMemBlockAddr_(const MemBlock*, const MemBlock*);
SizedEnum<AllocMode, u8> mAllocMode;
SizedEnum<FindFreeBlockMode, u8> mFindFreeBlockMode;
MemBlockList mFreeList;
MemBlockList mUseList;
};
} // namespace sead