Mercurial > lbo > hg > ylisp
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