diff --git a/Include/Fledasty/Core/DynamicArray.h b/Include/Fledasty/Core/DynamicArray.h index a58098a..df7d978 100644 --- a/Include/Fledasty/Core/DynamicArray.h +++ b/Include/Fledasty/Core/DynamicArray.h @@ -51,6 +51,7 @@ FledastyError fledasty_dynamic_array_remove_at_index(FledastyDynamicArray *curre FledastyError fledasty_dynamic_array_remove_value(FledastyDynamicArray *current_dynamic_array, void *value); FledastyError fledasty_dynamic_array_clear(FledastyDynamicArray *current_dynamic_array); +FledastyError fledasty_dynamic_array_shrink_to_fit(FledastyDynamicArray *current_dynamic_array); bool fledasty_dynamic_array_has_value(const FledastyDynamicArray *current_dynamic_array, void *value); inline static bool fledasty_dynamic_array_is_empty(const FledastyDynamicArray *current_dynamic_array) { return current_dynamic_array == NULL || current_dynamic_array->size == 0; } diff --git a/Src/Core/DynamicArray.c b/Src/Core/DynamicArray.c index 462496d..01dc88d 100644 --- a/Src/Core/DynamicArray.c +++ b/Src/Core/DynamicArray.c @@ -22,6 +22,7 @@ * ----------------------------------------------------------------------------- */ #include "../../Include/Fledasty/Core/DynamicArray.h" +#include "Fledasty/Utils/Error.h" #include #include @@ -229,6 +230,26 @@ FledastyError fledasty_dynamic_array_clear(FledastyDynamicArray *current_dynamic return FLEDASTY_ERROR_NONE; } +FledastyError fledasty_dynamic_array_shrink_to_fit(FledastyDynamicArray *current_dynamic_array) { + if (current_dynamic_array == NULL) { + return FLEDASTY_ERROR_INVALID_POINTER; + } + + current_dynamic_array->capacity = (current_dynamic_array->size == 0) ? 10 : current_dynamic_array->size; + unsigned char *shrinked_buffer = (unsigned char*)hallocy_malloc(current_dynamic_array->capacity * current_dynamic_array->element_byte_size); + if (shrinked_buffer == NULL) { + return FLEDASTY_ERROR_FAILED_ALLOCATION; + } + + hallocy_copy_memory(shrinked_buffer, current_dynamic_array->buffer, current_dynamic_array->size * current_dynamic_array->element_byte_size); + if (hallocy_free(current_dynamic_array->buffer) != HALLOCY_ERROR_NONE) { + return FLEDASTY_ERROR_FAILED_ALLOCATION; + } + + current_dynamic_array->buffer = shrinked_buffer; + return FLEDASTY_ERROR_NONE; +} + bool fledasty_dynamic_array_has_value(const FledastyDynamicArray *current_dynamic_array, void *value) { if (current_dynamic_array == NULL) { return false; diff --git a/Tests/Main.c b/Tests/Main.c index 1d21f87..fba8285 100644 --- a/Tests/Main.c +++ b/Tests/Main.c @@ -89,6 +89,9 @@ int main() { fledasty_dynamic_array_append(&test_dynamic_array, &i); } + fledasty_dynamic_array_shrink_to_fit(&test_dynamic_array); + printf("Dynamic array schrinked to fit %s\n", (test_dynamic_array.capacity == test_dynamic_array.size) ? "succeeded" : "failed"); + int insert_value = 18; fledasty_dynamic_array_insert_at_index(&test_dynamic_array, 1, &insert_value);