From 158f7d44d144a079f1a77bbaaa05768253208381 Mon Sep 17 00:00:00 2001 From: xolatile Date: Wed, 23 Aug 2023 19:03:32 -0400 Subject: [PATCH] Very C-like vectors... /: --- source/vector.c | 95 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 source/vector.c diff --git a/source/vector.c b/source/vector.c new file mode 100644 index 0000000..332f8ab --- /dev/null +++ b/source/vector.c @@ -0,0 +1,95 @@ +#include +#include +#include + +typedef struct { + char * data; + size_t element_size; + size_t element_count; +} vector_t; + +typedef struct { + int a; + int b; + char * c; +} example_t; + +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_free(vector_t * vector); + +extern void example_print(example_t * example); + +// Add only 1 new element to vector. +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 == NULL) { + // Handle or output error somehow? + 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) { + // Handle or output error somehow? + puts("vector_get"); + exit(EXIT_FAILURE); + } + + return &vector->data[vector->element_size * element]; +} + +void vector_free(vector_t * vector) { + free(vector->data); +} + +void example_print(example_t * example) { + printf("a : %+i\n", example->a); + printf("b : %+i\n", example->b); + printf("c : %2s\n", example->c); +} + +int main(void) { + vector_t vector; + + example_t x = { 1, -1, "A" }, + y = { 2, -2, "B" }, + z = { 3, -3, "C" }; + + vector.data = NULL; // Important to NULL it. + vector.element_size = sizeof(example_t); // Important to type it. + vector.element_count = 0UL; // Important to 0 it. + + vector_push(&vector, &x); + vector_push(&vector, &y); + vector_push(&vector, &z); + + example_print(vector_get(&vector, 0)); + example_print(vector_get(&vector, 1)); + example_print(vector_get(&vector, 2)); + + vector_free(&vector); + + return (EXIT_SUCCESS); +}