diff --git a/source/vector.h b/source/vector.h new file mode 100644 index 0000000..85525f2 --- /dev/null +++ b/source/vector.h @@ -0,0 +1,99 @@ +#include +#include +#include + +// TODO: Handle error warnings? +// TODO: Implement more useful functions? + +typedef struct { + char * data; + size_t element_size; + size_t element_count; +} vector_t; + +extern void vector_init(vector_t * vector, + size_t element_size, + size_t element_count); + +extern void vector_push(vector_t * vector, + void * data); + +extern void vector_pop(vector_t * vector); + +extern void * vector_get(vector_t * vector, + size_t element); + +extern void vector_set(vector_t * vector, + void * data, + size_t element); + +extern void vector_free(vector_t * vector); + +extern void example_print(example_t * example); + +void vector_init(vector_t * vector, + size_t element_size, + size_t element_count) { + vector->data = NULL; + vector->element_size = element_size; + vector->element_count = element_count; + + vector->data = malloc(vector->element_size * vector->element_count); + + if ((! vector->data) && (vector->element_count)) { + puts("vector_init"); + exit(EXIT_FAILURE); + } + + memset(vector->data, + 0, + vector->element_size * vector->element_count); +} + +void vector_push(vector_t * vector, + void * data) { + ++vector->element_count; + + vector->data = realloc(vector->data, + vector->element_size * vector->element_count); + + if (! vector->data) { + puts("vector_push"); + exit(EXIT_FAILURE); + } + + memcpy(&vector->data[(vector->element_count - 1) * vector->element_size], + data, + vector->element_size); +} + +void vector_pop(vector_t * vector) { + (void) vector; +} + +void * vector_get(vector_t * vector, + size_t element) { + if (element >= vector->element_count) { + puts("vector_get"); + exit(EXIT_FAILURE); + } + + return &vector->data[vector->element_size * element]; +} + +void vector_set(vector_t * vector, + void * data, + size_t element) { + if (element >= vector->element_count) { + puts("vector_set"); + exit(EXIT_FAILURE); + } + + memcpy(&vector->data[vector->element_size * element], + data, + vector->element_size); +} + +void vector_free(vector_t * vector) { + free(vector->data); +}