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;
|
++vec->size;
|
||||||
}
|
}
|
||||||
|
|
||||||
void *vec_data(vec_t *vec)
|
u8 *vec_data(vec_t *vec)
|
||||||
{
|
{
|
||||||
if (!vec)
|
if (!vec)
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -95,6 +95,34 @@ void vec_clone(vec_t *v2, vec_t *v1)
|
|||||||
vec_append(v2, vec_data(v1), v1->size);
|
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
|
/* Copyright (C) 2026 Aryadev Chavali
|
||||||
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
* 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(vec_t *vec, const void *const ptr, uint64_t size);
|
||||||
void vec_append_byte(vec_t *vec, uint8_t byte);
|
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_capacity(vec_t *vec, uint64_t capacity);
|
||||||
void vec_ensure_free(vec_t *vec, uint64_t size);
|
void vec_ensure_free(vec_t *vec, uint64_t size);
|
||||||
void vec_free(vec_t *vec);
|
void vec_free(vec_t *vec);
|
||||||
void vec_clone(vec_t *v2, vec_t *v1);
|
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])
|
#define VEC_GET(VEC, INDEX, TYPE) (((TYPE *)vec_data(VEC))[INDEX])
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user