changeset 85:7f0a4a258b69

base/vec: Implement yvec_clone()
author Lewin Bormann <lbo@spheniscida.de>
date Mon, 26 Aug 2019 12:02:51 +0200
parents 6a42872a9f81
children 5c761c80c411
files src/base/vec.c src/base/vec.h
diffstat 2 files changed, 14 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/base/vec.c	Mon Aug 26 11:03:10 2019 +0200
+++ b/src/base/vec.c	Mon Aug 26 12:02:51 2019 +0200
@@ -113,6 +113,7 @@
 }
 
 void yvec_copy(yvec_t *src, yvec_t *dst) {
+    yvec_destroy(dst);
     dst->size = src->size;
     dst->len = src->len;
     dst->cap = src->len;
@@ -120,6 +121,13 @@
     memcpy(dst->base, src->base, src->len * src->size);
 }
 
+yvec_t yvec_clone(yvec_t* src) {
+    yvec_t new = *src;
+    new.base = malloc(src->size * src->len);
+    memcpy(new.base, src->base, src->size * src->len);
+    return new;
+}
+
 void yvec_destroy(yvec_t *vec) {
     free(vec->base);
     memset(vec, 0, sizeof(yvec_t));
--- a/src/base/vec.h	Mon Aug 26 11:03:10 2019 +0200
+++ b/src/base/vec.h	Mon Aug 26 12:02:51 2019 +0200
@@ -104,11 +104,16 @@
 void *yvec_at(yvec_t *vec, size_t index);
 
 /**
- * @brief Copy the entire contents to a new yvec.
+ * @brief Copy the entire contents to a new yvec. `dst` is destroyed before copying.
  */
 void yvec_copy(yvec_t *src, yvec_t *dst);
 
 /**
+ * @brief Return a copy of `src` (the full buffer is copied).
+ */
+yvec_t yvec_clone(yvec_t* src);
+
+/**
  * @brief Deallocate a vector. Resets all fields to 0.
  */
 void yvec_destroy(yvec_t *vec);