refactor-xmake #2

Merged
laentropia merged 5 commits from refactor-xmake into main 2026-06-10 10:30:26 -06:00
2 changed files with 30 additions and 23 deletions
Showing only changes of commit f3a5ecf807 - Show all commits

View File

@@ -1,4 +1,5 @@
#include "lae_arena.h" #include "lae_arena.h"
#include "lae_allocator.h"
#include <stdbool.h> #include <stdbool.h>
#include <stddef.h> #include <stddef.h>
#include <stdint.h> #include <stdint.h>
@@ -6,12 +7,12 @@
#include <string.h> #include <string.h>
struct Arena { struct Arena {
uint8_t* buffer; uint8_t *buffer;
size_t capacity; size_t capacity;
size_t offset; size_t offset;
}; };
ArenaErr arena_init(Arena** arena, size_t capacity) { ArenaErr arena_init(Arena **arena, size_t capacity) {
if (arena == NULL) { if (arena == NULL) {
return ARENA_NULL_ARG; return ARENA_NULL_ARG;
} }
@@ -20,20 +21,20 @@ ArenaErr arena_init(Arena** arena, size_t capacity) {
return ARENA_INVALID_SIZE; return ARENA_INVALID_SIZE;
} }
Arena* new_arena = malloc(sizeof(Arena)); Arena *new_arena = malloc(sizeof(Arena));
if (new_arena == NULL) { if (new_arena == NULL) {
return ARENA_BAD_ALLOC; return ARENA_BAD_ALLOC;
} }
void* buffer = malloc(capacity); void *buffer = malloc(capacity);
if (buffer == NULL) { if (buffer == NULL) {
return ARENA_BAD_ALLOC; return ARENA_BAD_ALLOC;
} }
*new_arena = (Arena){ *new_arena = (Arena){
.buffer = buffer, .buffer = buffer,
.capacity = capacity, .capacity = capacity,
.offset = 0, .offset = 0,
}; };
*arena = new_arena; *arena = new_arena;
@@ -41,14 +42,14 @@ ArenaErr arena_init(Arena** arena, size_t capacity) {
return ARENA_OK; return ARENA_OK;
} }
ArenaErr arena_destroy(Arena** arena) { ArenaErr arena_destroy(Arena **arena) {
if (arena == NULL || *arena == NULL) { if (arena == NULL || *arena == NULL) {
return ARENA_NULL_ARG; return ARENA_NULL_ARG;
} }
free((*arena)->buffer); free((*arena)->buffer);
(*arena)->buffer = NULL; (*arena)->buffer = NULL;
(*arena)->offset = 0; (*arena)->offset = 0;
(*arena)->capacity = 0; (*arena)->capacity = 0;
free(*arena); free(*arena);
*arena = NULL; *arena = NULL;
@@ -56,7 +57,7 @@ ArenaErr arena_destroy(Arena** arena) {
return ARENA_OK; return ARENA_OK;
} }
ArenaPointer arena_alloc(Arena* arena, size_t size, size_t alignment) { ArenaPointer arena_alloc(Arena *arena, size_t size, size_t alignment) {
if (arena == NULL) { if (arena == NULL) {
return (ArenaPointer){.is_valid = false, .err = ARENA_NULL_ARG}; return (ArenaPointer){.is_valid = false, .err = ARENA_NULL_ARG};
} }
@@ -85,18 +86,18 @@ ArenaPointer arena_alloc(Arena* arena, size_t size, size_t alignment) {
if (arena->offset > SIZE_MAX - padding.val - size) { if (arena->offset > SIZE_MAX - padding.val - size) {
return (ArenaPointer){.is_valid = false, return (ArenaPointer){.is_valid = false,
.err = ARENA_CAPACITY_OVERFLOW}; .err = ARENA_CAPACITY_OVERFLOW};
} }
size_t aligned_offset = arena->offset + padding.val; size_t aligned_offset = arena->offset + padding.val;
arena->offset = aligned_offset + size; arena->offset = aligned_offset + size;
return (ArenaPointer){.is_valid = true, return (ArenaPointer){.is_valid = true,
.offset = aligned_offset, .offset = aligned_offset,
.arena = arena}; .arena = arena};
} }
ArenaErr arena_ensure_capacity(Arena* arena, size_t size, size_t alignment) { ArenaErr arena_ensure_capacity(Arena *arena, size_t size, size_t alignment) {
if (arena == NULL) { if (arena == NULL) {
return ARENA_NULL_ARG; return ARENA_NULL_ARG;
} }
@@ -153,7 +154,7 @@ ArenaErr arena_ensure_capacity(Arena* arena, size_t size, size_t alignment) {
} }
ArenaPointer ArenaPointer
arena_push(Arena* arena, void* data, size_t size, size_t alignment) { arena_push(Arena *arena, void *data, size_t size, size_t alignment) {
if (arena == NULL || data == NULL) { if (arena == NULL || data == NULL) {
return (ArenaPointer){.is_valid = false, .err = ARENA_NULL_ARG}; return (ArenaPointer){.is_valid = false, .err = ARENA_NULL_ARG};
} }
@@ -181,7 +182,7 @@ arena_push(Arena* arena, void* data, size_t size, size_t alignment) {
return pointer; return pointer;
} }
ArenaErr arena_realloc(Arena* arena, size_t new_capacity) { ArenaErr arena_realloc(Arena *arena, size_t new_capacity) {
if (arena == NULL) { if (arena == NULL) {
return ARENA_NULL_ARG; return ARENA_NULL_ARG;
} }
@@ -190,17 +191,17 @@ ArenaErr arena_realloc(Arena* arena, size_t new_capacity) {
return ARENA_INVALID_SIZE; return ARENA_INVALID_SIZE;
} }
uint8_t* tmp = realloc(arena->buffer, new_capacity); uint8_t *tmp = realloc(arena->buffer, new_capacity);
if (tmp == NULL) { if (tmp == NULL) {
return ARENA_BAD_ALLOC; return ARENA_BAD_ALLOC;
} }
arena->buffer = tmp; arena->buffer = tmp;
arena->capacity = new_capacity; arena->capacity = new_capacity;
return ARENA_OK; return ARENA_OK;
} }
ArenaSizeResult arena_get_align_padding(Arena* arena, size_t alignment) { ArenaSizeResult arena_get_align_padding(Arena *arena, size_t alignment) {
if (arena == NULL) { if (arena == NULL) {
return (ArenaSizeResult){.is_valid = false, .err = ARENA_NULL_ARG}; return (ArenaSizeResult){.is_valid = false, .err = ARENA_NULL_ARG};
} }
@@ -211,13 +212,13 @@ ArenaSizeResult arena_get_align_padding(Arena* arena, size_t alignment) {
uintptr_t current_address = (uintptr_t)(arena->buffer + arena->offset); uintptr_t current_address = (uintptr_t)(arena->buffer + arena->offset);
size_t mask = alignment - 1; size_t mask = alignment - 1;
size_t padding = (size_t)(-current_address) & mask; size_t padding = (size_t)(-current_address) & mask;
return (ArenaSizeResult){.is_valid = true, .val = padding}; return (ArenaSizeResult){.is_valid = true, .val = padding};
} }
void* arena_unwrap_pointer(ArenaPointer p) { void *arena_unwrap_pointer(ArenaPointer p) {
if (!p.is_valid) { if (!p.is_valid) {
return NULL; return NULL;
} }

View File

@@ -31,7 +31,11 @@ option_end()
-- Packages -- Packages
-- ========================================================= -- =========================================================
-- Run xmake repo --add lae-repo https://laentropia-homelab.tail7368da.ts.net/laentropia/xmake-repo.git
-- to add my repo :)
add_requires("cmocka", { optional = true }) -- For tests add_requires("cmocka", { optional = true }) -- For tests
add_requires("lae_allocator")
-- ========================================================= -- =========================================================
-- Library -- Library
@@ -40,6 +44,8 @@ add_requires("cmocka", { optional = true }) -- For tests
target("lae_arena") target("lae_arena")
set_kind("static") set_kind("static")
add_packages("lae_allocator")
add_files("src/lae_arena.c") add_files("src/lae_arena.c")
add_headerfiles("include/*.h") add_headerfiles("include/*.h")