From 42ac4f6bbb15c3019e41268b4a3c9723a190ec93 Mon Sep 17 00:00:00 2001 From: Aryadev Chavali Date: Thu, 29 Jan 2026 03:23:43 +0000 Subject: [PATCH] lib/vec: vec_reset and vec_pop --- include/arl/lib/vec.h | 9 +++++++++ src/lib/vec.c | 16 ++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/include/arl/lib/vec.h b/include/arl/lib/vec.h index ee62350..5b6142f 100644 --- a/include/arl/lib/vec.h +++ b/include/arl/lib/vec.h @@ -31,9 +31,13 @@ typedef struct static_assert(sizeof(vec_t) == 64, "Expected sizeof(vec_t) to be 64"); +// standard old appending methods void vec_append(vec_t *vec, const void *const ptr, u64 size); void vec_append_byte(vec_t *vec, u8 byte); +// vector-as-a-stack +u8 *vec_pop(vec_t *vec, u64 size); + // Returns pointer to the start of the buffer VEC is currently using to store // data (either its inline buffer or the heap buffer). void *vec_data(vec_t *vec); @@ -43,8 +47,13 @@ void vec_ensure_capacity(vec_t *vec, u64 capacity); // Ensure VEC has at least SIZE bytes free void vec_ensure_free(vec_t *vec, u64 size); + +// Free the memory associated with the vector void vec_free(vec_t *vec); +// Reset a vector while preserving any allocations +void vec_reset(vec_t *vec); + // Copy all data from V1 into V2. void vec_clone(vec_t *v2, vec_t *v1); diff --git a/src/lib/vec.c b/src/lib/vec.c index 084e2a6..d13263c 100644 --- a/src/lib/vec.c +++ b/src/lib/vec.c @@ -31,6 +31,14 @@ void vec_append_byte(vec_t *vec, u8 byte) ++vec->size; } +u8 *vec_pop(vec_t *vec, u64 size) +{ + if (!vec || vec->size < size) + return NULL; + vec->size -= size; + return (u8 *)vec_data(vec) + vec->size; +} + void *vec_data(vec_t *vec) { if (!vec) @@ -89,6 +97,14 @@ void vec_free(vec_t *vec) memset(vec, 1, sizeof(*vec)); } +void vec_reset(vec_t *vec) +{ + if (!vec) + return; + memset(vec_data(vec), 0, vec->capacity); + vec->size = 0; +} + void vec_clone(vec_t *v2, vec_t *v1) { if (!v1 || !v2)