changeset 72:af4431b0fac0

base/vec: Implement yvec_pop()
author Lewin Bormann <lbo@spheniscida.de>
date Sun, 25 Aug 2019 18:45:20 +0200
parents 462e9b547fed
children 7a5caf93cdc2
files src/base/vec.c src/base/vec.h
diffstat 2 files changed, 17 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/base/vec.c	Sun Aug 25 16:57:47 2019 +0200
+++ b/src/base/vec.c	Sun Aug 25 18:45:20 2019 +0200
@@ -89,6 +89,15 @@
     return vec->len - 1;
 }
 
+bool yvec_pop(yvec_t* vec, void* dst) {
+    if (vec->len == 0) {
+        return false;
+    }
+    memcpy(dst, yvec_at(vec, vec->len-1), vec->size);
+    vec->len--;
+    return true;
+}
+
 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.
     memcpy(yvec_at_nocheck(vec, vec->len), elements, n * vec->size);
--- a/src/base/vec.h	Sun Aug 25 16:57:47 2019 +0200
+++ b/src/base/vec.h	Sun Aug 25 18:45:20 2019 +0200
@@ -2,6 +2,7 @@
 #define base_vec_h
 
 #include <assert.h>
+#include <stdbool.h>
 #include <stdlib.h>
 
 /**
@@ -68,7 +69,13 @@
  * Elements are appended at `vec[vec.len]`. Use `yvec_resize()` to change the
  * length.
  */
-size_t yvec_push(yvec_t *vec, const void *element);
+size_t yvec_push(yvec_t* vec, const void *element);
+
+/**
+ * @brief Remove an element and returns true if the vector had at least one element. The element is stored into `dst`, which must point to
+ * a memory area of at least `vec->size` bytes.
+ */
+bool yvec_pop(yvec_t* vec, void* dst);
 
 /**
  * @brief Append several elements from a raw array. The size of elements must