Shrink array when capacity is double length
This commit is contained in:
parent
ed9e7b31e3
commit
db37ccedb3
3 changed files with 12 additions and 7 deletions
|
|
@ -6,6 +6,7 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#define ARRAY_GROWTH_MULTIPLIER 1.3
|
#define ARRAY_GROWTH_MULTIPLIER 1.3
|
||||||
|
#define ARRAY_SHRINK_TRIGGER 2
|
||||||
|
|
||||||
void *dyn_arr_init(size_t item_size, size_t capacity) {
|
void *dyn_arr_init(size_t item_size, size_t capacity) {
|
||||||
void *dyna_ptr = NULL;
|
void *dyna_ptr = NULL;
|
||||||
|
|
@ -27,16 +28,20 @@ void *dyna_ensure_capacity(void *array, int64_t item_count) {
|
||||||
dyna_header *header = dyna_get_header(array);
|
dyna_header *header = dyna_get_header(array);
|
||||||
size_t minimum_capacity = header->length + item_count;
|
size_t minimum_capacity = header->length + item_count;
|
||||||
size_t maximum_capacity =
|
size_t maximum_capacity =
|
||||||
header->length + item_count * ARRAY_GROWTH_MULTIPLIER;
|
(header->length + item_count) * ARRAY_SHRINK_TRIGGER;
|
||||||
|
|
||||||
|
// Return if capacity is in acceptable range.
|
||||||
if (header->capacity > minimum_capacity &&
|
if (header->capacity > minimum_capacity &&
|
||||||
header->capacity < maximum_capacity) {
|
header->capacity < maximum_capacity) {
|
||||||
return header + 1;
|
return header + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t new_capacity = header->capacity * ARRAY_GROWTH_MULTIPLIER;
|
size_t new_capacity = minimum_capacity * ARRAY_GROWTH_MULTIPLIER;
|
||||||
while (new_capacity < minimum_capacity) {
|
|
||||||
new_capacity *= ARRAY_GROWTH_MULTIPLIER;
|
// Return if the array is valid and so small it's not worth reallocating
|
||||||
|
if (header->capacity > minimum_capacity &&
|
||||||
|
new_capacity <= ARRAY_INITIAL_CAPACITY) {
|
||||||
|
return header + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t new_size = sizeof(dyna_header) + new_capacity * item_size;
|
size_t new_size = sizeof(dyna_header) + new_capacity * item_size;
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
#define ARRAY_INITIAL_CAPACITY 4
|
#define ARRAY_INITIAL_CAPACITY 10
|
||||||
|
|
||||||
/* TODO:
|
/* TODO:
|
||||||
* Functions to implement to match what I want:
|
* Functions to implement to match what I want:
|
||||||
|
|
|
||||||
|
|
@ -6,13 +6,13 @@
|
||||||
int main() {
|
int main() {
|
||||||
uint64_t *dyna_array = dyna_init(uint64_t);
|
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);
|
dyna_append(dyna_array, i);
|
||||||
printf("length: %zu capacity: %zu value: %lu\n", dyna_length(dyna_array),
|
printf("length: %zu capacity: %zu value: %lu\n", dyna_length(dyna_array),
|
||||||
dyna_capacity(dyna_array), dyna_array[i - 1]);
|
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),
|
printf("length: %zu capacity: %zu value: %lu\n", dyna_length(dyna_array),
|
||||||
dyna_capacity(dyna_array), dyna_array[i - 1]);
|
dyna_capacity(dyna_array), dyna_array[i - 1]);
|
||||||
dyna_pop(dyna_array);
|
dyna_pop(dyna_array);
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue