Add arena tests

This commit is contained in:
Krzosa Karol
2023-12-31 19:31:21 +01:00
parent 14f10cc836
commit 49068c9818
5 changed files with 95 additions and 39 deletions

57
arena.h
View File

@@ -112,39 +112,37 @@ struct MA_Checkpoint {
#define MA_CLAMP(x, min, max) ((x) >= (max) ? (max) : (x) <= (min) ? (min) \
: (x))
// clang-format off
MA_API void MA_InitEx(MA_Arena *a, size_t reserve);
MA_API void MA_Init(MA_Arena *a);
MA_API MA_Arena MA_Create();
MA_API void MA_MakeSureInitialized(MA_Arena *a);
MA_API MA_Arena * MA_Bootstrap(void);
MA_API void MA_InitFromBuffer(MA_Arena *arena, void *buffer, size_t size);
MA_API MA_Arena MA_MakeFromBuffer(void *buffer, size_t size);
MA_API MA_Arena MA_PushArena(MA_Arena *arena, size_t size);
MA_API void * MA_PushSizeNonZeroed(MA_Arena *a, size_t size);
MA_API void * MA_PushSize(MA_Arena *arena, size_t size);
MA_API char * MA_PushStringCopy(MA_Arena *arena, char *p, size_t size);
MA_API void * MA_PushCopy(MA_Arena *arena, void *p, size_t size);
MA_API MA_Checkpoint MA_Save(MA_Arena *arena);
MA_API void MA_Load(MA_Checkpoint checkpoint);
MA_API void MA_PopToPos(MA_Arena *arena, size_t pos);
MA_API void * MA_PopSize(MA_Arena *arena, size_t size);
MA_API void MA_DeallocateArena(MA_Arena *arena);
MA_API void MA_DeallocateStub(MA_Arena *arena, void *p);
MA_API void MA_Reset(MA_Arena *arena);
MA_API void MA_MemoryZero(void *p, size_t size);
MA_API void MA_MemoryCopy(void *dst, void *src, size_t size);
MA_API size_t MA_GetAlignOffset(size_t size, size_t align);
MA_API size_t MA_AlignUp(size_t size, size_t align);
MA_API size_t MA_AlignDown(size_t size, size_t align);
MA_API void MA_DeallocateStub(MA_Arena *arena, void *p);
MA_API void MA_InitEx(MA_Arena *a, size_t reserve);
MA_API void MA_Init(MA_Arena *a);
MA_API MA_Arena MA_Create();
MA_API void MA_PopToPos(MA_Arena *arena, size_t pos);
MA_API void * MA_PopSize(MA_Arena *arena, size_t size);
MA_API void MA_DeallocateArena(MA_Arena *arena);
MA_API void MA_Reset(MA_Arena *arena);
MA_API bool MA_IsPointerInside(MA_Arena *arena, void *p);
MA_API void MA_SetAlignment(MA_Arena *arena, int alignment);
MA_API uint8_t * MA_GetTop(MA_Arena *a);
MA_API void * MA_PushSizeNonZeroed(MA_Arena *a, size_t size);
MA_API void * MA_PushSize(MA_Arena *arena, size_t size);
MA_API void MA_MakeSureInitialized(MA_Arena *a);
MA_API MA_Arena * MA_Bootstrap(void);
MA_API void MA_InitFromBuffer(MA_Arena *arena, void *buffer, size_t size);
MA_API MA_Arena MA_MakeFromBuffer(void *buffer, size_t size);
MA_API char * MA_PushStringCopy(MA_Arena *arena, char *p, size_t size);
MA_API void * MA_PushCopy(MA_Arena *arena, void *p, size_t size);
MA_API bool MA_IsPointerInside(MA_Arena *arena, void *p);
MA_API MA_Arena MA_PushArena(MA_Arena *arena, size_t size);
MA_API MA_Checkpoint MA_Save(MA_Arena *arena);
MA_API void MA_Load(MA_Checkpoint checkpoint);
MA_API MA_Checkpoint MA_GetScratchEx(MA_Arena **conflicts, int conflict_count);
MA_API MA_Checkpoint MA_GetScratch(void);
MA_API MA_Checkpoint MA_GetScratch1(MA_Arena *conflict);
MA_API MV_Memory MV_Reserve(size_t size);
MA_API bool MV_Commit(MV_Memory *m, size_t commit);
@@ -163,6 +161,10 @@ MA_API M_Allocator MA_GetAllocator(MA_Arena *arena);
#ifndef MA_DISABLE_SCRATCH
extern MA_THREAD_LOCAL MA_Arena MA_ScratchArenaPool[];
MA_API MA_Checkpoint MA_GetScratchEx(MA_Arena **conflicts, int conflict_count);
MA_API MA_Checkpoint MA_GetScratch(void);
MA_API MA_Checkpoint MA_GetScratch1(MA_Arena *conflict);
#define MA_ScratchScope(x) for (MA_Checkpoint x = MA_GetScratch(); x.arena; (MA_ReleaseScratch(x), x.arena = 0))
#define MA_ReleaseScratch MA_Load
@@ -170,6 +172,11 @@ extern MA_THREAD_LOCAL MA_Arena MA_ScratchArenaPool[];
struct MA_Scratch {
MA_Checkpoint checkpoint;
MA_Scratch() { this->checkpoint = MA_GetScratch(); }
MA_Scratch(MA_Checkpoint conflict) { this->checkpoint = MA_GetScratch1(conflict.arena); }
MA_Scratch(MA_Checkpoint c1, MA_Checkpoint c2) {
MA_Arena *conflicts[] = {c1.arena, c2.arena};
this->checkpoint = MA_GetScratchEx(conflicts, 2);
}
~MA_Scratch() { MA_Load(checkpoint); }
operator MA_Arena *() { return checkpoint.arena; }
operator M_Allocator() { return MA_GetAllocator(checkpoint.arena); }