#ifndef ARENA_H #define ARENA_H #include #include #include #include typedef struct { uint8_t *buffer; size_t capacity; size_t offset; } Arena; typedef enum { ARENA_OK = 0, ARENA_BAD_ALLOC, ARENA_OUT_OF_SPACE, ARENA_NULL_ARG, ARENA_INVALID_SIZE, ARENA_INVALID_ALIGN, ARENA_CAPACITY_OVERFLOW, } ArenaErr; typedef struct { bool is_valid; union { ArenaErr err; struct { Arena *arena; size_t offset; }; }; } ArenaPointer; typedef struct { bool is_valid; union { ArenaErr err; Arena arena; }; } ArenaResult; typedef struct { bool is_valid; union { ArenaErr err; size_t val; }; } ArenaSizeResult; ArenaResult arena_init(size_t capacity); void arena_destroy(Arena *arena); ArenaPointer arena_alloc(Arena *arena, size_t size, size_t alignment); ArenaPointer arena_push(Arena *arena, void *data, size_t size, size_t alignment); ArenaErr arena_realloc(Arena *arena, size_t new_capacity); void *arena_unwrap_pointer(ArenaPointer p); SizeResult arena_get_align_padding(Arena *arena, size_t alignment); // can take big sizes but of sourse there is a limit, // its protected against SIZE_MAX but anything that // is big may break it, still, is an edge case that // I shouldn't cover. ArenaErr arena_ensure_capacity(Arena *arena, size_t size, size_t alignment); #endif // !ARENA_H