From 68c626d8000da6bcfad28619cd8ff4ba5f28af60 Mon Sep 17 00:00:00 2001 From: Warwick Date: Thu, 8 Feb 2024 11:17:53 +0000 Subject: [PATCH] implemented shrink_to_fit for vector --- src/main.c | 11 +++++++---- src/vec.c | 16 ++++++++++++++++ src/vec.h | 3 +++ 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/src/main.c b/src/main.c index c4bb607..f421e65 100644 --- a/src/main.c +++ b/src/main.c @@ -6,16 +6,19 @@ int main() { vector *vec = vec_create(sizeof(int)); - for (int x = 0; x < 10; x++) { + for (int x = 0; x < 100; x++) { vec_push_back(vec, &x); } int i = 99999999; vec_push_index(vec, &i, 5); vec_push_front(vec, &i); - for (int x = 0; x < 12; x++) { - printf("%d ",*(int*)vec_get(vec, x)); + printf("Capacity before shrink: %zu | ", vec_capacity(vec)); + vec_shrink_to_fit(vec); + printf("Capacity after: %zu\n", vec_capacity(vec)); + for (int x = 0; x < 102; x++) { + printf("%d ", *(int *)vec_get(vec, x)); } - printf("\n"); + printf("\n"); vec_destroy(vec); // if (SDL_Init(SDL_INIT_VIDEO) < 0) { diff --git a/src/vec.c b/src/vec.c index 28b6c9b..2dd2d5e 100644 --- a/src/vec.c +++ b/src/vec.c @@ -38,6 +38,12 @@ void vec_grow(vector *vec) { assert(vec->elements != NULL); } +void vec_shrink_to_fit(vector *vec) { + assert(vec != NULL); + vec->capacity = vec->size; + vec->elements = reallocarray(vec->elements, vec->size, vec->element_size); +} + void vec_push_back(vector *vec, void *data) { assert(vec != NULL); vec_grow(vec); @@ -69,3 +75,13 @@ void *vec_get(vector *vec, uint index) { assert(index <= vec->size); return vec->elements + index * vec->element_size; } + +size_t vec_size(vector *vec) { + assert(vec != NULL); + return vec->size; +} + +size_t vec_capacity(vector *vec) { + assert(vec != NULL); + return vec->capacity; +} diff --git a/src/vec.h b/src/vec.h index e8e4c79..25da3c1 100644 --- a/src/vec.h +++ b/src/vec.h @@ -8,6 +8,7 @@ void vec_destroy(vector *vec); // Checks and grows vector only if necessary void vec_grow(vector *vec); +void vec_shrink_to_fit(vector *vec); // Assumes data is the same size as the element size // Which means you can only push one element at a time @@ -16,3 +17,5 @@ void vec_push_front(vector *vec, void *data); void vec_push_index(vector *vec, void *data, uint index); void* vec_get(vector *vec, uint index); +size_t vec_size(vector *vec); +size_t vec_capacity(vector *vec);