ev_vec API changes
Signed-off-by: Robear Selwans <robear.selwans@outlook.com>
This commit is contained in:
87
ev_vec.h
87
ev_vec.h
@@ -155,36 +155,51 @@ ev_vec_init_impl(
|
|||||||
.data = __EV_VEC_EMPTY_ARRAY \
|
.data = __EV_VEC_EMPTY_ARRAY \
|
||||||
}).data
|
}).data
|
||||||
|
|
||||||
#define ev_vec_push(v, ...) ev_vec_push_impl((ev_vec_t*)&v,&__VA_ARGS__);
|
/*!
|
||||||
|
* \brief Syntactic sugar for `ev_vec_push_impl()` that allows multiple pushed in the same statement.
|
||||||
|
* \details Sample usage:
|
||||||
|
* ```
|
||||||
|
* ev_vec_t v;
|
||||||
|
* i32 x = 1;
|
||||||
|
* i32 y = 2;
|
||||||
|
* ev_vec_push(&v, &x); // ev_vec_push_impl(&v, &x);
|
||||||
|
* ev_vec_push(&v, &x, &y); // ev_vec_push_impl(&v, &x); ev_vec_push_impl(&v, &y);
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* *Note* This is possibly replaceable with a variadic function.
|
||||||
|
*/
|
||||||
|
#define ev_vec_push(v, ...) \
|
||||||
|
EV_FOREACH_UDATA(__ev_vec_internal_push, v, __VA_ARGS__);
|
||||||
|
#define __ev_vec_internal_push(v, var) ev_vec_push_impl((ev_vec_t*)v, var);
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* \param v The vector that we want an iterator for
|
* \param v A pointer to the vector that we want an iterator for
|
||||||
*
|
*
|
||||||
* \returns A pointer to the first element in a vector
|
* \returns A pointer to the first element in a vector
|
||||||
*/
|
*/
|
||||||
EV_VEC_API void *
|
EV_VEC_API void *
|
||||||
ev_vec_iter_begin(
|
ev_vec_iter_begin(
|
||||||
ev_vec_t v);
|
const ev_vec_t* v);
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* \param v The vector that we want an iterator for
|
* \param v A pointer to the vector that we want an iterator for
|
||||||
*
|
*
|
||||||
* \returns A pointer to the memory block right after the last element in the vector
|
* \returns A pointer to the memory block right after the last element in the vector
|
||||||
*/
|
*/
|
||||||
EV_VEC_API void *
|
EV_VEC_API void *
|
||||||
ev_vec_iter_end(
|
ev_vec_iter_end(
|
||||||
ev_vec_t v);
|
const ev_vec_t* v);
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* \brief A function that increments an iterator to make it point to the next
|
* \brief A function that increments an iterator to make it point to the next
|
||||||
* element in the vector
|
* element in the vector
|
||||||
*
|
*
|
||||||
* \param v The vector that is being iterated over
|
* \param v A pointer to the vector that is being iterated over
|
||||||
* \param iter Reference to the iterator that is being incremented
|
* \param iter Reference to the iterator that is being incremented
|
||||||
*/
|
*/
|
||||||
EV_VEC_API void
|
EV_VEC_API void
|
||||||
ev_vec_iter_next(
|
ev_vec_iter_next(
|
||||||
ev_vec_t v,
|
const ev_vec_t* v,
|
||||||
void **iter);
|
void **iter);
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -195,11 +210,11 @@ ev_vec_iter_next(
|
|||||||
* *Note*: For stack-allocated vectors (`svec`), destructors are called for
|
* *Note*: For stack-allocated vectors (`svec`), destructors are called for
|
||||||
* elements but no memory is freed.
|
* elements but no memory is freed.
|
||||||
*
|
*
|
||||||
* \param v The vector that is being destroyed
|
* \param v A pointer to the vector that is being destroyed
|
||||||
*/
|
*/
|
||||||
EV_VEC_API void
|
EV_VEC_API void
|
||||||
ev_vec_fini(
|
ev_vec_fini(
|
||||||
ev_vec_t v);
|
ev_vec_t* v);
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* \brief A function that copies a value to the end of a vector. If the element
|
* \brief A function that copies a value to the end of a vector. If the element
|
||||||
@@ -253,48 +268,48 @@ ev_vec_append(
|
|||||||
/*!
|
/*!
|
||||||
* \brief A function that returns the last element in the vector.
|
* \brief A function that returns the last element in the vector.
|
||||||
*
|
*
|
||||||
* \param v Reference to the vector object
|
* \param v A pointer to the vector object
|
||||||
*
|
*
|
||||||
* \returns Pointer to the last element in the vector. NULL if the vector is
|
* \returns Pointer to the last element in the vector. NULL if the vector is
|
||||||
* empty.
|
* empty.
|
||||||
*/
|
*/
|
||||||
EV_VEC_API void *
|
EV_VEC_API void *
|
||||||
ev_vec_last(
|
ev_vec_last(
|
||||||
ev_vec_t v);
|
const ev_vec_t* v);
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* \brief A function that returns the length of a vector
|
* \brief A function that returns the length of a vector
|
||||||
*
|
*
|
||||||
* \param v The vector object
|
* \param v A pointer to the vector object
|
||||||
*
|
*
|
||||||
* \returns Current length of the vector
|
* \returns Current length of the vector
|
||||||
*/
|
*/
|
||||||
EV_VEC_API u64
|
EV_VEC_API u64
|
||||||
ev_vec_len(
|
ev_vec_len(
|
||||||
ev_vec_t v);
|
const ev_vec_t* v);
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* \brief A function that returns the capacity of a vector
|
* \brief A function that returns the capacity of a vector
|
||||||
*
|
*
|
||||||
* \param v The vector object
|
* \param v A pointer to the vector object
|
||||||
*
|
*
|
||||||
* \returns Current capacity of the vector
|
* \returns Current capacity of the vector
|
||||||
*/
|
*/
|
||||||
EV_VEC_API u64
|
EV_VEC_API u64
|
||||||
ev_vec_capacity(
|
ev_vec_capacity(
|
||||||
ev_vec_t v);
|
const ev_vec_t* v);
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* \brief Calls the free operation (if exists) on every element, then sets
|
* \brief Calls the free operation (if exists) on every element, then sets
|
||||||
* the length to 0.
|
* the length to 0.
|
||||||
*
|
*
|
||||||
* \param v The vector object
|
* \param v A pointer to the vector object
|
||||||
*
|
*
|
||||||
* \returns 0 on success
|
* \returns 0 on success
|
||||||
*/
|
*/
|
||||||
EV_VEC_API u32
|
EV_VEC_API u32
|
||||||
ev_vec_clear(
|
ev_vec_clear(
|
||||||
ev_vec_t v);
|
const ev_vec_t* v);
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* \brief Sets the length of the vector to `len`.
|
* \brief Sets the length of the vector to `len`.
|
||||||
@@ -384,9 +399,9 @@ ev_vec_init_impl(
|
|||||||
|
|
||||||
void
|
void
|
||||||
ev_vec_fini(
|
ev_vec_fini(
|
||||||
ev_vec_t v)
|
ev_vec_t* v)
|
||||||
{
|
{
|
||||||
__ev_vec_getmeta(v)
|
__ev_vec_getmeta(*v)
|
||||||
|
|
||||||
if (metadata->typeData.free_fn) {
|
if (metadata->typeData.free_fn) {
|
||||||
for (void *elem = ev_vec_iter_begin(v); elem != ev_vec_iter_end(v);
|
for (void *elem = ev_vec_iter_begin(v); elem != ev_vec_iter_end(v);
|
||||||
@@ -397,6 +412,8 @@ ev_vec_fini(
|
|||||||
if(metadata->allocationType == EV_VEC_ALLOCATION_TYPE_HEAP) {
|
if(metadata->allocationType == EV_VEC_ALLOCATION_TYPE_HEAP) {
|
||||||
free(metadata);
|
free(metadata);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
*v = EV_INVALID(ev_vec_t);
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
@@ -427,26 +444,26 @@ ev_vec_push_impl(
|
|||||||
|
|
||||||
void *
|
void *
|
||||||
ev_vec_iter_begin(
|
ev_vec_iter_begin(
|
||||||
ev_vec_t v)
|
const ev_vec_t* v)
|
||||||
{
|
{
|
||||||
return v;
|
return *v;
|
||||||
}
|
}
|
||||||
|
|
||||||
void *
|
void *
|
||||||
ev_vec_iter_end(
|
ev_vec_iter_end(
|
||||||
ev_vec_t v)
|
const ev_vec_t* v)
|
||||||
{
|
{
|
||||||
__ev_vec_getmeta(v)
|
__ev_vec_getmeta(*v)
|
||||||
|
|
||||||
return ((char *)v) + (metadata->typeData.size * metadata->length);
|
return ((char *)*v) + (metadata->typeData.size * metadata->length);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
ev_vec_iter_next(
|
ev_vec_iter_next(
|
||||||
ev_vec_t v,
|
const ev_vec_t* v,
|
||||||
void **iter)
|
void **iter)
|
||||||
{
|
{
|
||||||
__ev_vec_getmeta(v)
|
__ev_vec_getmeta(*v)
|
||||||
*iter = ((char*)*iter) + metadata->typeData.size;
|
*iter = ((char*)*iter) + metadata->typeData.size;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -500,38 +517,38 @@ ev_vec_pop(
|
|||||||
|
|
||||||
void *
|
void *
|
||||||
ev_vec_last(
|
ev_vec_last(
|
||||||
ev_vec_t v)
|
const ev_vec_t* v)
|
||||||
{
|
{
|
||||||
__ev_vec_getmeta(v)
|
__ev_vec_getmeta(*v)
|
||||||
|
|
||||||
if(metadata->length == 0) {
|
if(metadata->length == 0) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
return ((char *)v) + ((metadata->length-1) * metadata->typeData.size);
|
return ((char *)*v) + ((metadata->length-1) * metadata->typeData.size);
|
||||||
}
|
}
|
||||||
|
|
||||||
u64
|
u64
|
||||||
ev_vec_len(
|
ev_vec_len(
|
||||||
ev_vec_t v)
|
const ev_vec_t* v)
|
||||||
{
|
{
|
||||||
__ev_vec_getmeta(v)
|
__ev_vec_getmeta(*v)
|
||||||
return metadata->length;
|
return metadata->length;
|
||||||
}
|
}
|
||||||
|
|
||||||
u64
|
u64
|
||||||
ev_vec_capacity(
|
ev_vec_capacity(
|
||||||
ev_vec_t v)
|
const ev_vec_t* v)
|
||||||
{
|
{
|
||||||
__ev_vec_getmeta(v)
|
__ev_vec_getmeta(*v)
|
||||||
return metadata->capacity;
|
return metadata->capacity;
|
||||||
}
|
}
|
||||||
|
|
||||||
u32
|
u32
|
||||||
ev_vec_clear(
|
ev_vec_clear(
|
||||||
ev_vec_t v)
|
const ev_vec_t* v)
|
||||||
{
|
{
|
||||||
__ev_vec_getmeta(v)
|
__ev_vec_getmeta(*v)
|
||||||
|
|
||||||
if (metadata->typeData.free_fn) {
|
if (metadata->typeData.free_fn) {
|
||||||
for (void *elem = ev_vec_iter_begin(v); elem != ev_vec_iter_end(v);
|
for (void *elem = ev_vec_iter_begin(v); elem != ev_vec_iter_end(v);
|
||||||
|
|||||||
Reference in New Issue
Block a user