vec: vec_pop and vec_data
This commit is contained in:
30
src/vec.c
30
src/vec.c
@@ -30,7 +30,7 @@ void vec_append_byte(vec_t *vec, uint8_t byte)
|
||||
++vec->size;
|
||||
}
|
||||
|
||||
void *vec_data(vec_t *vec)
|
||||
u8 *vec_data(vec_t *vec)
|
||||
{
|
||||
if (!vec)
|
||||
return NULL;
|
||||
@@ -95,6 +95,34 @@ void vec_clone(vec_t *v2, vec_t *v1)
|
||||
vec_append(v2, vec_data(v1), v1->size);
|
||||
}
|
||||
|
||||
void *vec_pop(vec_t *vec, size_t member_size)
|
||||
{
|
||||
if (vec->size < member_size)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
vec->size -= member_size;
|
||||
return vec_data(vec) + vec->size;
|
||||
}
|
||||
|
||||
u64 vec_find(vec_t *vec, void *ptr, size_t ptrsize)
|
||||
{
|
||||
if (vec->size < ptrsize)
|
||||
return vec->size + 1;
|
||||
|
||||
u8 *base = vec_data(vec);
|
||||
for (u64 i = 0; i < vec->size; i += ptrsize)
|
||||
{
|
||||
auto member = base + i;
|
||||
if (!memcmp(member, ptr, ptrsize))
|
||||
{
|
||||
return i;
|
||||
}
|
||||
}
|
||||
|
||||
return vec->size + 1;
|
||||
}
|
||||
|
||||
/* Copyright (C) 2026 Aryadev Chavali
|
||||
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
|
||||
@@ -31,11 +31,13 @@ static_assert(sizeof(vec_t) == 64, "Expected sizeof(vec_t) to be 64");
|
||||
|
||||
void vec_append(vec_t *vec, const void *const ptr, uint64_t size);
|
||||
void vec_append_byte(vec_t *vec, uint8_t byte);
|
||||
void *vec_data(vec_t *vec);
|
||||
u8 *vec_data(vec_t *vec);
|
||||
void vec_ensure_capacity(vec_t *vec, uint64_t capacity);
|
||||
void vec_ensure_free(vec_t *vec, uint64_t size);
|
||||
void vec_free(vec_t *vec);
|
||||
void vec_clone(vec_t *v2, vec_t *v1);
|
||||
void *vec_pop(vec_t *vec, size_t member_size);
|
||||
u64 vec_find(vec_t *vec, void *ptr, size_t ptrsize);
|
||||
|
||||
#define VEC_GET(VEC, INDEX, TYPE) (((TYPE *)vec_data(VEC))[INDEX])
|
||||
|
||||
|
||||
Reference in New Issue
Block a user