73 lines
1.4 KiB
C
73 lines
1.4 KiB
C
#ifndef ARENA_H
|
|
#define ARENA_H
|
|
|
|
#include <stdlib.h>
|
|
|
|
extern void * aalloc(size_t size);
|
|
|
|
#endif
|
|
|
|
#ifdef ARENA_IMPLEMENTATION
|
|
|
|
#include <string.h>
|
|
|
|
#ifndef ARENA_CHUNK
|
|
#define ARENA_CHUNK (4096)
|
|
#endif
|
|
|
|
static struct {
|
|
size_t count;
|
|
size_t limit;
|
|
struct {
|
|
char * buffer;
|
|
size_t count;
|
|
size_t capacity;
|
|
} * * array;
|
|
} * arena = NULL;
|
|
|
|
static
|
|
void arena_deinit(void) {
|
|
for (size_t index = 0; index < arena->count; ++index) {
|
|
free(arena->array[index]->buffer);
|
|
free(arena->array[index]);
|
|
}
|
|
|
|
free(arena->array);
|
|
free(arena);
|
|
}
|
|
|
|
static
|
|
void arena_reinit(void) {
|
|
arena->count++;
|
|
arena->array = realloc(arena->array, arena->count * sizeof(*arena->array));
|
|
|
|
arena->array[arena->count - 1] = calloc(1, sizeof(*arena));
|
|
|
|
arena->array[arena->count - 1]->buffer = calloc(ARENA_CHUNK, 1);
|
|
arena->array[arena->count - 1]->count = 0;
|
|
arena->array[arena->count - 1]->capacity = ARENA_CHUNK;
|
|
}
|
|
|
|
void * aalloc(size_t size) {
|
|
size_t spot = 0;
|
|
|
|
if (arena == NULL) {
|
|
atexit(arena_deinit);
|
|
arena = calloc(1, sizeof(*arena));
|
|
arena_reinit();
|
|
}
|
|
|
|
if (arena->array[arena->count - 1]->count + size
|
|
>= arena->array[arena->count - 1]->capacity) {
|
|
arena_reinit();
|
|
}
|
|
|
|
spot = arena->array[arena->count - 1]->count;
|
|
|
|
arena->array[arena->count - 1]->count += size;
|
|
|
|
return (void*)&arena->array[arena->count - 1]->buffer[spot];
|
|
}
|
|
|
|
#endif
|