]> git.xolatile.top Git - public-libhl.git/commitdiff
Very C-like vectors... /:
authorxolatile <xolatile@proton.me>
Wed, 23 Aug 2023 23:03:32 +0000 (19:03 -0400)
committerxolatile <xolatile@proton.me>
Wed, 23 Aug 2023 23:03:32 +0000 (19:03 -0400)
source/vector.c [new file with mode: 0644]

diff --git a/source/vector.c b/source/vector.c
new file mode 100644 (file)
index 0000000..332f8ab
--- /dev/null
@@ -0,0 +1,95 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+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);
+}