thesis-lisp/core/vector.c
2021-04-07 22:24:33 +03:00

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;
}