From 9a8beb4020f6b3de0dfabcb36048d5bb5c1ce4ad Mon Sep 17 00:00:00 2001 From: Warwick Date: Wed, 18 Dec 2024 17:03:08 +0000 Subject: [PATCH] Shrink array when capacity is double length --- src/dyn_arr.c | 18 ++++++++++++++---- src/dyn_arr.h | 2 +- src/main.c | 4 ++-- 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/src/dyn_arr.c b/src/dyn_arr.c index af74613..bb99774 100644 --- a/src/dyn_arr.c +++ b/src/dyn_arr.c @@ -6,6 +6,7 @@ #include #define ARRAY_GROWTH_MULTIPLIER 1.3 +#define ARRAY_SHRINK_TRIGGER 2 void *dyn_arr_init(size_t item_size, size_t capacity) { void *dyna_ptr = NULL; @@ -27,16 +28,25 @@ void *dyna_ensure_capacity(void *array, int64_t item_count) { dyna_header *header = dyna_get_header(array); size_t minimum_capacity = header->length + item_count; size_t maximum_capacity = - header->length + item_count * ARRAY_GROWTH_MULTIPLIER; + (header->length + item_count) * ARRAY_SHRINK_TRIGGER; + printf("%zu %zu %zu\n", header->capacity, minimum_capacity, maximum_capacity); + + // Return if capacity is in acceptable range. if (header->capacity > minimum_capacity && header->capacity < maximum_capacity) { + printf("AAAAA\n"); return header + 1; } - size_t new_capacity = header->capacity * ARRAY_GROWTH_MULTIPLIER; - while (new_capacity < minimum_capacity) { - new_capacity *= ARRAY_GROWTH_MULTIPLIER; + size_t new_capacity = minimum_capacity * ARRAY_GROWTH_MULTIPLIER; + printf("%zu\n", new_capacity); + + // Return if the array is valid and so small it's not worth reallocating + if (header->capacity > minimum_capacity && + header->capacity <= ARRAY_INITIAL_CAPACITY) { + printf("pfft\n"); + return header + 1; } size_t new_size = sizeof(dyna_header) + new_capacity * item_size; diff --git a/src/dyn_arr.h b/src/dyn_arr.h index fb38171..414572b 100644 --- a/src/dyn_arr.h +++ b/src/dyn_arr.h @@ -3,7 +3,7 @@ #include #include -#define ARRAY_INITIAL_CAPACITY 4 +#define ARRAY_INITIAL_CAPACITY 10 /* TODO: * Functions to implement to match what I want: diff --git a/src/main.c b/src/main.c index efb2672..c8a3035 100644 --- a/src/main.c +++ b/src/main.c @@ -6,13 +6,13 @@ int main() { uint64_t *dyna_array = dyna_init(uint64_t); - for (uint64_t i = 0; i < 19; i++) { + for (uint64_t i = 0; i < 100; i++) { dyna_append(dyna_array, i); printf("length: %zu capacity: %zu value: %lu\n", dyna_length(dyna_array), dyna_capacity(dyna_array), dyna_array[i - 1]); } - for (uint64_t i = 19; i > 0; i--) { + for (uint64_t i = 100; i > 0; i--) { printf("length: %zu capacity: %zu value: %lu\n", dyna_length(dyna_array), dyna_capacity(dyna_array), dyna_array[i - 1]); dyna_pop(dyna_array);