cvector/vector.c

85 lines
1.7 KiB
C

#include "vector.h"
#include <stdlib.h>
Vector *vec_new(uint32_t obj_size, Destructor destructor)
{
Vector *self = (Vector *)malloc(sizeof(Vector));
(*self).elements = NULL;
(*self).obj_size = obj_size;
(*self).len = 0;
(*self).destructor = destructor;
return self;
}
Vector *vec_new_with_capacity(uint32_t obj_size,
uint32_t obj_number,
Destructor destructor)
{
Vector *self = (Vector *)malloc(sizeof(Vector));
(*self).elements = (void **)malloc(obj_number);
(*self).obj_size = obj_size;
(*self).len = 0;
(*self).destructor = destructor;
return self;
}
uint32_t vec_len(Vector *self)
{
return self->len;
}
uint32_t vec_capacity(Vector *self)
{
return sizeof(self->elements);
}
uint8_t vec_realloc(Vector *self)
{
void ** elements = self->elements;
uint32_t new_capacity = (vec_capacity(self) > 0) ? vec_capacity(self) * 2 : 1;
self->elements = realloc(self->elements, new_capacity);
if (!self->elements) {
self->elements = elements;
return 1;
}
return 0;
}
uint8_t vec_push(Vector *self, void *element)
{
UNINPLEMENTED;
return 1;
/* if (self->len + 1 > vec_capacity(self)) { */
/* vec_realloc(self); */
/* } */
/* ++(*self).len; */
}
uint8_t vec_pop(Vector *self) {
UNINPLEMENTED;
return 1;
} // TODO
void *vec_at(Vector *self, uint32_t index)
{
return self->elements + (index * self->obj_size);
}
void *vec_at_safe(Vector *self, uint32_t index)
{
if (index < 0 || index >= self->len) {
return NULL;
}
return vec_at(self, index);
}
void vec_delete(Vector *self)
{
foreach (void *elem, self) {
self->destructor(elem);
}
free(self->elements);
free(self);
}