diff --git a/include/arena.h b/include/arena.h index 62db6ca..5b743fd 100644 --- a/include/arena.h +++ b/include/arena.h @@ -50,7 +50,7 @@ ArenaResult arena_init(size_t capacity); void arena_destroy(Arena *arena); ArenaPointer arena_alloc(Arena *arena, size_t size, size_t alignment); -ArenaErr arena_push(Arena *arena, void *data, size_t size, size_t alignment); +ArenaPointer arena_push(Arena *arena, void *data, size_t size, size_t alignment); ArenaErr arena_realloc(Arena *arena, size_t new_capacity); SizeResult align_arena_offset(Arena *arena, size_t alignment); diff --git a/src/arena.c b/src/arena.c index f0e88cc..9bd16b3 100644 --- a/src/arena.c +++ b/src/arena.c @@ -82,27 +82,39 @@ ArenaPointer arena_alloc(Arena *arena, size_t size, size_t alignment) { return val; } -ArenaErr arena_push(Arena *arena, void *data, size_t size, size_t alignment) { +ArenaPointer arena_push(Arena *arena, void *data, size_t size, size_t alignment) { if (arena == NULL || data == NULL) { - return ARENA_NULL_ARG; + ArenaPointer bad_pointer = { + .is_valid = false, + .err = ARENA_NULL_ARG, + }; + return bad_pointer; } ArenaPointer pointer = arena_alloc(arena, size, alignment); if (!pointer.is_valid) { - return pointer.err; + return pointer; } while (!pointer.is_valid && pointer.err == ARENA_OUT_OF_SPACE) { size_t new_capacity; bool is_overflow = mul_size_t_safe(arena->capacity, 2, &new_capacity); if (is_overflow) { - return ARENA_CAPACITY_OVERFLOW; + ArenaPointer bad_pointer = { + .is_valid = false, + .err = ARENA_CAPACITY_OVERFLOW, + }; + return bad_pointer; } ArenaErr err = arena_realloc(arena, new_capacity); if (err != ARENA_OK) { - return err; + ArenaPointer bad_pointer = { + .is_valid = false, + .err = err, + }; + return bad_pointer; } pointer = arena_alloc(arena, size, alignment); @@ -113,7 +125,7 @@ ArenaErr arena_push(Arena *arena, void *data, size_t size, size_t alignment) { data, size); - return ARENA_OK; + return pointer; } ArenaErr arena_realloc(Arena *arena, size_t new_capacity) { diff --git a/test/test_arena.c b/test/test_arena.c index 02a75d8..c170407 100644 --- a/test/test_arena.c +++ b/test/test_arena.c @@ -1,6 +1,42 @@ -#include "arena.h" +#include #include +#include +#include +#include +#include +#include +#include + +#include "arena.h" + +static void test_push_3_ints(void **state) { + (void) state; + + ArenaResult value = arena_init(sizeof(int) * 3); + assert_true(value.is_valid); + Arena arena = value.arena; + + int int_to_push = 20; + ArenaPointer result = arena_push(&arena, &int_to_push, sizeof(int), alignof(int)); + assert_true(result.is_valid); + assert_int_equal(20, (int) *result.address); + + int_to_push = 30; + result = arena_push(&arena, &int_to_push, sizeof(int), alignof(int)); + assert_true(result.is_valid); + assert_int_equal(30, (int) *result.address); + + int_to_push = 40; + result = arena_push(&arena, &int_to_push, sizeof(int), alignof(int)); + assert_true(result.is_valid); + assert_int_equal(40, (int) *result.address); +} int main(void) { - return EXIT_SUCCESS; + const struct CMUnitTest tests[] = { + cmocka_unit_test(test_push_3_ints), + }; + + + return cmocka_run_group_tests(tests, NULL, NULL); }