addition: allocator generator and functions
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user