20 #if !defined (GDB_VEC_H) 33 # define DIAGNOSTIC_IGNORE_UNUSED_VEC_FUNCTION \ 34 DIAGNOSTIC_IGNORE_UNUSED_FUNCTION 36 # define DIAGNOSTIC_IGNORE_UNUSED_VEC_FUNCTION 140 #define VEC_length(T,V) (VEC_OP(T,length)(V)) 148 #define VEC_empty(T,V) (VEC_length (T,V) == 0) 158 #define VEC_last(T,V) (VEC_OP(T,last)(V VEC_ASSERT_INFO)) 167 #define VEC_index(T,V,I) (VEC_OP(T,index)(V,I VEC_ASSERT_INFO)) 181 #define VEC_iterate(T,V,I,P) (VEC_OP(T,iterate)(V,I,&(P))) 189 #define VEC_alloc(T,N) (VEC_OP(T,alloc)(N)) 196 #define VEC_free(T,V) (VEC_OP(T,free)(&V)) 203 #define VEC_cleanup(T) (VEC_OP(T,cleanup)) 213 #define VEC_embedded_size(T,N) (VEC_OP(T,embedded_size)(N)) 214 #define VEC_embedded_init(T,O,N) (VEC_OP(T,embedded_init)(VEC_BASE(O),N)) 222 #define VEC_copy(T,V) (VEC_OP(T,copy)(V)) 229 #define VEC_merge(T,V1,V2) (VEC_OP(T,merge)(V1, V2)) 241 #define VEC_space(T,V,R) (VEC_OP(T,space)(V,R VEC_ASSERT_INFO)) 253 #define VEC_reserve(T,V,R) (VEC_OP(T,reserve)(&(V),R VEC_ASSERT_INFO)) 265 #define VEC_quick_push(T,V,O) (VEC_OP(T,quick_push)(V,O VEC_ASSERT_INFO)) 276 #define VEC_safe_push(T,V,O) (VEC_OP(T,safe_push)(&(V),O VEC_ASSERT_INFO)) 286 #define VEC_pop(T,V) (VEC_OP(T,pop)(V VEC_ASSERT_INFO)) 294 #define VEC_truncate(T,V,I) \ 295 (VEC_OP(T,truncate)(V,I VEC_ASSERT_INFO)) 304 #define VEC_safe_grow(T,V,I) \ 305 (VEC_OP(T,safe_grow)(&(V),I VEC_ASSERT_INFO)) 318 #define VEC_replace(T,V,I,O) (VEC_OP(T,replace)(V,I,O VEC_ASSERT_INFO)) 330 #define VEC_quick_insert(T,V,I,O) \ 331 (VEC_OP(T,quick_insert)(V,I,O VEC_ASSERT_INFO)) 343 #define VEC_safe_insert(T,V,I,O) \ 344 (VEC_OP(T,safe_insert)(&(V),I,O VEC_ASSERT_INFO)) 355 #define VEC_ordered_remove(T,V,I) \ 356 (VEC_OP(T,ordered_remove)(V,I VEC_ASSERT_INFO)) 367 #define VEC_unordered_remove(T,V,I) \ 368 (VEC_OP(T,unordered_remove)(V,I VEC_ASSERT_INFO)) 376 #define VEC_block_remove(T,V,I,L) \ 377 (VEC_OP(T,block_remove)(V,I,L VEC_ASSERT_INFO)) 385 #define VEC_address(T,V) (VEC_OP(T,address)(V)) 399 #define VEC_lower_bound(T,V,O,LT) \ 400 (VEC_OP(T,lower_bound)(V,O,LT VEC_ASSERT_INFO)) 405 #define vec_free_(V) xfree (V) 407 #define VEC_ASSERT_INFO ,__FILE__,__LINE__ 408 #define VEC_ASSERT_DECL ,const char *file_,unsigned line_ 409 #define VEC_ASSERT_PASS ,file_,line_ 410 #define vec_assert(expr, op) \ 411 ((void)((expr) ? 0 : (gdb_assert_fail (op, file_, line_, \ 414 #define VEC(T) VEC_##T 415 #define VEC_OP(T,OP) VEC_##T##_##OP 418 typedef struct VEC(T) \ 426 #define DEF_VEC_I(T) \ 428 DIAGNOSTIC_IGNORE_UNUSED_VEC_FUNCTION \ 429 static inline void VEC_OP (T,must_be_integral_type) (void) \ 436 DEF_VEC_ALLOC_FUNC_I(T) \ 438 struct vec_swallow_trailing_semi 441 #define DEF_VEC_P(T) \ 443 DIAGNOSTIC_IGNORE_UNUSED_VEC_FUNCTION \ 444 static inline void VEC_OP (T,must_be_pointer_type) (void) \ 446 (void)((T)1 == (void *)1); \ 451 DEF_VEC_ALLOC_FUNC_P(T) \ 453 struct vec_swallow_trailing_semi 456 #define DEF_VEC_O(T) \ 458 DIAGNOSTIC_IGNORE_UNUSED_VEC_FUNCTION \ 461 DEF_VEC_ALLOC_FUNC_O(T) \ 463 struct vec_swallow_trailing_semi 471 #define vec_offset(T, VPTR) ((size_t) ((char *) &(VPTR)->vec - (char *) VPTR)) 473 #define DEF_VEC_ALLOC_FUNC_I(T) \ 474 static inline VEC(T) *VEC_OP (T,alloc) \ 480 return (VEC(T) *) vec_o_reserve (NULL, -alloc_, \ 481 vec_offset (T, &dummy), sizeof (T)); \ 484 static inline VEC(T) *VEC_OP (T,copy) (VEC(T) *vec_) \ 486 size_t len_ = vec_ ? vec_->num : 0; \ 487 VEC (T) *new_vec_ = NULL; \ 494 new_vec_ = (VEC (T) *) \ 495 vec_o_reserve (NULL, -len_, vec_offset (T, &dummy), sizeof (T)); \ 497 new_vec_->num = len_; \ 498 memcpy (new_vec_->vec, vec_->vec, sizeof (T) * len_); \ 503 static inline VEC(T) *VEC_OP (T,merge) (VEC(T) *vec1_, VEC(T) *vec2_) \ 505 if (vec1_ && vec2_) \ 508 size_t len_ = vec1_->num + vec2_->num; \ 509 VEC (T) *new_vec_ = NULL; \ 512 new_vec_ = (VEC (T) *) \ 513 vec_o_reserve (NULL, -len_, vec_offset (T, &dummy), sizeof (T)); \ 515 new_vec_->num = len_; \ 516 memcpy (new_vec_->vec, vec1_->vec, sizeof (T) * vec1_->num); \ 517 memcpy (new_vec_->vec + vec1_->num, vec2_->vec, \ 518 sizeof (T) * vec2_->num); \ 523 return VEC_copy (T, vec1_ ? vec1_ : vec2_); \ 526 static inline void VEC_OP (T,free) \ 534 static inline void VEC_OP (T,cleanup) \ 537 VEC(T) **vec_ = (VEC(T) **) arg_; \ 543 static inline int VEC_OP (T,reserve) \ 544 (VEC(T) **vec_, int alloc_ VEC_ASSERT_DECL) \ 547 int extend = !VEC_OP (T,space) \ 548 (*vec_, alloc_ < 0 ? -alloc_ : alloc_ VEC_ASSERT_PASS); \ 551 *vec_ = (VEC(T) *) vec_o_reserve (*vec_, alloc_, \ 552 vec_offset (T, &dummy), sizeof (T)); \ 557 static inline void VEC_OP (T,safe_grow) \ 558 (VEC(T) **vec_, int size_ VEC_ASSERT_DECL) \ 560 vec_assert (size_ >= 0 && VEC_OP(T,length) (*vec_) <= (unsigned)size_, \ 562 VEC_OP (T,reserve) (vec_, (int)(*vec_ ? (*vec_)->num : 0) - size_ \ 564 (*vec_)->num = size_; \ 567 static inline T *VEC_OP (T,safe_push) \ 568 (VEC(T) **vec_, const T obj_ VEC_ASSERT_DECL) \ 570 VEC_OP (T,reserve) (vec_, 1 VEC_ASSERT_PASS); \ 572 return VEC_OP (T,quick_push) (*vec_, obj_ VEC_ASSERT_PASS); \ 575 static inline T *VEC_OP (T,safe_insert) \ 576 (VEC(T) **vec_, unsigned ix_, const T obj_ VEC_ASSERT_DECL) \ 578 VEC_OP (T,reserve) (vec_, 1 VEC_ASSERT_PASS); \ 580 return VEC_OP (T,quick_insert) (*vec_, ix_, obj_ VEC_ASSERT_PASS); \ 583 #define DEF_VEC_FUNC_P(T) \ 584 static inline unsigned VEC_OP (T,length) (const VEC(T) *vec_) \ 586 return vec_ ? vec_->num : 0; \ 589 static inline T VEC_OP (T,last) \ 590 (const VEC(T) *vec_ VEC_ASSERT_DECL) \ 592 vec_assert (vec_ && vec_->num, "last"); \ 594 return vec_->vec[vec_->num - 1]; \ 597 static inline T VEC_OP (T,index) \ 598 (const VEC(T) *vec_, unsigned ix_ VEC_ASSERT_DECL) \ 600 vec_assert (vec_ && ix_ < vec_->num, "index"); \ 602 return vec_->vec[ix_]; \ 605 static inline int VEC_OP (T,iterate) \ 606 (const VEC(T) *vec_, unsigned ix_, T *ptr) \ 608 if (vec_ && ix_ < vec_->num) \ 610 *ptr = vec_->vec[ix_]; \ 620 static inline size_t VEC_OP (T,embedded_size) \ 625 return vec_offset (T, &dummy) + alloc_ * sizeof(T); \ 628 static inline void VEC_OP (T,embedded_init) \ 629 (VEC(T) *vec_, int alloc_) \ 632 vec_->alloc = alloc_; \ 635 static inline int VEC_OP (T,space) \ 636 (VEC(T) *vec_, int alloc_ VEC_ASSERT_DECL) \ 638 vec_assert (alloc_ >= 0, "space"); \ 639 return vec_ ? vec_->alloc - vec_->num >= (unsigned)alloc_ : !alloc_; \ 642 static inline T *VEC_OP (T,quick_push) \ 643 (VEC(T) *vec_, T obj_ VEC_ASSERT_DECL) \ 647 vec_assert (vec_->num < vec_->alloc, "quick_push"); \ 648 slot_ = &vec_->vec[vec_->num++]; \ 654 static inline T VEC_OP (T,pop) (VEC(T) *vec_ VEC_ASSERT_DECL) \ 658 vec_assert (vec_->num, "pop"); \ 659 obj_ = vec_->vec[--vec_->num]; \ 664 static inline void VEC_OP (T,truncate) \ 665 (VEC(T) *vec_, unsigned size_ VEC_ASSERT_DECL) \ 667 vec_assert (vec_ ? vec_->num >= size_ : !size_, "truncate"); \ 672 static inline T VEC_OP (T,replace) \ 673 (VEC(T) *vec_, unsigned ix_, T obj_ VEC_ASSERT_DECL) \ 677 vec_assert (ix_ < vec_->num, "replace"); \ 678 old_obj_ = vec_->vec[ix_]; \ 679 vec_->vec[ix_] = obj_; \ 684 static inline T *VEC_OP (T,quick_insert) \ 685 (VEC(T) *vec_, unsigned ix_, T obj_ VEC_ASSERT_DECL) \ 689 vec_assert (vec_->num < vec_->alloc && ix_ <= vec_->num, "quick_insert"); \ 690 slot_ = &vec_->vec[ix_]; \ 691 memmove (slot_ + 1, slot_, (vec_->num++ - ix_) * sizeof (T)); \ 697 static inline T VEC_OP (T,ordered_remove) \ 698 (VEC(T) *vec_, unsigned ix_ VEC_ASSERT_DECL) \ 703 vec_assert (ix_ < vec_->num, "ordered_remove"); \ 704 slot_ = &vec_->vec[ix_]; \ 706 memmove (slot_, slot_ + 1, (--vec_->num - ix_) * sizeof (T)); \ 711 static inline T VEC_OP (T,unordered_remove) \ 712 (VEC(T) *vec_, unsigned ix_ VEC_ASSERT_DECL) \ 717 vec_assert (ix_ < vec_->num, "unordered_remove"); \ 718 slot_ = &vec_->vec[ix_]; \ 720 *slot_ = vec_->vec[--vec_->num]; \ 725 static inline void VEC_OP (T,block_remove) \ 726 (VEC(T) *vec_, unsigned ix_, unsigned len_ VEC_ASSERT_DECL) \ 730 vec_assert (ix_ + len_ <= vec_->num, "block_remove"); \ 731 slot_ = &vec_->vec[ix_]; \ 733 memmove (slot_, slot_ + len_, (vec_->num - ix_) * sizeof (T)); \ 736 static inline T *VEC_OP (T,address) \ 739 return vec_ ? vec_->vec : 0; \ 742 static inline unsigned VEC_OP (T,lower_bound) \ 743 (VEC(T) *vec_, const T obj_, \ 744 int (*lessthan_)(const T, const T) VEC_ASSERT_DECL) \ 746 unsigned int len_ = VEC_OP (T, length) (vec_); \ 747 unsigned int half_, middle_; \ 748 unsigned int first_ = 0; \ 755 middle_elem_ = VEC_OP (T,index) (vec_, middle_ VEC_ASSERT_PASS); \ 756 if (lessthan_ (middle_elem_, obj_)) \ 760 len_ = len_ - half_ - 1; \ 768 #define DEF_VEC_ALLOC_FUNC_P(T) \ 769 static inline VEC(T) *VEC_OP (T,alloc) \ 773 return (VEC(T) *) vec_p_reserve (NULL, -alloc_); \ 776 static inline void VEC_OP (T,free) \ 784 static inline void VEC_OP (T,cleanup) \ 787 VEC(T) **vec_ = (VEC(T) **) arg_; \ 793 static inline VEC(T) *VEC_OP (T,copy) (VEC(T) *vec_) \ 795 size_t len_ = vec_ ? vec_->num : 0; \ 796 VEC (T) *new_vec_ = NULL; \ 801 new_vec_ = (VEC (T) *)(vec_p_reserve (NULL, -len_)); \ 803 new_vec_->num = len_; \ 804 memcpy (new_vec_->vec, vec_->vec, sizeof (T) * len_); \ 809 static inline VEC(T) *VEC_OP (T,merge) (VEC(T) *vec1_, VEC(T) *vec2_) \ 811 if (vec1_ && vec2_) \ 813 size_t len_ = vec1_->num + vec2_->num; \ 814 VEC (T) *new_vec_ = NULL; \ 817 new_vec_ = (VEC (T) *)(vec_p_reserve (NULL, -len_)); \ 819 new_vec_->num = len_; \ 820 memcpy (new_vec_->vec, vec1_->vec, sizeof (T) * vec1_->num); \ 821 memcpy (new_vec_->vec + vec1_->num, vec2_->vec, \ 822 sizeof (T) * vec2_->num); \ 827 return VEC_copy (T, vec1_ ? vec1_ : vec2_); \ 830 static inline int VEC_OP (T,reserve) \ 831 (VEC(T) **vec_, int alloc_ VEC_ASSERT_DECL) \ 833 int extend = !VEC_OP (T,space) \ 834 (*vec_, alloc_ < 0 ? -alloc_ : alloc_ VEC_ASSERT_PASS); \ 837 *vec_ = (VEC(T) *) vec_p_reserve (*vec_, alloc_); \ 842 static inline void VEC_OP (T,safe_grow) \ 843 (VEC(T) **vec_, int size_ VEC_ASSERT_DECL) \ 845 vec_assert (size_ >= 0 && VEC_OP(T,length) (*vec_) <= (unsigned)size_, \ 848 (vec_, (int)(*vec_ ? (*vec_)->num : 0) - size_ VEC_ASSERT_PASS); \ 849 (*vec_)->num = size_; \ 852 static inline T *VEC_OP (T,safe_push) \ 853 (VEC(T) **vec_, T obj_ VEC_ASSERT_DECL) \ 855 VEC_OP (T,reserve) (vec_, 1 VEC_ASSERT_PASS); \ 857 return VEC_OP (T,quick_push) (*vec_, obj_ VEC_ASSERT_PASS); \ 860 static inline T *VEC_OP (T,safe_insert) \ 861 (VEC(T) **vec_, unsigned ix_, T obj_ VEC_ASSERT_DECL) \ 863 VEC_OP (T,reserve) (vec_, 1 VEC_ASSERT_PASS); \ 865 return VEC_OP (T,quick_insert) (*vec_, ix_, obj_ VEC_ASSERT_PASS); \ 868 #define DEF_VEC_FUNC_O(T) \ 869 static inline unsigned VEC_OP (T,length) (const VEC(T) *vec_) \ 871 return vec_ ? vec_->num : 0; \ 874 static inline T *VEC_OP (T,last) (VEC(T) *vec_ VEC_ASSERT_DECL) \ 876 vec_assert (vec_ && vec_->num, "last"); \ 878 return &vec_->vec[vec_->num - 1]; \ 881 static inline T *VEC_OP (T,index) \ 882 (VEC(T) *vec_, unsigned ix_ VEC_ASSERT_DECL) \ 884 vec_assert (vec_ && ix_ < vec_->num, "index"); \ 886 return &vec_->vec[ix_]; \ 889 static inline int VEC_OP (T,iterate) \ 890 (VEC(T) *vec_, unsigned ix_, T **ptr) \ 892 if (vec_ && ix_ < vec_->num) \ 894 *ptr = &vec_->vec[ix_]; \ 904 static inline size_t VEC_OP (T,embedded_size) \ 909 return vec_offset (T, &dummy) + alloc_ * sizeof(T); \ 912 static inline void VEC_OP (T,embedded_init) \ 913 (VEC(T) *vec_, int alloc_) \ 916 vec_->alloc = alloc_; \ 919 static inline int VEC_OP (T,space) \ 920 (VEC(T) *vec_, int alloc_ VEC_ASSERT_DECL) \ 922 vec_assert (alloc_ >= 0, "space"); \ 923 return vec_ ? vec_->alloc - vec_->num >= (unsigned)alloc_ : !alloc_; \ 926 static inline T *VEC_OP (T,quick_push) \ 927 (VEC(T) *vec_, const T *obj_ VEC_ASSERT_DECL) \ 931 vec_assert (vec_->num < vec_->alloc, "quick_push"); \ 932 slot_ = &vec_->vec[vec_->num++]; \ 939 static inline void VEC_OP (T,pop) (VEC(T) *vec_ VEC_ASSERT_DECL) \ 941 vec_assert (vec_->num, "pop"); \ 945 static inline void VEC_OP (T,truncate) \ 946 (VEC(T) *vec_, unsigned size_ VEC_ASSERT_DECL) \ 948 vec_assert (vec_ ? vec_->num >= size_ : !size_, "truncate"); \ 953 static inline T *VEC_OP (T,replace) \ 954 (VEC(T) *vec_, unsigned ix_, const T *obj_ VEC_ASSERT_DECL) \ 958 vec_assert (ix_ < vec_->num, "replace"); \ 959 slot_ = &vec_->vec[ix_]; \ 966 static inline T *VEC_OP (T,quick_insert) \ 967 (VEC(T) *vec_, unsigned ix_, const T *obj_ VEC_ASSERT_DECL) \ 971 vec_assert (vec_->num < vec_->alloc && ix_ <= vec_->num, "quick_insert"); \ 972 slot_ = &vec_->vec[ix_]; \ 973 memmove (slot_ + 1, slot_, (vec_->num++ - ix_) * sizeof (T)); \ 980 static inline void VEC_OP (T,ordered_remove) \ 981 (VEC(T) *vec_, unsigned ix_ VEC_ASSERT_DECL) \ 985 vec_assert (ix_ < vec_->num, "ordered_remove"); \ 986 slot_ = &vec_->vec[ix_]; \ 987 memmove (slot_, slot_ + 1, (--vec_->num - ix_) * sizeof (T)); \ 990 static inline void VEC_OP (T,unordered_remove) \ 991 (VEC(T) *vec_, unsigned ix_ VEC_ASSERT_DECL) \ 993 vec_assert (ix_ < vec_->num, "unordered_remove"); \ 994 vec_->vec[ix_] = vec_->vec[--vec_->num]; \ 997 static inline void VEC_OP (T,block_remove) \ 998 (VEC(T) *vec_, unsigned ix_, unsigned len_ VEC_ASSERT_DECL) \ 1002 vec_assert (ix_ + len_ <= vec_->num, "block_remove"); \ 1003 slot_ = &vec_->vec[ix_]; \ 1004 vec_->num -= len_; \ 1005 memmove (slot_, slot_ + len_, (vec_->num - ix_) * sizeof (T)); \ 1008 static inline T *VEC_OP (T,address) \ 1011 return vec_ ? vec_->vec : 0; \ 1014 static inline unsigned VEC_OP (T,lower_bound) \ 1015 (VEC(T) *vec_, const T *obj_, \ 1016 int (*lessthan_)(const T *, const T *) VEC_ASSERT_DECL) \ 1018 unsigned int len_ = VEC_OP (T, length) (vec_); \ 1019 unsigned int half_, middle_; \ 1020 unsigned int first_ = 0; \ 1024 half_ = len_ >> 1; \ 1027 middle_elem_ = VEC_OP (T,index) (vec_, middle_ VEC_ASSERT_PASS); \ 1028 if (lessthan_ (middle_elem_, obj_)) \ 1032 len_ = len_ - half_ - 1; \ 1040 #define DEF_VEC_ALLOC_FUNC_O(T) \ 1041 static inline VEC(T) *VEC_OP (T,alloc) \ 1047 return (VEC(T) *) vec_o_reserve (NULL, -alloc_, \ 1048 vec_offset (T, &dummy), sizeof (T)); \ 1051 static inline VEC(T) *VEC_OP (T,copy) (VEC(T) *vec_) \ 1053 size_t len_ = vec_ ? vec_->num : 0; \ 1054 VEC (T) *new_vec_ = NULL; \ 1061 new_vec_ = (VEC (T) *) \ 1062 vec_o_reserve (NULL, -len_, vec_offset (T, &dummy), sizeof (T)); \ 1064 new_vec_->num = len_; \ 1065 memcpy (new_vec_->vec, vec_->vec, sizeof (T) * len_); \ 1070 static inline VEC(T) *VEC_OP (T,merge) (VEC(T) *vec1_, VEC(T) *vec2_) \ 1072 if (vec1_ && vec2_) \ 1075 size_t len_ = vec1_->num + vec2_->num; \ 1076 VEC (T) *new_vec_ = NULL; \ 1079 new_vec_ = (VEC (T) *) \ 1080 vec_o_reserve (NULL, -len_, vec_offset (T, &dummy), sizeof (T)); \ 1082 new_vec_->num = len_; \ 1083 memcpy (new_vec_->vec, vec1_->vec, sizeof (T) * vec1_->num); \ 1084 memcpy (new_vec_->vec + vec1_->num, vec2_->vec, \ 1085 sizeof (T) * vec2_->num); \ 1090 return VEC_copy (T, vec1_ ? vec1_ : vec2_); \ 1093 static inline void VEC_OP (T,free) \ 1097 vec_free_ (*vec_); \ 1101 static inline void VEC_OP (T,cleanup) \ 1104 VEC(T) **vec_ = (VEC(T) **) arg_; \ 1106 vec_free_ (*vec_); \ 1110 static inline int VEC_OP (T,reserve) \ 1111 (VEC(T) **vec_, int alloc_ VEC_ASSERT_DECL) \ 1114 int extend = !VEC_OP (T,space) (*vec_, alloc_ < 0 ? -alloc_ : alloc_ \ 1118 *vec_ = (VEC(T) *) \ 1119 vec_o_reserve (*vec_, alloc_, vec_offset (T, &dummy), sizeof (T)); \ 1124 static inline void VEC_OP (T,safe_grow) \ 1125 (VEC(T) **vec_, int size_ VEC_ASSERT_DECL) \ 1127 vec_assert (size_ >= 0 && VEC_OP(T,length) (*vec_) <= (unsigned)size_, \ 1129 VEC_OP (T,reserve) \ 1130 (vec_, (int)(*vec_ ? (*vec_)->num : 0) - size_ VEC_ASSERT_PASS); \ 1131 (*vec_)->num = size_; \ 1134 static inline T *VEC_OP (T,safe_push) \ 1135 (VEC(T) **vec_, const T *obj_ VEC_ASSERT_DECL) \ 1137 VEC_OP (T,reserve) (vec_, 1 VEC_ASSERT_PASS); \ 1139 return VEC_OP (T,quick_push) (*vec_, obj_ VEC_ASSERT_PASS); \ 1142 static inline T *VEC_OP (T,safe_insert) \ 1143 (VEC(T) **vec_, unsigned ix_, const T *obj_ VEC_ASSERT_DECL) \ 1145 VEC_OP (T,reserve) (vec_, 1 VEC_ASSERT_PASS); \ 1147 return VEC_OP (T,quick_insert) (*vec_, ix_, obj_ VEC_ASSERT_PASS); \ void * vec_o_reserve(void *, int, size_t, size_t)
void * vec_p_reserve(void *, int)