diff --git a/vector.c b/vector.c index bfbea79..8865d1d 100644 --- a/vector.c +++ b/vector.c @@ -1,5 +1,4 @@ #include - #include #include #include @@ -7,107 +6,153 @@ #include "vector.h" #include "util.h" -#define VECTOR_START_SIZE 8 -#define VECTOR_GROW_FACTOR 2 +#define VECTOR_START_SIZE 8 +#define VECTOR_GROW_FACTOR 2 #define ITEMSZ sizeof(int) void vector_init(ivector *v) { - assert(v); + assert(v); - v->n = 0; - v->maxsz = VECTOR_START_SIZE; - v->data = xmalloc(ITEMSZ * VECTOR_START_SIZE); + v->n = 0; + v->maxsz = VECTOR_START_SIZE; + v->data = xmalloc(ITEMSZ * VECTOR_START_SIZE); } void vector_initdata(ivector *v, int *arr, size_t arrsz) { - assert(v && arrsz); - // + assert(v && arrsz); + + v->n = arrsz; + v->maxsz = (arrsz > VECTOR_START_SIZE) ? arrsz : VECTOR_START_SIZE; + v->data = xmalloc(ITEMSZ * v->maxsz); + memcpy(v->data, arr, ITEMSZ * arrsz); } void vector_free(ivector *v) { - assert(v); + assert(v); - v->n = 0; - v->maxsz = 0; - xfree(v->data); - v->data = NULL; + v->n = 0; + v->maxsz = 0; + xfree(v->data); + v->data = NULL; } size_t vector_len(const ivector *v) { - assert(v); + assert(v); - // - return 0; + return v->n; } int * vector_data(const ivector *v) { - assert(v); - // - return NULL; + assert(v); + return v->data; } void vector_resize(ivector *v, int n) { - assert(v); + assert(v); - // + if (n <= v->maxsz) { + v->n = n; + return; + } + + size_t new_maxsz = v->maxsz; + while (new_maxsz < n) { + new_maxsz *= VECTOR_GROW_FACTOR; + } + + v->data = xrealloc(v->data, ITEMSZ * new_maxsz); + + for (size_t i = v->n; i < (size_t)n; i++) { + v->data[i] = 0; + } + + v->maxsz = new_maxsz; + v->n = n; } void vector_set(ivector *v, size_t idx, int val) { - assert(v && idx < v->n); - // + assert(v && idx < v->n); + v->data[idx] = val; } int vector_get(const ivector *v, size_t idx) { - assert(v && idx < v->n); - // - return 0; + assert(v && idx < v->n); + return v->data[idx]; } void vector_push(ivector *v, int val) { - assert(v); - // + assert(v); + + if (v->n == v->maxsz) { + size_t new_maxsz = v->maxsz * VECTOR_GROW_FACTOR; + v->data = xrealloc(v->data, ITEMSZ * new_maxsz); + v->maxsz = new_maxsz; + } + + v->data[v->n] = val; + v->n++; } void vector_pop(ivector *v) { - assert(v); - // + assert(v); + if (v->n > 0) { + v->n--; + } } void vector_insert(ivector *v, size_t idx, int val) { - assert(v && v->n >= idx); - // + assert(v && v->n >= idx); + + if (v->n == v->maxsz) { + size_t new_maxsz = v->maxsz * VECTOR_GROW_FACTOR; + v->data = xrealloc(v->data, ITEMSZ * new_maxsz); + v->maxsz = new_maxsz; + } + + for (size_t i = v->n; i > idx; i--) { + v->data[i] = v->data[i - 1]; + } + + v->data[idx] = val; + v->n++; } void vector_del(ivector *v, size_t idx) { - // + assert(v && idx < v->n); + + for (size_t i = idx; i < v->n - 1; i++) { + v->data[i] = v->data[i + 1]; + } + + v->n--; } void vector_clear(ivector *v) { - vector_resize(v, 0); + vector_resize(v, 0); }