X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Frasterize;a=blobdiff_plain;f=array.c;fp=array.c;h=76118fbca1ad64aeed53c866aeb3fed890fbdff9;hp=0000000000000000000000000000000000000000;hb=a3ba0121189f38132480b0c0c4be96df3c93900b;hpb=143da66e7f625b7f195a115b9740a748ee003534 diff --git a/array.c b/array.c new file mode 100644 index 0000000..76118fb --- /dev/null +++ b/array.c @@ -0,0 +1,52 @@ + +/* + * CS5600 University of Utah + * Charles McGarvey + * mcgarvey@eng.utah.edu + */ + +#include "array.h" + + +array_t* array_alloc2(size_t size, size_t capacity) +{ + array_t* v = mem_alloc(sizeof(array_t)); + capacity = MAX(capacity, ARRAY_CAPACITY_MIN); + v->arr = mem_alloc(size * capacity); + v->cap = capacity; + v->len = 0; + v->siz = size; + return v; +} + + +void array_reserve(array_t* v, size_t s) +{ + assert(v && v->arr); + if (v->cap < s) { + size_t cap = MAX(s + ARRAY_CAPACITY_DEFAULT, ARRAY_CAPACITY_MIN); + void* arr = mem_realloc(v->arr, v->siz * cap); + v->arr = arr; + v->cap = cap; + } +} + +void array_done(array_t* v) +{ + assert(v && v->arr); + if (v->len < v->cap) { + size_t cap = MAX(v->len, ARRAY_CAPACITY_MIN); + void* arr = mem_realloc(v->arr, v->siz * cap); + v->arr = arr; + v->cap = cap; + } +} + + +void array_call(const array_t* v, array_call_fn_t fn) +{ + array_it_t it = array_begin(v); + void* e; + while (e = array_it_next(&it)) fn(it.pos - 1, e); +} +