arena.h (1221B)
1 #ifndef KIT_ARENA_H 2 #define KIT_ARENA_H 3 4 #include "core/core.h" 5 #include "core/heap.h" 6 7 typedef struct ArenaBlock ArenaBlock; 8 9 struct Arena { 10 Heap* heap; 11 ArenaBlock* head; /* oldest block (allocation order); NULL until 1st alloc */ 12 ArenaBlock* cur_block; /* block currently being filled */ 13 u8* cur; /* bump cursor within cur_block */ 14 u8* end; /* end of cur_block's buffer */ 15 size_t block_size; /* base / minimum block size */ 16 size_t next_size; /* geometric size for the next freshly allocated block */ 17 }; 18 19 void arena_init(Arena*, Heap*, size_t block_size); 20 void arena_fini(Arena*); 21 void arena_reset(Arena*); 22 int arena_is_empty(const Arena*); 23 void* arena_alloc(Arena*, size_t size, size_t align); 24 void* arena_zalloc(Arena*, size_t size, size_t align); /* zeroed; NULL on OOM */ 25 char* arena_strdup(Arena*, const char* s, size_t len); 26 27 #define arena_new(a, T) ((T*)arena_alloc((a), sizeof(T), _Alignof(T))) 28 #define arena_znew(a, T) ((T*)arena_zalloc((a), sizeof(T), _Alignof(T))) 29 #define arena_array(a, T, n) \ 30 ((T*)arena_alloc((a), sizeof(T) * (size_t)(n), _Alignof(T))) 31 #define arena_zarray(a, T, n) \ 32 ((T*)arena_zalloc((a), sizeof(T) * (size_t)(n), _Alignof(T))) 33 34 #endif