--- /dev/null
+
+/*
+ * 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);
+}
+