41 lines
1.3 KiB
C
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)))
|