changeset 40:63b0bf003bb9

base/vec: Implement yvec_new
author Lewin Bormann <lbo@spheniscida.de>
date Wed, 21 Aug 2019 13:08:16 +0200
parents 9de50050f36f
children a3eac54f2112
files src/base/vec.c src/base/vec.h src/base/vec_test.c
diffstat 3 files changed, 33 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/src/base/vec.c	Wed Aug 21 13:06:45 2019 +0200
+++ b/src/base/vec.c	Wed Aug 21 13:08:16 2019 +0200
@@ -38,6 +38,13 @@
     assert(vec->len <= vec->cap);
 }
 
+yvec_t yvec_new(void *src, size_t size, size_t len) {
+    yvec_t vec;
+    yvec_init(&vec, size, len);
+    yvec_push_multi(&vec, src, len);
+    return vec;
+}
+
 void yvec_init(yvec_t *vec, size_t size, size_t n) {
     assert(vec);
     vec->size = size;
@@ -56,15 +63,15 @@
 }
 
 void *yvec_at(yvec_t *vec, size_t index) {
-    if (index >= vec->len)
-        return NULL;
+    if (index >= vec->len) return NULL;
     return yvec_at_nocheck(vec, index);
 }
 
 void yvec_resize(yvec_t *vec, size_t new_size) {
     if (new_size > vec->cap) {
         yvec_growcap(vec, new_size);
-        memset(yvec_at_nocheck(vec, vec->len), 0, (new_size - vec->len)*vec->size);
+        memset(yvec_at_nocheck(vec, vec->len), 0,
+               (new_size - vec->len) * vec->size);
         vec->len = new_size;
     } else {
         vec->len = new_size;
@@ -83,7 +90,7 @@
 }
 
 void yvec_push_multi(yvec_t *vec, const void *elements, size_t n) {
-    yvec_growcap(vec, vec->len + n); // Grow capacity to at least len+n.
+    yvec_growcap(vec, vec->len + n);  // Grow capacity to at least len+n.
     memcpy(yvec_at_nocheck(vec, vec->len), elements, n * vec->size);
     vec->len += n;
     assert(vec->len <= vec->cap);
--- a/src/base/vec.h	Wed Aug 21 13:06:45 2019 +0200
+++ b/src/base/vec.h	Wed Aug 21 13:08:16 2019 +0200
@@ -43,13 +43,22 @@
 #define YVEC_PUSH(vecp, elemp) \
     (assert((vecp)->size == sizeof(*(elemp))), yvec_push(vecp, (void *)(elemp)))
 
+#define YVEC_NEW(src, len, TYPE) yvec_new(src, sizeof(TYPE), len)
+
+/**
+ * @brief Initialize a new vector and return it, from an array of `len`
+ * elements of each `size` bytes. Use `YVEC_NEW()` to directly specify the type
+ * of the array.
+ */
+yvec_t yvec_new(void* src, size_t size, size_t len);
+
 /**
  * @brief Initialize a vector with `n` elements of `size` bytes each. See also
  * `YVEC_INIT()`. The vector is guaranteed to only contain zero values. The
  * initial length is 0. The next `size` appends are "free" (they won't allocate
  * more memory).
  */
-void yvec_init(yvec_t *vec, size_t size, size_t n);
+void yvec_init(yvec_t *vec, size_t size, size_t len);
 
 /**
  * @brief Append an element. See also `yvec_push()`, which asserts that the
--- a/src/base/vec_test.c	Wed Aug 21 13:06:45 2019 +0200
+++ b/src/base/vec_test.c	Wed Aug 21 13:08:16 2019 +0200
@@ -3,6 +3,16 @@
 
 #include "vec.h"
 
+void test_vec_new(void) {
+    int src[3] = {1, 2, 3};
+    yvec_t vec = YVEC_NEW(src, 3, int);
+    assert(2 == *YVEC_AT(&vec, 1, int));
+    assert(3 == *YVEC_AT(&vec, 2, int));
+    assert(3 == vec.len);
+    assert(3 == vec.cap);
+    yvec_destroy(&vec);
+}
+
 void test_vec_init_use(void) {
     yvec_t vec;
     YVEC_INIT(&vec, 16, int);
@@ -16,8 +26,7 @@
 
     yvec_resize(&vec, 0);
 
-    for (int i = 0; i < 100; i++)
-        YVEC_PUSH(&vec, &i);
+    for (int i = 0; i < 100; i++) YVEC_PUSH(&vec, &i);
 
     // Depends on growth_factor!
     assert(128 == vec.cap);
@@ -70,9 +79,8 @@
     yvec_destroy(&v3);
 }
 
-
-
 int main(void) {
+    test_vec_new();
     test_vec_init_use();
     test_vec_append();
     return 0;