Files
botw/lib/sead/include/container/seadFreeList.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

75 lines
1.4 KiB
C++

#pragma once
#include <new>
#include "basis/seadRawPrint.h"
#include "basis/seadTypes.h"
namespace sead
{
class FreeList
{
public:
void setWork(void* work, s32 elem_size, s32 num);
void reset();
void* alloc();
void free(void* ptr);
void* getFree() const { return mFree; }
void* work() const { return mWork; }
static const size_t cPtrSize = sizeof(void*);
private:
struct Node
{
Node* nextFree;
};
Node* mFree = nullptr;
void* mWork = nullptr;
};
inline void FreeList::setWork(void* work, s32 elem_size, s32 num)
{
SEAD_ASSERT(work);
SEAD_ASSERT(elem_size > 0 && elem_size % cPtrSize == 0);
SEAD_ASSERT(num > 0);
const s32 idx_multiplier = elem_size / cPtrSize;
void** const ptrs = new (work) void*[num * idx_multiplier];
mFree = new (work) Node;
// Create the linked list.
for (s32 i = 0; i < num - 1; ++i)
new (&ptrs[i * idx_multiplier]) Node{new (&ptrs[(i + 1) * idx_multiplier]) Node};
new (&ptrs[(num - 1) * idx_multiplier]) Node{nullptr};
mWork = work;
}
inline void FreeList::reset()
{
mFree = nullptr;
mWork = nullptr;
}
inline void* FreeList::alloc()
{
if (!mFree)
return nullptr;
void* ptr = mFree;
mFree = mFree->nextFree;
return ptr;
}
inline void FreeList::free(void* ptr)
{
mFree = new (ptr) Node{mFree};
}
} // namespace sead