85 lines
1.7 KiB
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);
|
|
}
|