#include "vector.h" Vector vec_new(Destructor destructor) { Vector self; self.length = 0; self.capacity = INITIAL_CAPACITY; self.offset = sizeof(void *); self.elements = (void *)malloc(self.offset * INITIAL_CAPACITY); self.destroy = destructor; return self; } Vector vec_with_capacity(Destructor t_destructor, size_t t_capacity) { Vector self = vec_new(t_destructor); free(self.elements); self.elements = (void **)malloc(self.offset * t_capacity); self.capacity = t_capacity; return self; } void *vec_at(Vector *self, size_t t_index) { return self->elements[t_index]; } void *vec_safe_at(Vector *self, size_t t_index) { return (t_index >= vec_length(self)) ? NULL : vec_at(self, t_index); } static void vec_maybe_destroy_element(Vector *self, size_t t_index) { void *element = vec_at(self, t_index); if (self->destroy) { self->destroy(element); } } void *vec_last(Vector *self) { return vec_at(self, vec_length(self) - 1); } size_t vec_length(Vector *self) { return self->length; } size_t vec_capacity(Vector *self) { return self->capacity; } static void vec_realloc(Vector *self) { self->capacity *= 2; self->elements = realloc(self->elements, sizeof(void *) * vec_capacity(self)); if (!self->elements) { PDEB("Could not reallocate Vector’s memory, aborting...", NULL); exit(ERR_MEM_ALLOC); } } void vec_push(Vector *self, void *t_element) { if (vec_length(self) >= vec_capacity(self)) { vec_realloc(self); } self->elements[(*self).length++] = t_element; } void vec_pop(Vector *self) { if (vec_length(self) <= 0) { return; } vec_maybe_destroy_element(self, vec_length(self) - 1); --(*self).length; } void vec_shrink_to_fit(Vector *self) { self->capacity = self->length; self->elements = realloc(self->elements, sizeof(void *) * vec_capacity(self)); if (!self->elements) { PDEB("Could not reallocate Vector’s memory, aborting...", NULL); exit(ERR_MEM_ALLOC); } } void vec_delete(Vector *self) { if (self->destroy) { for (size_t i = 0; i < vec_length(self); ++i) { self->destroy(self->elements[i]); } } free(self->elements); }