REduced number of realocations and made sure that capacity is never more than double length

This commit is contained in:
Warwick 2024-12-18 17:00:50 +00:00
parent ed9e7b31e3
commit 096350278d
3 changed files with 17 additions and 8 deletions

View file

@ -26,19 +26,28 @@ void *dyna_ensure_capacity(void *array, int64_t item_count) {
size_t item_size = dyna_item_size(array);
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;
size_t maximum_capacity = (header->length + item_count) * 2;
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;
header = realloc(header, new_size);
header->capacity = new_capacity;

View file

@ -3,7 +3,7 @@
#include <stdbool.h>
#include <stdlib.h>
#define ARRAY_INITIAL_CAPACITY 4
#define ARRAY_INITIAL_CAPACITY 10
/* TODO:
* Functions to implement to match what I want:

View file

@ -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);