addition: allocator generator and functions

This commit is contained in:
2026-06-08 19:10:38 -06:00
parent 2dcef95b2e
commit 73dc05bc63
3 changed files with 70 additions and 8 deletions

View File

@@ -30,6 +30,15 @@ typedef struct {
};
} ArenaPointer;
typedef struct {
bool is_valid;
union {
ArenaErr err;
Allocator allocator;
};
} ArenaAllocResult;
typedef struct {
bool is_valid;
union {
@@ -54,4 +63,6 @@ ArenaSizeResult arena_get_align_padding(Arena *arena, size_t alignment);
// I shouldn't cover.
ArenaErr arena_ensure_capacity(Arena *arena, size_t size, size_t alignment);
ArenaAllocResult arena_get_allocator(Arena *arena);
#endif // !RENA_H

View File

@@ -1,5 +1,6 @@
#include "lae_arena.h"
#include "lae_allocator.h"
#include <stdalign.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
@@ -14,6 +15,16 @@ struct Arena {
Allocator allocator;
};
static void *arena_allocator_alloc(void *ctx, size_t size, size_t alignment);
static void *arena_allocator_realloc(
void *ctx,
void *pointer,
size_t old_size,
size_t new_size,
size_t alignment);
static void
arena_allocator_free(void *ctx, void *pointer, size_t size, size_t alignment);
ArenaErr arena_init(Arena **arena, Allocator allocator, size_t capacity) {
if (arena == NULL) {
return ARENA_NULL_ARG;
@@ -23,14 +34,15 @@ ArenaErr arena_init(Arena **arena, Allocator allocator, size_t capacity) {
return ARENA_INVALID_SIZE;
}
Arena *new_arena = allocator.alloc(allocator.ctx, sizeof(Arena));
Arena *new_arena =
allocator.alloc(allocator.ctx, sizeof(Arena), alignof(Arena));
if (new_arena == NULL) {
return ARENA_BAD_ALLOC;
}
void *buffer = allocator.alloc(allocator.ctx, capacity);
void *buffer = allocator.alloc(allocator.ctx, capacity, 0);
if (buffer == NULL) {
allocator.free(allocator.ctx, new_arena, capacity);
allocator.free(allocator.ctx, new_arena, capacity, 0);
return ARENA_BAD_ALLOC;
}
@@ -52,11 +64,12 @@ ArenaErr arena_destroy(Arena **arena) {
}
Arena *tmp = *arena;
tmp->allocator.free(tmp->allocator.ctx, tmp->buffer, tmp->capacity);
tmp->allocator.free(tmp->allocator.ctx, tmp->buffer, tmp->capacity, 0);
tmp->buffer = NULL;
tmp->offset = 0;
tmp->capacity = 0;
tmp->allocator.free(tmp->allocator.ctx, *arena, sizeof(Arena));
tmp->allocator
.free(tmp->allocator.ctx, *arena, sizeof(Arena), alignof(Arena));
*arena = NULL;
return ARENA_OK;
@@ -200,7 +213,8 @@ ArenaErr arena_resize(Arena *arena, size_t new_capacity) {
arena->allocator.ctx,
arena->buffer,
arena->capacity,
new_capacity);
new_capacity,
0);
if (tmp == NULL) {
return ARENA_BAD_ALLOC;
}
@@ -233,3 +247,40 @@ void *arena_unwrap_pointer(ArenaPointer p) {
}
return p.arena->buffer + p.offset;
}
static void *arena_allocator_alloc(void *ctx, size_t size, size_t alignment) {
Arena *arena = ctx;
return arena_unwrap_pointer(arena_alloc(arena, size, alignment));
}
static void *arena_allocator_realloc(
void *ctx,
void *pointer,
size_t old_size,
size_t new_size,
size_t alignment) {
return NULL;
}
static void
arena_allocator_free(void *ctx, void *pointer, size_t size, size_t alignment) {
return;
}
ArenaAllocResult arena_get_allocator(Arena *arena) {
if (arena == NULL) {
return (ArenaAllocResult){
.is_valid = false,
.err = ARENA_NULL_ARG,
};
}
Allocator allocator = {
.alloc = arena_allocator_alloc,
.realloc = arena_allocator_realloc,
.free = arena_allocator_free,
.ctx = arena};
return (ArenaAllocResult){.is_valid = true, .allocator = allocator};
}

View File

@@ -78,12 +78,12 @@ if has_config("tests") then
target("test_arena")
set_kind("binary")
add_files("test/test_arena.c")
add_deps("lae_arena")
add_packages("cmocka")
add_files("test/test_arena.c")
add_tests("default")
if has_config("asan") then