refactor: changed to xmake, added lae_allocator dep
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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")
|
||||||
|
|||||||
Reference in New Issue
Block a user