From c80b38d82dce944162f2de3d826713595b2740a8 Mon Sep 17 00:00:00 2001 From: Warwick Date: Fri, 26 Apr 2024 14:53:35 +0100 Subject: [PATCH] Added pop and made empty's return make more sense. --- src/dyn_arr.c | 36 +++++++++++++++++++++++++++++------- src/dyn_arr.h | 18 +++++++++++++----- src/main.c | 14 +++++++++----- 3 files changed, 51 insertions(+), 17 deletions(-) diff --git a/src/dyn_arr.c b/src/dyn_arr.c index 36ff055..04197ab 100644 --- a/src/dyn_arr.c +++ b/src/dyn_arr.c @@ -3,6 +3,7 @@ #include #include #include + #define ARRAY_GROWTH_MULTIPLIER 1.3 void *dyn_arr_init(size_t item_size, size_t capacity) { @@ -19,13 +20,6 @@ void *dyn_arr_init(size_t item_size, size_t capacity) { return dyna_ptr; } -bool dyna_empty(void *array) { - if (dyna_length(array) == 0) { - return false; - } - return true; -} - void *dyna_ensure_capacity(void *array, size_t item_count, size_t item_size) { dyna_header *header = dyna_get_header(array); size_t minimum_capacity = header->length + item_count; @@ -44,3 +38,31 @@ void *dyna_ensure_capacity(void *array, size_t item_count, size_t item_size) { header->capacity = new_capacity; return header + 1; } + +void dyn_arr_pop(void *array, size_t item_size) { + if (dyna_empty(array)) { + return; + } + + dyna_length(array)--; + + // Shrink if smaller than growth factor, may break if growth factor is > 2 + if (dyna_length(array) > + (2 - ARRAY_GROWTH_MULTIPLIER) * dyna_capacity(array)) { + return; + } + + size_t new_capacity = dyna_length(array) * ARRAY_GROWTH_MULTIPLIER; + dyna_capacity(array) = new_capacity; + + size_t new_size = sizeof(dyna_header) + new_capacity * item_size; + dyna_header *header = dyna_get_header(array); + header = realloc(dyna_get_header(array), new_size); +} + +bool dyna_empty(void *array) { + if (dyna_length(array) == 0) { + return true; + } + return false; +} diff --git a/src/dyn_arr.h b/src/dyn_arr.h index 548d98c..b2d87a3 100644 --- a/src/dyn_arr.h +++ b/src/dyn_arr.h @@ -1,7 +1,7 @@ #pragma once -#include #include +#include #define ARRAY_INITIAL_CAPACITY 4 @@ -10,13 +10,16 @@ * - Capacity * - shrink capacity to size * - Modifiers - * - clear + * - clear aka erase * - insert * - (optional) insert range * - pop * - (optional) swap * - (optional) resize -*/ + * - Sanity checks + * - Check data going into array is the right size + * - see if possible to check entered data is correct type + */ typedef struct dyna_header { size_t capacity; @@ -27,14 +30,19 @@ typedef struct dyna_header { #define dyna_init(T) (T *)dyn_arr_init(sizeof(T), ARRAY_INITIAL_CAPACITY) void *dyn_arr_init(size_t item_size, size_t capacity); +// Modification #define dyna_append(array, value) \ ((array) = dyna_ensure_capacity(array, 1, sizeof(value)), \ (array)[dyna_get_header(array)->length] = (value), \ &(array)[dyna_get_header(array)->length++]) +void *dyna_ensure_capacity(void *array, size_t item_count, size_t item_size); + +#define dyna_pop(array) dyn_arr_pop(array, sizeof(typeof(*array))) +void dyn_arr_pop(void *array, size_t item_size); + // Get meta data #define dyna_get_header(array) ((dyna_header *)(array)-1) #define dyna_length(array) (dyna_get_header(array)->length) #define dyna_capacity(array) (dyna_get_header(array)->capacity) -bool dyna_empty(void* array); -void *dyna_ensure_capacity(void *array, size_t item_count, size_t item_size); +bool dyna_empty(void *array); diff --git a/src/main.c b/src/main.c index ea10563..4d88141 100644 --- a/src/main.c +++ b/src/main.c @@ -1,16 +1,20 @@ #include "dyn_arr.h" +#include #include #include int main() { - int *dyna_array = dyna_init(int); - printf("empty %d\n", dyna_empty(dyna_array)); + uint64_t *dyna_array = dyna_init(uint64_t); - for (int i = 0; i < 999999999; i++) { + for (uint64_t i = 0; i < 9999999; i++) { dyna_append(dyna_array, i); } - printf("capacity %zu\n", dyna_capacity(dyna_array)); - printf("empty %d\n", dyna_empty(dyna_array)); + + for (uint64_t i = 9999999; i > 0; i--) { + printf("length: %zu capacity: %zu\n", dyna_array[i], + dyna_capacity(dyna_array)); + dyna_pop(dyna_array); + } return EXIT_SUCCESS; }