Go to the documentation of this file.
64 #define VLC_VECTOR(type) \
74 #define VLC_VECTOR_INITIALIZER { 0, 0, NULL }
79 #define vlc_vector_init(pv) (void) \
92 #define vlc_vector_destroy(pv) \
100 #define vlc_vector_clear(pv) \
103 vlc_vector_destroy(pv), \
104 vlc_vector_init(pv) \
112 #define VLC_VECTOR_MINCAP_ ((size_t) 10)
117 return a < b ? a : b;
123 return a > b ? a : b;
138 #define VLC_VECTOR_FAILFLAG_ (~(((size_t) -1) >> 1))
168 size_t *restrict pcap,
size_t *restrict psize)
211 #define vlc_vector_realloc_(pv, newcap) \
213 (pv)->data = vlc_vector_reallocdata_((pv)->data, newcap, \
214 sizeof(*(pv)->data), \
215 &(pv)->cap, &(pv)->size), \
216 !vlc_vector_test_and_reset_failflag_(&(pv)->cap) \
231 #define vlc_vector_resize_(pv, newcap) \
233 (pv)->cap == (newcap) || \
235 (newcap) > 0 ? vlc_vector_realloc_(pv, newcap) \
236 : (vlc_vector_clear(pv), true) \
244 return value + (value >> 1);
248 #define vlc_vector_max_cap_(pv) (SIZE_MAX / 2 / sizeof(*(pv)->data))
258 #define vlc_vector_reserve(pv, mincap) \
260 vlc_vector_reserve_internal_(pv, \
261 vlc_vector_max_(mincap, VLC_VECTOR_MINCAP_))
263 #define vlc_vector_reserve_internal_(pv, mincap) \
265 (mincap) <= (pv)->cap || \
267 (mincap) <= vlc_vector_max_cap_(pv) && \
268 vlc_vector_realloc_(pv, \
270 vlc_vector_between_(vlc_vector_growsize_((pv)->cap), \
272 vlc_vector_max_cap_(pv))) \
281 #define vlc_vector_shrink_to_fit(pv) \
283 vlc_vector_resize_(pv, (pv)->size)
292 #define vlc_vector_autoshrink(pv) (void) \
294 (pv)->cap <= VLC_VECTOR_MINCAP_ || \
295 (pv)->cap < vlc_vector_growsize_((pv)->size+5) || \
296 vlc_vector_resize_(pv, vlc_vector_max_((pv)->size+5, VLC_VECTOR_MINCAP_)) \
299 #define vlc_vector_check_same_ptr_type_(a, b) \
312 #define vlc_vector_push(pv, item) \
314 vlc_vector_reserve(pv, (pv)->size + 1) && \
316 (pv)->data[(pv)->size++] = (item), \
330 #define vlc_vector_push_all(pv, items, count) \
331 vlc_vector_push_all_internal_(pv, items, vlc_vector_enforce_size_t_(count))
333 #define vlc_vector_push_all_internal_(pv, items, count) \
335 vlc_vector_check_same_ptr_type_((pv)->data, items), \
336 vlc_vector_reserve(pv, (pv)->size + (count)) && \
338 memcpy(&(pv)->data[(pv)->size], items, (count) * sizeof(*(pv)->data)), \
339 (pv)->size += (count), \
356 #define vlc_vector_insert_hole(pv, index, count) \
357 vlc_vector_insert_hole_internal_(pv, vlc_vector_enforce_size_t_(index), \
358 vlc_vector_enforce_size_t_(count))
360 #define vlc_vector_insert_hole_internal_(pv, index, count) \
362 vlc_vector_reserve(pv, (pv)->size + (count)) && \
364 (index) == (pv)->size || \
366 memmove(&(pv)->data[(index) + (count)], \
367 &(pv)->data[index], \
368 ((pv)->size - (index)) * sizeof(*(pv)->data)), \
373 (pv)->size += (count), \
389 #define vlc_vector_insert(pv, index, item) \
391 vlc_vector_insert_hole(pv, index, 1) && \
393 (pv)->data[index] = (item), \
410 #define vlc_vector_insert_all(pv, index, items, count) \
412 vlc_vector_check_same_ptr_type_((pv)->data, items), \
413 vlc_vector_insert_hole(pv, index, count) && \
415 memcpy(&(pv)->data[index], items, (count) * sizeof(*(pv)->data)), \
424 for (
size_t i = 0; i < len / 2; ++i)
427 array[i] = array[len - i - 1];
428 array[len - i - 1] = c;
489 #define vlc_vector_move_slice(pv, index, count, target) \
490 vlc_vector_move_slice_internal_(pv, \
491 vlc_vector_enforce_size_t_(index), \
492 vlc_vector_enforce_size_t_(count), \
493 vlc_vector_enforce_size_t_(target))
495 #define vlc_vector_move_slice_internal_(pv, index, count, target) \
496 vlc_vector_move_((char *) (pv)->data, \
497 (index) * sizeof((pv)->data[0]), \
498 (count) * sizeof((pv)->data[0]), \
499 (target) * sizeof((pv)->data[0]))
510 #define vlc_vector_move(pv, index, target) \
511 vlc_vector_move_slice(pv, index, 1, target)
525 #define vlc_vector_remove_slice_noshrink(pv, index, count) \
526 vlc_vector_remove_slice_noshrink_internal_(pv, \
527 vlc_vector_enforce_size_t_(index), \
528 vlc_vector_enforce_size_t_(count))
530 #define vlc_vector_remove_slice_noshrink_internal_(pv, index, count) \
532 if ((index) + (count) < (pv)->size) \
533 memmove(&(pv)->data[index], \
534 &(pv)->data[(index) + (count)], \
535 ((pv)->size - (index) - (count)) * sizeof(*(pv)->data)); \
536 (pv)->size -= (count); \
548 #define vlc_vector_remove_slice(pv, index, count) \
550 vlc_vector_remove_slice_noshrink(pv, index, count); \
551 vlc_vector_autoshrink(pv); \
565 #define vlc_vector_remove_noshrink(pv, index) \
566 vlc_vector_remove_slice_noshrink(pv, index, 1)
576 #define vlc_vector_remove(pv, index) \
578 vlc_vector_remove_noshrink(pv, index); \
579 vlc_vector_autoshrink(pv); \
593 #define vlc_vector_swap_remove(pv, index) \
595 (pv)->data[index] = (pv)->data[(pv)->size-1]; \
614 #define vlc_vector_index_of(pv, item, pidx) \
616 ssize_t *out = pidx; \
617 size_t vlc_vector_find_idx_; \
618 for (vlc_vector_find_idx_ = 0; \
619 vlc_vector_find_idx_ < (pv)->size; \
620 ++vlc_vector_find_idx_) \
621 if ((pv)->data[vlc_vector_find_idx_] == (item)) \
623 *out = vlc_vector_find_idx_ == (pv)->size ? -1 : \
624 (ssize_t) vlc_vector_find_idx_; \
636 #define vlc_vector_foreach(item, pv) \
637 for (size_t vlc_vector_idx_##item = 0; \
638 vlc_vector_idx_##item < (pv)->size && \
639 ((item) = (pv)->data[vlc_vector_idx_##item], true); \
640 ++vlc_vector_idx_##item)
size_t count
Definition: core.c:401
static size_t vlc_vector_between_(size_t x, size_t min, size_t max)
Definition: vlc_vector.h:128
static size_t vlc_vector_enforce_size_t_(size_t value)
Definition: vlc_vector.h:134
static size_t vlc_vector_min_(size_t a, size_t b)
Definition: vlc_vector.h:116
static size_t vlc_vector_max_(size_t a, size_t b)
Definition: vlc_vector.h:122
static size_t vlc_vector_growsize_(size_t value)
Definition: vlc_vector.h:242
static void vlc_vector_rotate_array_right_(char *array, size_t len, size_t distance)
Right-rotate a (char) array in place.
Definition: vlc_vector.h:458
static bool vlc_vector_test_and_reset_failflag_(size_t *pcap)
Test and reset the fail flag.
Definition: vlc_vector.h:192
static void * vlc_reallocarray(void *ptr, size_t count, size_t size)
Definition: vlc_common.h:1150
static void * vlc_vector_reallocdata_(void *ptr, size_t count, size_t size, size_t *restrict pcap, size_t *restrict psize)
Realloc data and update vector fields.
Definition: vlc_vector.h:168
static void vlc_vector_move_(char *array, size_t index, size_t count, size_t target)
Move items in a (char) array in place.
Definition: vlc_vector.h:469
static void vlc_vector_rotate_array_left_(char *array, size_t len, size_t distance)
Right-rotate a (char) array in place.
Definition: vlc_vector.h:442
static void vlc_vector_reverse_array_(char *array, size_t len)
Reverse a char array in place.
Definition: vlc_vector.h:423
#define VLC_VECTOR_FAILFLAG_
Definition: vlc_vector.h:139