advent-of-code-2024/aoc/arena.h

41 lines
1.3 KiB
C

#pragma once
#include <string.h>
#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)))