Array tests, allocator design changes
This commit is contained in:
47
arena.h
47
arena.h
@@ -26,24 +26,10 @@ typedef struct M_Allocator M_Allocator;
|
||||
#define MA_COMMIT_ADD_SIZE MA_MIB(4)
|
||||
#endif
|
||||
|
||||
#ifndef MA_INHERIT_HOOK
|
||||
#define MA_INHERIT_HOOK
|
||||
#endif
|
||||
|
||||
#ifndef MA_C_INHERIT_HOOK
|
||||
#define MA_C_INHERIT_HOOK M_Allocator allocator;
|
||||
#endif
|
||||
|
||||
#ifndef MA_ZERO_IS_INITIALIZATION
|
||||
#define MA_ZERO_IS_INITIALIZATION 1
|
||||
#endif
|
||||
|
||||
#ifndef MA_INIT_HOOK
|
||||
#define MA_INIT_HOOK(arena) \
|
||||
arena->allocator.obj = (void *)arena; \
|
||||
arena->allocator.p = (M_AllocatorProc *)MA_AllocatorProc;
|
||||
#endif
|
||||
|
||||
#ifndef MA_API
|
||||
#ifdef __cplusplus
|
||||
#define MA_API extern "C"
|
||||
@@ -72,12 +58,16 @@ typedef enum M_AllocatorOp {
|
||||
M_AllocatorOp_Invalid,
|
||||
M_AllocatorOp_Allocate,
|
||||
M_AllocatorOp_Deallocate,
|
||||
M_AllocatorOp_Reallocate,
|
||||
} M_AllocatorOp;
|
||||
|
||||
typedef void *M_AllocatorProc(void *allocator, M_AllocatorOp kind, void *p, size_t size);
|
||||
typedef void *M_AllocatorProc(void *allocator, M_AllocatorOp kind, void *p, size_t size, size_t old_size);
|
||||
MA_API void *MA_AllocatorProc(void *allocator, M_AllocatorOp kind, void *p, size_t size, size_t old_size);
|
||||
MA_API void *MA_ExclusiveAllocatorProc(void *allocator, M_AllocatorOp kind, void *p, size_t size, size_t old_size);
|
||||
|
||||
struct M_Allocator {
|
||||
void *obj;
|
||||
void *(*p)(void *allocator, M_AllocatorOp kind, void *p, size_t size);
|
||||
M_AllocatorProc *p;
|
||||
};
|
||||
|
||||
struct MV_Memory {
|
||||
@@ -86,15 +76,14 @@ struct MV_Memory {
|
||||
uint8_t *data;
|
||||
};
|
||||
|
||||
struct MA_Arena MA_INHERIT_HOOK {
|
||||
MA_C_INHERIT_HOOK
|
||||
struct MA_Arena {
|
||||
MV_Memory memory;
|
||||
int alignment;
|
||||
int saved_alignment;
|
||||
size_t len;
|
||||
|
||||
size_t packed_array_element_size;
|
||||
size_t packed_array_begin;
|
||||
#ifdef __cplusplus
|
||||
operator M_Allocator() { return {this, MA_AllocatorProc}; }
|
||||
#endif
|
||||
};
|
||||
|
||||
struct MA_Checkpoint {
|
||||
@@ -107,7 +96,6 @@ struct MA_Checkpoint {
|
||||
#define MA_PushStruct(a, T) (T *)MA_PushSize(a, sizeof(T))
|
||||
#define MA_PushArray(a, T, c) (T *)MA_PushSize(a, sizeof(T) * (c))
|
||||
#define MA_PushStructCopy(a, T, p) (T *)MA_PushCopy(a, (p), sizeof(T))
|
||||
#define MA_BeginPackedArray(arena, T) (T *)MA__BeginPackedArray(arena, sizeof(T))
|
||||
#define MA_CheckpointScope(name, InArena) for (MA_Checkpoint name = MA_Save(InArena); name.arena; (MA_Load(name), name.arena = 0))
|
||||
|
||||
#define M_AllocStruct(a, T) (T *)M_Alloc((a), sizeof(T))
|
||||
@@ -130,18 +118,20 @@ 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 void * MA__BeginPackedArray(MA_Arena *arena, size_t element_size);
|
||||
MA_API int MA_EndPackedArray(MA_Arena *arena);
|
||||
|
||||
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_InitEx(MA_Arena *a, size_t reserve);
|
||||
MA_API void MA_Init(MA_Arena *a);
|
||||
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);
|
||||
@@ -155,7 +145,6 @@ 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 void * MA_AllocatorProc(M_Allocator allocator, M_AllocatorOp kind, void *p, size_t size);
|
||||
|
||||
MA_API MV_Memory MV_Reserve(size_t size);
|
||||
MA_API bool MV_Commit(MV_Memory *m, size_t commit);
|
||||
@@ -165,8 +154,11 @@ MA_API bool MV_DecommitPos(MV_Memory *m, size_t pos);
|
||||
MA_API void * M_AllocNonZeroed(M_Allocator allocator, size_t size);
|
||||
MA_API void * M_Alloc(M_Allocator allocator, size_t size);
|
||||
MA_API void * M_AllocCopy(M_Allocator allocator, void *p, size_t size);
|
||||
MA_API void * M_ReallocNonZeroed(M_Allocator allocator, void *p, size_t size, size_t old_size);
|
||||
MA_API void M_Dealloc(M_Allocator allocator, void *p);
|
||||
MA_API M_Allocator M_GetSystemAllocator(void);
|
||||
MA_API M_Allocator MA_GetExclusiveAllocator(MA_Arena *arena);
|
||||
MA_API M_Allocator MA_GetAllocator(MA_Arena *arena);
|
||||
// clang-format on
|
||||
|
||||
#ifndef MA_DISABLE_SCRATCH
|
||||
@@ -180,6 +172,7 @@ struct MA_Scratch {
|
||||
MA_Scratch() { this->checkpoint = MA_GetScratch(); }
|
||||
~MA_Scratch() { MA_Load(checkpoint); }
|
||||
operator MA_Arena *() { return checkpoint.arena; }
|
||||
operator M_Allocator() { return MA_GetAllocator(checkpoint.arena); }
|
||||
|
||||
private: // @Note: Disable copy constructors, cause its error prone
|
||||
MA_Scratch(MA_Scratch &arena);
|
||||
|
||||
Reference in New Issue
Block a user