From 277606d4830a1011226ca345af4ffb649cd1f7b9 Mon Sep 17 00:00:00 2001 From: Aryadev Chavali Date: Tue, 17 Mar 2026 20:29:34 +0000 Subject: [PATCH] prick_vec: added vec_pop and vec_find --- prick_vec.h | 41 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 38 insertions(+), 3 deletions(-) diff --git a/prick_vec.h b/prick_vec.h index 0b88494..de60e01 100644 --- a/prick_vec.h +++ b/prick_vec.h @@ -20,7 +20,10 @@ PRICK_VEC_INLINE_CAPACITY). This makes lookup _even faster_ (no derefence and possibility of the entire vector existing in the CPU cache) and allows us to avoid allocation for smaller use cases. If the number of elements exceeds - PRICK_VEC_INLINE_CAPACITY, we utilise the allocator. + PRICK_VEC_INLINE_CAPACITY, we utilise the generic memory allocator (malloc). + + Tasks: + - TODO: Provide generic allocator support. */ #ifndef PRICK_VEC_H @@ -49,11 +52,13 @@ static_assert(sizeof(prick_vec_t) == 64, void prick_vec_append(prick_vec_t *vec, const void *const ptr, uint64_t size); void prick_vec_append_byte(prick_vec_t *vec, uint8_t byte); -void *prick_vec_data(prick_vec_t *vec); +uint8_t *prick_vec_data(prick_vec_t *vec); void prick_vec_ensure_capacity(prick_vec_t *vec, uint64_t capacity); void prick_vec_ensure_free(prick_vec_t *vec, uint64_t size); void prick_vec_free(prick_vec_t *vec); void prick_vec_clone(prick_vec_t *v2, prick_vec_t *v1); +void *prick_vec_pop(prick_vec_t *vec, size_t member_size); +size_t prick_vec_find(prick_vec_t *vec, void *ptr, size_t ptrsize); #define PRICK_VEC_GET(VEC, INDEX, TYPE) (((TYPE *)prick_vec_data(VEC))[INDEX]) @@ -81,7 +86,7 @@ void prick_vec_append_byte(prick_vec_t *vec, uint8_t byte) ++vec->size; } -void *prick_vec_data(prick_vec_t *vec) +uint8_t *prick_vec_data(prick_vec_t *vec) { if (!vec) return NULL; @@ -146,6 +151,36 @@ void prick_vec_clone(prick_vec_t *v2, prick_vec_t *v1) prick_vec_append(v2, prick_vec_data(v1), v1->size); } +void *prick_vec_pop(prick_vec_t *vec, size_t member_size) +{ + if (vec->size < member_size) + { + return NULL; + } + vec->size -= member_size; + return prick_vec_data(vec) + vec->size; +} + +size_t prick_vec_find(prick_vec_t *vec, void *ptr, size_t ptrsize) +{ + if (vec->size < ptrsize) + { + return vec->size + 1; + } + + uint8_t *base = prick_vec_data(vec); + for (size_t i = 0; i < vec->size; i += ptrsize) + { + void *member = base + i; + if (!memcmp(member, ptr, ptrsize)) + { + return i; + } + } + + return vec->size + 1; +} + #undef MAX #endif