lib/vec: vec_reset and vec_pop
This commit is contained in:
@@ -31,9 +31,13 @@ typedef struct
|
|||||||
|
|
||||||
static_assert(sizeof(vec_t) == 64, "Expected sizeof(vec_t) to be 64");
|
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(vec_t *vec, const void *const ptr, u64 size);
|
||||||
void vec_append_byte(vec_t *vec, u8 byte);
|
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
|
// Returns pointer to the start of the buffer VEC is currently using to store
|
||||||
// data (either its inline buffer or the heap buffer).
|
// data (either its inline buffer or the heap buffer).
|
||||||
void *vec_data(vec_t *vec);
|
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
|
// Ensure VEC has at least SIZE bytes free
|
||||||
void vec_ensure_free(vec_t *vec, u64 size);
|
void vec_ensure_free(vec_t *vec, u64 size);
|
||||||
|
|
||||||
|
// Free the memory associated with the vector
|
||||||
void vec_free(vec_t *vec);
|
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.
|
// Copy all data from V1 into V2.
|
||||||
void vec_clone(vec_t *v2, vec_t *v1);
|
void vec_clone(vec_t *v2, vec_t *v1);
|
||||||
|
|
||||||
|
|||||||
@@ -31,6 +31,14 @@ void vec_append_byte(vec_t *vec, u8 byte)
|
|||||||
++vec->size;
|
++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)
|
void *vec_data(vec_t *vec)
|
||||||
{
|
{
|
||||||
if (!vec)
|
if (!vec)
|
||||||
@@ -89,6 +97,14 @@ void vec_free(vec_t *vec)
|
|||||||
memset(vec, 1, sizeof(*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)
|
void vec_clone(vec_t *v2, vec_t *v1)
|
||||||
{
|
{
|
||||||
if (!v1 || !v2)
|
if (!v1 || !v2)
|
||||||
|
|||||||
Reference in New Issue
Block a user