thesis-lisp/core/vector.c

53 lines
1.1 KiB
C
Raw Normal View History

2021-04-06 17:27:02 +03:00
#include "vector.h"
#include <assert.h>
2021-04-07 22:24:33 +03:00
#include <string.h>
2021-04-06 17:27:02 +03:00
#include <stdlib.h>
2021-04-07 22:24:33 +03:00
#include <errno.h>
2021-04-06 17:27:02 +03:00
2021-04-07 22:24:33 +03:00
static int vector_resize(struct vector *vec, size_t new_cap) {
2021-04-06 17:27:02 +03:00
vec->data = realloc(vec->data, vec->entsize * new_cap);
2021-04-07 22:24:33 +03:00
if (!vec->data) {
vec->cap = 0;
vec->size = 0;
return -ENOMEM;
}
2021-04-06 17:27:02 +03:00
vec->cap = new_cap;
2021-04-07 22:24:33 +03:00
return 0;
2021-04-06 17:27:02 +03:00
}
void vector_init(struct vector *vec, size_t entsize) {
vec->size = 0;
vec->cap = 0;
vec->data = NULL;
vec->entsize = entsize;
}
2021-04-07 22:24:33 +03:00
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;
}
2021-04-06 17:27:02 +03:00
void *vector_append(struct vector *vec) {
if (vec->size == vec->cap) {
2021-04-07 22:24:33 +03:00
if (vector_resize(vec, vec->cap + 8) != 0) {
return NULL;
}
2021-04-06 17:27:02 +03:00
}
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;
}