#include #include #include #include #include "vector.h" #include "util.h" #define VECTOR_START_SIZE 8 #define VECTOR_GROW_FACTOR 2 #define ITEMSZ sizeof(int) void vector_init(ivector *v) { assert(v); 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); v->n = arrsz; v->maxsz = (arrsz > VECTOR_START_SIZE) ? arrsz : VECTOR_START_SIZE; v->data = xmalloc(ITEMSZ * v->maxsz); memcpy(v->data, arr, arrsz * ITEMSZ); } void vector_free(ivector *v) { assert(v); v->n = 0; v->maxsz = 0; xfree(v->data); v->data = NULL; } size_t vector_len(const ivector *v) { assert(v); return v->n; } int * vector_data(const ivector *v) { assert(v); return v->data; } void vector_resize(ivector *v, int n) { assert(v); if (n <= v->maxsz) { if (n > v->n) { memset(v->data + v->n, 0, (n - v->n) * ITEMSZ); } v->n = n; } else { size_t new_max = v->maxsz; while (new_max < n) { new_max *= VECTOR_GROW_FACTOR; } v->data = xrealloc(v->data, new_max * ITEMSZ); if (n > v->n) { memset(v->data + v->n, 0, (n - v->n) * ITEMSZ); } v->n = n; v->maxsz = new_max; } } void vector_set(ivector *v, size_t idx, int val) { assert(v && idx < v->n); v->data[idx] = val; } int vector_get(const ivector *v, size_t idx) { assert(v && idx < v->n); return v->data[idx]; } void vector_push(ivector *v, int val) { assert(v); if (v->n == v->maxsz) { vector_resize(v, v->n + 1); v->data[v->n - 1] = val; } else { v->data[v->n++] = val; } } void vector_pop(ivector *v) { assert(v); if (v->n > 0){ v->n--; } } void vector_insert(ivector *v, size_t idx, int val) { assert(v && v->n >= idx); if (v->n == v->maxsz) { size_t new_max = v->maxsz * VECTOR_GROW_FACTOR; v->data = xrealloc(v->data, new_max * ITEMSZ); v->maxsz = new_max; } memmove(v->data + idx + 1, v->data + idx, (v->n - idx) * ITEMSZ); v->data[idx] = val; v->n++; } void vector_del(ivector *v, size_t idx) { assert(v && idx < v->n); memmove(v->data + idx, v->data + idx + 1, (v->n - idx - 1) * ITEMSZ); v->n--; } void vector_clear(ivector *v) { vector_resize(v, 0); }