42 lines
911 B
C
42 lines
911 B
C
/* SPDX-License-Identifier:BSD-3-Clause */
|
|
#include "vector.h"
|
|
#include "log.h"
|
|
|
|
struct vector *vector_init(usize size, usize element_size)
|
|
{
|
|
if (size == 0)
|
|
size = 1;
|
|
struct vector *vector = (struct vector *)malloc(sizeof(struct vector));
|
|
vector->length = 0;
|
|
vector->size = size;
|
|
vector->data = malloc(size * element_size);
|
|
return vector;
|
|
}
|
|
|
|
void *vector_shrink(struct vector *vector, usize element_size)
|
|
{
|
|
#ifdef DEBUG
|
|
if (vector->length == 0)
|
|
log_error("Popping from an empty vector.\n");
|
|
#endif
|
|
vector->length -= 1;
|
|
if (vector->length <= vector->size / 3) {
|
|
vector->size = vector->length + vector->length / 2;
|
|
vector->data =
|
|
realloc(vector->data, vector->size * element_size + 1);
|
|
}
|
|
return vector->data;
|
|
}
|
|
|
|
void vector_deinit(struct vector *vector)
|
|
{
|
|
#ifdef DEBUG
|
|
if (!vector) {
|
|
log_error("attempt to free NULL vector");
|
|
return;
|
|
}
|
|
#endif
|
|
|
|
free(vector->data);
|
|
free(vector);
|
|
}
|