vector: add convenience access methods

Accessing the last element of a vector is a common operation.
Having it named and bound checked would definetely be a plus for
`vlc_vector` usage. It avoids error-prones index accesses.
This commit is contained in:
Alaric Senat 2023-07-04 18:02:42 +02:00 committed by Steve Lhomme
parent fbb608d18c
commit 5344b0a910
2 changed files with 22 additions and 0 deletions

View File

@ -664,6 +664,24 @@ vlc_vector_move_(char *array, size_t index, size_t count, size_t target)
((item) = (pv)->data[vlc_vector_idx_##item], true); \
++vlc_vector_idx_##item)
/**
* Returns a reference to the vector's first element.
*/
#define vlc_vector_last(pv) \
( \
assert((pv)->size != 0), \
(pv)->data[(pv)->size - 1] \
)
/**
* Returns a reference on the vector's last element.
*/
#define vlc_vector_last_ref(pv) \
( \
assert((pv)->size != 0), \
&(pv)->data[(pv)->size - 1] \
)
/** @} */
#endif

View File

@ -39,6 +39,8 @@ static void test_vector_insert_remove(void)
assert(ok);
assert(vec.data[0] == 42);
assert(vec.size == 1);
assert(vlc_vector_last(&vec) == 42);
assert(*vlc_vector_last_ref(&vec) == 42);
ok = vlc_vector_push(&vec, 37);
assert(ok);
@ -66,6 +68,8 @@ static void test_vector_insert_remove(void)
assert(vec.data[0] == 42);
assert(vec.data[1] == 37);
assert(vec.data[2] == 77);
assert(vlc_vector_last(&vec) == 77);
assert(*vlc_vector_last_ref(&vec) == 77);
vlc_vector_clear(&vec);
assert(vec.size == 0);