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)
195 *pcap &= ~VLC_VECTOR_FAILFLAG_;
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) 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 size_t vlc_vector_between_(size_t x, size_t min, size_t max)
Definition: vlc_vector.h:128
static bool vlc_vector_test_and_reset_failflag_(size_t *pcap)
Test and reset the fail flag.
Definition: vlc_vector.h:192
static size_t vlc_vector_enforce_size_t_(size_t value)
Definition: vlc_vector.h:134
#define VLC_VECTOR_FAILFLAG_
Definition: vlc_vector.h:139
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_reverse_array_(char *array, size_t len)
Reverse a char array in place.
Definition: vlc_vector.h:423
static size_t vlc_vector_min_(size_t a, size_t b)
Definition: vlc_vector.h:116
size_t count
Definition: core.c:402
static size_t vlc_vector_max_(size_t a, size_t b)
Definition: vlc_vector.h:122
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_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_reallocarray(void *ptr, size_t count, size_t size)
Definition: vlc_common.h:1147
static size_t vlc_vector_growsize_(size_t value)
Definition: vlc_vector.h:242