53 lines
1.1 KiB
C
53 lines
1.1 KiB
C
#include "vector.h"
|
|
|
|
#include <assert.h>
|
|
#include <string.h>
|
|
#include <stdlib.h>
|
|
#include <errno.h>
|
|
|
|
static int vector_resize(struct vector *vec, size_t new_cap) {
|
|
vec->data = realloc(vec->data, vec->entsize * new_cap);
|
|
if (!vec->data) {
|
|
vec->cap = 0;
|
|
vec->size = 0;
|
|
return -ENOMEM;
|
|
}
|
|
vec->cap = new_cap;
|
|
return 0;
|
|
}
|
|
|
|
void vector_init(struct vector *vec, size_t entsize) {
|
|
vec->size = 0;
|
|
vec->cap = 0;
|
|
vec->data = NULL;
|
|
vec->entsize = entsize;
|
|
}
|
|
|
|
void vector_free(struct vector *vec) {
|
|
vec->cap = 0;
|
|
vec->size = 0;
|
|
vec->entsize = 0;
|
|
free(vec->data);
|
|
vec->data = NULL;
|
|
}
|
|
|
|
void vector_release(struct vector *vec) {
|
|
memset(vec->data, 0, vec->cap * vec->entsize);
|
|
free(vec->data);
|
|
vec->cap = 0;
|
|
}
|
|
|
|
void *vector_append(struct vector *vec) {
|
|
if (vec->size == vec->cap) {
|
|
if (vector_resize(vec, vec->cap + 8) != 0) {
|
|
return NULL;
|
|
}
|
|
}
|
|
return vec->data + vec->entsize * vec->size++;
|
|
}
|
|
|
|
void *vector_ref(struct vector *vec, size_t index) {
|
|
assert(index < vec->size);
|
|
return vec->data + vec->entsize * index;
|
|
}
|