#pragma once #include #include "common.h" typedef struct Arena { void *mem, *top, *lim; } Arena; Arena *arena_init(void *mem, ptrdiff_t size); void *arena_alloc_aligned(Arena *arena, ptrdiff_t size, ptrdiff_t align); void *arena_realloc_aligned(Arena *arena, void *ptr, ptrdiff_t old_size, ptrdiff_t new_size, ptrdiff_t align); void arena_clear(Arena *arena); void arena_clear_overwrite(Arena *arena); void arena_clear_overwrite_with(Arena *arena, u8 value); #if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L /* C11 */ #define ALIGNOF(t) _Alignof(t) #elif __GNUC__ #define ALIGNOF(t) __alignof(t) #else #error "No alignof" #endif #define ARENA_ALLOC(a, t) ((t *)arena_alloc_aligned(a, sizeof(t), ALIGNOF(t))) #define ARENA_ALLOC_ARRAY(a, t, n) ((t *)arena_alloc_aligned(a, sizeof(t) * n, ALIGNOF(t))) #define ARENA_REALLOC_ARRAY(a, t, p, old_n, new_n) ((t *)arena_realloc_aligned(a, p, sizeof(t) * old_n, sizeof(t) * new_n, ALIGNOF(t))) static inline void * arena_copy_array(Arena *arena, void *ptr, isize size, isize align) { void *result = arena_alloc_aligned(arena, size, align); if (result) { memcpy(result, ptr, size); } return result; } #define ARENA_COPY_ARRAY(a, t, p, n) ((t *)arena_copy_array(a, p, sizeof(t) * n, ALIGNOF(t)))