44 lines
810 B
C
44 lines
810 B
C
#include "arena.h"
|
|
#include <stdint.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
void arena_init(Arena* a)
|
|
{
|
|
a->data = NULL;
|
|
a->size = 0;
|
|
a->capacity = 0;
|
|
}
|
|
|
|
void* arena_alloc(Arena* a, size_t size)
|
|
{
|
|
// simple alignment to 8 bytes
|
|
size = (size + 7) & ~((size_t)7);
|
|
|
|
if (a->size + size > a->capacity) {
|
|
size_t new_cap = a->capacity ? a->capacity * 2 : 1024;
|
|
|
|
while (new_cap < a->size + size)
|
|
new_cap *= 2;
|
|
|
|
uint8_t* new_data = realloc(a->data, new_cap);
|
|
if (!new_data)
|
|
return NULL;
|
|
|
|
a->data = new_data;
|
|
a->capacity = new_cap;
|
|
}
|
|
|
|
void* ptr = a->data + a->size;
|
|
a->size += size;
|
|
return ptr;
|
|
}
|
|
|
|
void arena_free(Arena* a)
|
|
{
|
|
free(a->data);
|
|
a->data = NULL;
|
|
a->size = 0;
|
|
a->capacity = 0;
|
|
}
|