From 314391afe6f93a73841bad759eec6c2ed214dc00 Mon Sep 17 00:00:00 2001 From: Alaric Senat Date: Wed, 5 Jul 2023 10:28:52 +0200 Subject: [PATCH] vector: add a reference iterator foreach loop For storage of types larger than native types a ref based iterated loop is handy to avoid copy. --- include/vlc_vector.h | 16 +++++++++++++++- src/test/vector.c | 9 +++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/include/vlc_vector.h b/include/vlc_vector.h index 146fe72509..2fe5574597 100644 --- a/include/vlc_vector.h +++ b/include/vlc_vector.h @@ -665,7 +665,21 @@ vlc_vector_move_(char *array, size_t index, size_t count, size_t target) ++vlc_vector_idx_##item) /** - * Returns a reference to the vector's first element. + * For-each loop with a reference iterator. + * + * Should be used for vector holding non-trivially copyable data. + * + * \param[out] ref The reference iterator + * \param[in] pv a pointer to the vector + */ +#define vlc_vector_foreach_ref(ref, pv) \ + for (size_t vlc_vector_idx_##ref = 0; \ + vlc_vector_idx_##ref < (pv)->size && \ + ((ref) = &(pv)->data[vlc_vector_idx_##ref], true); \ + ++vlc_vector_idx_##ref) + +/** + * Returns the vector's last element. */ #define vlc_vector_last(pv) \ ( \ diff --git a/src/test/vector.c b/src/test/vector.c index caeb928576..e02fc1b76f 100644 --- a/src/test/vector.c +++ b/src/test/vector.c @@ -257,6 +257,15 @@ static void test_vector_foreach(void) } assert(count == 10); + count = 0; + const int *ref; + vlc_vector_foreach_ref(ref, &vec) + { + assert(*ref == count); + assert(ref == &vec.data[count]); + count++; + } + vlc_vector_destroy(&vec); }