#ifndef LAE_ARENA_H #define LAE_ARENA_H #include #include #include #include typedef struct Arena 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; ArenaErr arena_init(Arena** arena, size_t capacity); ArenaErr 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); ArenaSizeResult 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 // !RENA_H