From: anon Date: Wed, 23 Aug 2023 23:36:22 +0000 (+0200) Subject: Merge branch 'master' of https://git.lain.church/emil/hl X-Git-Url: https://git.xolatile.top/?a=commitdiff_plain;h=79c45b5e2c85c0b05247a49cd01baf84179d98a4;p=public-libhl.git Merge branch 'master' of https://git.lain.church/emil/hl --- 79c45b5e2c85c0b05247a49cd01baf84179d98a4 diff --cc tests/vector.c index 332f8ab,0000000..bfcc9ee mode 100644,000000..100644 --- a/tests/vector.c +++ b/tests/vector.c @@@ -1,95 -1,0 +1,134 @@@ +#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_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); + - // Add only 1 new element to vector. ++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)) { ++ // Handle or output error somehow? ++ 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 == NULL) { ++ if (! vector->data) { + // 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_set(vector_t * vector, ++ void * data, ++ size_t element) { ++ if (element >= vector->element_count) { ++ // Handle or output error somehow? ++ 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); +} + +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_init(&vector, sizeof(example_t), 10); + - vector_push(&vector, &x); - vector_push(&vector, &y); - vector_push(&vector, &z); ++ vector_set(&vector, &x, 0); ++ vector_set(&vector, &y, 1); ++ vector_set(&vector, &z, 2); + + example_print(vector_get(&vector, 0)); + example_print(vector_get(&vector, 1)); + example_print(vector_get(&vector, 2)); + + vector_free(&vector); + + return (EXIT_SUCCESS); +}