From 43953da780daa66bbec3877683b92d77fb517f50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hugo=20M=C3=A5rdbrink?= Date: Sat, 19 Apr 2025 14:59:45 +0200 Subject: [PATCH] Add dynamic array functionality --- include/htd/data_structure/dynamic_array.h | 6 ++++++ src/data_structure/dynamic_array.c | 19 +++++++++++++++++++ tests/test_dynamic_array.c | 12 ++++++++++++ 3 files changed, 37 insertions(+) diff --git a/include/htd/data_structure/dynamic_array.h b/include/htd/data_structure/dynamic_array.h index 2196f86..ff5d4a5 100644 --- a/include/htd/data_structure/dynamic_array.h +++ b/include/htd/data_structure/dynamic_array.h @@ -19,4 +19,10 @@ void dynarr_push(DynamicArray* arr, void* data); void dynarr_free(DynamicArray* arr); +void* dynarr_last(DynamicArray* arr); + +void dynarr_remove(DynamicArray* arr, usize idx); + +void* dynarr_pop(DynamicArray* arr); + #endif // DYNAMIC_ARRAY_H diff --git a/src/data_structure/dynamic_array.c b/src/data_structure/dynamic_array.c index ef9c5d4..0511ba5 100644 --- a/src/data_structure/dynamic_array.c +++ b/src/data_structure/dynamic_array.c @@ -18,6 +18,16 @@ void* dynarr_at(DynamicArray* arr, usize idx) { return &((u8*)arr->data)[arr->data_size * idx]; } +void* dynarr_last(DynamicArray* arr) { + return &((u8*)arr->data)[arr->data_size * (arr->len - 1)]; +} + +void dynarr_remove(DynamicArray* arr, usize idx) { + void* data = dynarr_at(arr, idx); + memmove(data, &((u8*)arr->data)[arr->data_size * (idx + 1)], (arr->len - idx - 1) * arr->data_size); + arr->len--; +} + void dynarr_push(DynamicArray* arr, void* data) { if (arr->len >= arr->capacity) { arr->capacity *= GROWTH_FACTOR; @@ -28,6 +38,15 @@ void dynarr_push(DynamicArray* arr, void* data) { arr->len++; } +void* dynarr_pop(DynamicArray* arr) { + if (arr->len == 0) { + return NULL; + } + + arr->len--; + return dynarr_last(arr); +} + void dynarr_free(DynamicArray* arr) { free(arr->data); arr->data = NULL; diff --git a/tests/test_dynamic_array.c b/tests/test_dynamic_array.c index 0de6cc3..8074671 100644 --- a/tests/test_dynamic_array.c +++ b/tests/test_dynamic_array.c @@ -16,5 +16,17 @@ int main() { assert(*(i32*)dynarr_at(&i32_array, i) == i); } + for (i32 i = 0; i < 100; i++) { + dynarr_pop(&i32_array); + assert(i32_array.len == 99 - i); + } + + for (i32 i = 0; i < 100; i++) { + dynarr_push(&i32_array, &i); + } + dynarr_remove(&i32_array, 50); + assert(i32_array.len == 99); + assert(*(i32*)dynarr_at(&i32_array, 50) == 51); + dynarr_free(&i32_array); }