refactor: init and destroy, alloc now first ensures cap
its better usability and is better that it ensures capacity in alloc like that is what is supposed to be like damn, why i did it like that
This commit is contained in:
@@ -46,7 +46,7 @@ typedef struct {
|
||||
} ArenaSizeResult;
|
||||
|
||||
ArenaErr arena_init(Arena **arena, size_t capacity);
|
||||
void arena_destroy(Arena **arena);
|
||||
ArenaErr arena_destroy(Arena **arena);
|
||||
|
||||
ArenaPointer arena_alloc(Arena *arena, size_t size, size_t alignment);
|
||||
ArenaPointer arena_push(Arena *arena, void *data, size_t size, size_t alignment);
|
||||
|
||||
44
src/arena.c
44
src/arena.c
@@ -12,30 +12,49 @@ struct Arena {
|
||||
};
|
||||
|
||||
|
||||
ArenaResult arena_init(size_t capacity) {
|
||||
ArenaErr arena_init(Arena **arena, size_t capacity) {
|
||||
if (arena == NULL) {
|
||||
return ARENA_NULL_ARG;
|
||||
}
|
||||
|
||||
if (capacity < 1) {
|
||||
return (ArenaResult) {.is_valid = false, .err = ARENA_INVALID_SIZE};
|
||||
return ARENA_INVALID_SIZE;
|
||||
}
|
||||
|
||||
Arena *new_arena = malloc(sizeof(Arena));
|
||||
if (new_arena == NULL) {
|
||||
return ARENA_BAD_ALLOC;
|
||||
}
|
||||
|
||||
void *buffer = malloc(capacity);
|
||||
if (buffer == NULL) {
|
||||
return (ArenaResult) {.is_valid = false, .err = ARENA_BAD_ALLOC};
|
||||
return ARENA_BAD_ALLOC;
|
||||
}
|
||||
|
||||
Arena new_arena = {
|
||||
*new_arena = (Arena) {
|
||||
.buffer = buffer,
|
||||
.capacity = capacity,
|
||||
.offset = 0,
|
||||
};
|
||||
|
||||
return (ArenaResult) {.is_valid = true, .arena = new_arena};
|
||||
*arena = new_arena;
|
||||
|
||||
return ARENA_OK;
|
||||
}
|
||||
|
||||
void arena_destroy(Arena *arena) {
|
||||
free(arena->buffer);
|
||||
arena->buffer = NULL;
|
||||
arena->offset = 0;
|
||||
arena->capacity = 0;
|
||||
ArenaErr arena_destroy(Arena **arena) {
|
||||
if (arena == NULL || *arena == NULL) {
|
||||
return ARENA_NULL_ARG;
|
||||
}
|
||||
|
||||
free((*arena)->buffer);
|
||||
(*arena)->buffer = NULL;
|
||||
(*arena)->offset = 0;
|
||||
(*arena)->capacity = 0;
|
||||
free(arena);
|
||||
*arena = NULL;
|
||||
|
||||
return ARENA_OK;
|
||||
}
|
||||
|
||||
ArenaPointer arena_alloc(Arena *arena, size_t size, size_t alignment) {
|
||||
@@ -56,6 +75,11 @@ ArenaPointer arena_alloc(Arena *arena, size_t size, size_t alignment) {
|
||||
return (ArenaPointer) {.is_valid = false, .err = padding.err};
|
||||
}
|
||||
|
||||
ArenaErr cap_err = arena_ensure_capacity(arena, size, alignment);
|
||||
if(cap_err != ARENA_OK) {
|
||||
return (ArenaPointer) {.is_valid = false, .err = cap_err};
|
||||
}
|
||||
|
||||
if (arena->offset + padding.val + size > arena->capacity) {
|
||||
return (ArenaPointer) {.is_valid = false, .err = ARENA_OUT_OF_SPACE};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user