Added pop and made empty's return make more sense.

This commit is contained in:
Warwick 2024-04-26 14:53:35 +01:00
parent 29597aecaf
commit c80b38d82d
3 changed files with 51 additions and 17 deletions

View file

@ -3,6 +3,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#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;
}

View file

@ -1,7 +1,7 @@
#pragma once
#include <stdlib.h>
#include <stdbool.h>
#include <stdlib.h>
#define ARRAY_INITIAL_CAPACITY 4
@ -10,12 +10,15 @@
* - 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 {
@ -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);

View file

@ -1,16 +1,20 @@
#include "dyn_arr.h"
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
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;
}