00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef GCC_VEC_H
00023 #define GCC_VEC_H
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127 #define VEC_length(TDEF,V) (VEC_OP(TDEF,length)(V))
00128
00129
00130
00131
00132
00133
00134
00135 #define VEC_last(TDEF,V) (VEC_OP(TDEF,last)(V VEC_CHECK_INFO))
00136
00137
00138
00139
00140
00141
00142
00143
00144 #define VEC_index(TDEF,V,I) (VEC_OP(TDEF,index)(V,I VEC_CHECK_INFO))
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157 #define VEC_iterate(TDEF,V,I,P) (VEC_OP(TDEF,iterate)(V,I,&(P)))
00158
00159
00160
00161
00162
00163
00164
00165 #define VEC_alloc(TDEF,A) (VEC_OP(TDEF,alloc)(A MEM_STAT_INFO))
00166
00167
00168
00169
00170
00171
00172 #define VEC_free(TDEF,V) (VEC_OP(TDEF,free)(&V))
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182 #define VEC_embedded_size(TDEF,A) (VEC_OP(TDEF,embedded_size)(A))
00183 #define VEC_embedded_init(TDEF,O,A) (VEC_OP(TDEF,embedded_init)(O,A))
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196 #define VEC_space(TDEF,V,R) (VEC_OP(TDEF,space)(V,R))
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209 #define VEC_reserve(TDEF,V,R) (VEC_OP(TDEF,reserve)(&(V),R MEM_STAT_INFO))
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220 #define VEC_quick_push(TDEF,V,O) \
00221 (VEC_OP(TDEF,quick_push)(V,O VEC_CHECK_INFO))
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231 #define VEC_safe_push(TDEF,V,O) \
00232 (VEC_OP(TDEF,safe_push)(&(V),O VEC_CHECK_INFO MEM_STAT_INFO))
00233
00234
00235
00236
00237
00238
00239
00240
00241 #define VEC_pop(TDEF,V) (VEC_OP(TDEF,pop)(V VEC_CHECK_INFO))
00242
00243
00244
00245
00246
00247
00248 #define VEC_truncate(TDEF,V,I) \
00249 (VEC_OP(TDEF,truncate)(V,I VEC_CHECK_INFO))
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261 #define VEC_replace(TDEF,V,I,O) \
00262 (VEC_OP(TDEF,replace)(V,I,O VEC_CHECK_INFO))
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273 #define VEC_quick_insert(TDEF,V,I,O) \
00274 (VEC_OP(TDEF,quick_insert)(V,I,O VEC_CHECK_INFO))
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285 #define VEC_safe_insert(TDEF,V,I,O) \
00286 (VEC_OP(TDEF,safe_insert)(&(V),I,O VEC_CHECK_INFO MEM_STAT_INFO))
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296 #define VEC_ordered_remove(TDEF,V,I) \
00297 (VEC_OP(TDEF,ordered_remove)(V,I VEC_CHECK_INFO))
00298
00299
00300
00301
00302
00303
00304
00305
00306
00307 #define VEC_unordered_remove(TDEF,V,I) \
00308 (VEC_OP(TDEF,unordered_remove)(V,I VEC_CHECK_INFO))
00309
00310
00311
00312
00313
00314
00315
00316 #define VEC_address(TDEF,V) (VEC_OP(TDEF,address)(V))
00317
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328 #define VEC_lower_bound(TDEF,V,O,LT) \
00329 (VEC_OP(TDEF,lower_bound)(V,O,LT VEC_CHECK_INFO))
00330
00331 #if !IN_GENGTYPE
00332
00333 extern void *vec_gc_p_reserve (void *, int MEM_STAT_DECL);
00334 extern void *vec_gc_o_reserve (void *, int, size_t, size_t MEM_STAT_DECL);
00335 extern void vec_gc_free (void *);
00336 extern void *vec_heap_p_reserve (void *, int MEM_STAT_DECL);
00337 extern void *vec_heap_o_reserve (void *, int, size_t, size_t MEM_STAT_DECL);
00338 extern void vec_heap_free (void *);
00339
00340 #if ENABLE_CHECKING
00341 #define VEC_CHECK_INFO ,__FILE__,__LINE__,__FUNCTION__
00342 #define VEC_CHECK_DECL ,const char *file_,unsigned line_,const char *function_
00343 #define VEC_CHECK_PASS ,file_,line_,function_
00344
00345 #define VEC_ASSERT(EXPR,OP,TDEF) \
00346 (void)((EXPR) ? 0 : (VEC_ASSERT_FAIL(OP,VEC(TDEF)), 0))
00347
00348 extern void vec_assert_fail (const char *, const char * VEC_CHECK_DECL)
00349 ATTRIBUTE_NORETURN;
00350 #define VEC_ASSERT_FAIL(OP,VEC) vec_assert_fail (OP,#VEC VEC_CHECK_PASS)
00351 #else
00352 #define VEC_CHECK_INFO
00353 #define VEC_CHECK_DECL
00354 #define VEC_CHECK_PASS
00355 #define VEC_ASSERT(EXPR,OP,TYPE) (void)(EXPR)
00356 #endif
00357
00358 #define VEC(TDEF) VEC_##TDEF
00359 #define VEC_OP(TDEF,OP) VEC_OP_(VEC(TDEF),OP)
00360 #define VEC_OP_(VEC,OP) VEC_OP__(VEC,OP)
00361 #define VEC_OP__(VEC,OP) VEC ## _ ## OP
00362 #else
00363 #define VEC(TDEF) VEC_ TDEF
00364 #define VEC_STRINGIFY(X) VEC_STRINGIFY_(X)
00365 #define VEC_STRINGIFY_(X) #X
00366 #undef GTY
00367 #endif
00368
00369 #define VEC_TDEF(TDEF) \
00370 typedef struct VEC (TDEF) GTY(()) \
00371 { \
00372 unsigned num; \
00373 unsigned alloc; \
00374 TDEF GTY ((length ("%h.num"))) vec[1]; \
00375 } VEC (TDEF)
00376
00377
00378 #if IN_GENGTYPE
00379 {"DEF_VEC_GC_P", VEC_STRINGIFY (VEC_TDEF (#)) ";", NULL},
00380 {"DEF_VEC_MALLOC_P", "", NULL},
00381 #else
00382 #define DEF_VEC_GC_P(TDEF) DEF_VEC_P(TDEF,gc)
00383 #define DEF_VEC_MALLOC_P(TDEF) DEF_VEC_P(TDEF,heap)
00384
00385 #define DEF_VEC_P(TDEF,a) \
00386 VEC_TDEF (TDEF); \
00387 \
00388 static inline unsigned VEC_OP (TDEF,length) \
00389 (const VEC (TDEF) *vec_) \
00390 { \
00391 return vec_ ? vec_->num : 0; \
00392 } \
00393 \
00394 static inline TDEF VEC_OP (TDEF,last) \
00395 (const VEC (TDEF) *vec_ VEC_CHECK_DECL) \
00396 { \
00397 VEC_ASSERT (vec_ && vec_->num, "last", TDEF); \
00398 \
00399 return vec_->vec[vec_->num - 1]; \
00400 } \
00401 \
00402 static inline TDEF VEC_OP (TDEF,index) \
00403 (const VEC (TDEF) *vec_, unsigned ix_ VEC_CHECK_DECL) \
00404 { \
00405 VEC_ASSERT (vec_ && ix_ < vec_->num, "index", TDEF); \
00406 \
00407 return vec_->vec[ix_]; \
00408 } \
00409 \
00410 static inline int VEC_OP (TDEF,iterate) \
00411 (const VEC (TDEF) *vec_, unsigned ix_, TDEF *ptr) \
00412 { \
00413 if (vec_ && ix_ < vec_->num) \
00414 { \
00415 *ptr = vec_->vec[ix_]; \
00416 return 1; \
00417 } \
00418 else \
00419 { \
00420 *ptr = 0; \
00421 return 0; \
00422 } \
00423 } \
00424 \
00425 static inline VEC (TDEF) *VEC_OP (TDEF,alloc) \
00426 (int alloc_ MEM_STAT_DECL) \
00427 { \
00428 return (VEC (TDEF) *) vec_##a##_p_reserve (NULL, alloc_ - !alloc_ PASS_MEM_STAT);\
00429 } \
00430 \
00431 static inline void VEC_OP (TDEF,free) \
00432 (VEC (TDEF) **vec_) \
00433 { \
00434 vec_##a##_free (*vec_); \
00435 *vec_ = NULL; \
00436 } \
00437 \
00438 static inline size_t VEC_OP (TDEF,embedded_size) \
00439 (int alloc_) \
00440 { \
00441 return offsetof (VEC(TDEF),vec) + alloc_ * sizeof(TDEF); \
00442 } \
00443 \
00444 static inline void VEC_OP (TDEF,embedded_init) \
00445 (VEC (TDEF) *vec_, int alloc_) \
00446 { \
00447 vec_->num = 0; \
00448 vec_->alloc = alloc_; \
00449 } \
00450 \
00451 static inline int VEC_OP (TDEF,space) \
00452 (VEC (TDEF) *vec_, int alloc_) \
00453 { \
00454 return vec_ ? ((vec_)->alloc - (vec_)->num \
00455 >= (unsigned)(alloc_ < 0 ? 1 : alloc_)) : !alloc_; \
00456 } \
00457 \
00458 static inline int VEC_OP (TDEF,reserve) \
00459 (VEC (TDEF) **vec_, int alloc_ MEM_STAT_DECL) \
00460 { \
00461 int extend = !VEC_OP (TDEF,space) (*vec_, alloc_); \
00462 \
00463 if (extend) \
00464 *vec_ = (VEC (TDEF) *) vec_##a##_p_reserve (*vec_, alloc_ PASS_MEM_STAT); \
00465 \
00466 return extend; \
00467 } \
00468 \
00469 static inline TDEF *VEC_OP (TDEF,quick_push) \
00470 (VEC (TDEF) *vec_, TDEF obj_ VEC_CHECK_DECL) \
00471 { \
00472 TDEF *slot_; \
00473 \
00474 VEC_ASSERT (vec_->num < vec_->alloc, "push", TDEF); \
00475 slot_ = &vec_->vec[vec_->num++]; \
00476 *slot_ = obj_; \
00477 \
00478 return slot_; \
00479 } \
00480 \
00481 static inline TDEF *VEC_OP (TDEF,safe_push) \
00482 (VEC (TDEF) **vec_, TDEF obj_ VEC_CHECK_DECL MEM_STAT_DECL) \
00483 { \
00484 VEC_OP (TDEF,reserve) (vec_, -1 PASS_MEM_STAT); \
00485 \
00486 return VEC_OP (TDEF,quick_push) (*vec_, obj_ VEC_CHECK_PASS); \
00487 } \
00488 \
00489 static inline TDEF VEC_OP (TDEF,pop) \
00490 (VEC (TDEF) *vec_ VEC_CHECK_DECL) \
00491 { \
00492 TDEF obj_; \
00493 \
00494 VEC_ASSERT (vec_->num, "pop", TDEF); \
00495 obj_ = vec_->vec[--vec_->num]; \
00496 \
00497 return obj_; \
00498 } \
00499 \
00500 static inline void VEC_OP (TDEF,truncate) \
00501 (VEC (TDEF) *vec_, unsigned size_ VEC_CHECK_DECL) \
00502 { \
00503 VEC_ASSERT (vec_ ? vec_->num >= size_ : !size_, "truncate", TDEF); \
00504 if (vec_) \
00505 vec_->num = size_; \
00506 } \
00507 \
00508 static inline TDEF VEC_OP (TDEF,replace) \
00509 (VEC (TDEF) *vec_, unsigned ix_, TDEF obj_ VEC_CHECK_DECL) \
00510 { \
00511 TDEF old_obj_; \
00512 \
00513 VEC_ASSERT (ix_ < vec_->num, "replace", TDEF); \
00514 old_obj_ = vec_->vec[ix_]; \
00515 vec_->vec[ix_] = obj_; \
00516 \
00517 return old_obj_; \
00518 } \
00519 \
00520 static inline unsigned VEC_OP (TDEF,lower_bound) \
00521 (VEC (TDEF) *vec_, const TDEF obj_, bool (*lessthan_)(const TDEF, const TDEF) VEC_CHECK_DECL) \
00522 { \
00523 unsigned int len_ = VEC_OP (TDEF, length) (vec_); \
00524 unsigned int half_, middle_; \
00525 unsigned int first_ = 0; \
00526 while (len_ > 0) \
00527 { \
00528 TDEF middle_elem_; \
00529 half_ = len_ >> 1; \
00530 middle_ = first_; \
00531 middle_ += half_; \
00532 middle_elem_ = VEC_OP (TDEF, index) (vec_, middle_ VEC_CHECK_PASS); \
00533 if (lessthan_ (middle_elem_, obj_)) \
00534 { \
00535 first_ = middle_; \
00536 ++first_; \
00537 len_ = len_ - half_ - 1; \
00538 } \
00539 else \
00540 len_ = half_; \
00541 } \
00542 return first_; \
00543 } \
00544 \
00545 static inline TDEF *VEC_OP (TDEF,quick_insert) \
00546 (VEC (TDEF) *vec_, unsigned ix_, TDEF obj_ VEC_CHECK_DECL) \
00547 { \
00548 TDEF *slot_; \
00549 \
00550 VEC_ASSERT (vec_->num < vec_->alloc, "insert", TDEF); \
00551 VEC_ASSERT (ix_ <= vec_->num, "insert", TDEF); \
00552 slot_ = &vec_->vec[ix_]; \
00553 memmove (slot_ + 1, slot_, (vec_->num++ - ix_) * sizeof (TDEF)); \
00554 *slot_ = obj_; \
00555 \
00556 return slot_; \
00557 } \
00558 \
00559 static inline TDEF *VEC_OP (TDEF,safe_insert) \
00560 (VEC (TDEF) **vec_, unsigned ix_, TDEF obj_ \
00561 VEC_CHECK_DECL MEM_STAT_DECL) \
00562 { \
00563 VEC_OP (TDEF,reserve) (vec_, -1 PASS_MEM_STAT); \
00564 \
00565 return VEC_OP (TDEF,quick_insert) (*vec_, ix_, obj_ VEC_CHECK_PASS); \
00566 } \
00567 \
00568 static inline TDEF VEC_OP (TDEF,ordered_remove) \
00569 (VEC (TDEF) *vec_, unsigned ix_ VEC_CHECK_DECL) \
00570 { \
00571 TDEF *slot_; \
00572 TDEF obj_; \
00573 \
00574 VEC_ASSERT (ix_ < vec_->num, "remove", TDEF); \
00575 slot_ = &vec_->vec[ix_]; \
00576 obj_ = *slot_; \
00577 memmove (slot_, slot_ + 1, (--vec_->num - ix_) * sizeof (TDEF)); \
00578 \
00579 return obj_; \
00580 } \
00581 \
00582 static inline TDEF VEC_OP (TDEF,unordered_remove) \
00583 (VEC (TDEF) *vec_, unsigned ix_ VEC_CHECK_DECL) \
00584 { \
00585 TDEF *slot_; \
00586 TDEF obj_; \
00587 \
00588 VEC_ASSERT (ix_ < vec_->num, "remove", TDEF); \
00589 slot_ = &vec_->vec[ix_]; \
00590 obj_ = *slot_; \
00591 *slot_ = vec_->vec[--vec_->num]; \
00592 \
00593 return obj_; \
00594 } \
00595 \
00596 static inline TDEF *VEC_OP (TDEF,address) \
00597 (VEC (TDEF) *vec_) \
00598 { \
00599 return vec_ ? vec_->vec : 0; \
00600 } \
00601 \
00602 struct vec_swallow_trailing_semi
00603 #endif
00604
00605
00606 #if IN_GENGTYPE
00607 {"DEF_VEC_GC_O", VEC_STRINGIFY (VEC_TDEF (#)) ";", NULL},
00608 {"DEF_VEC_MALLOC_O", "", NULL},
00609 #else
00610
00611 #define DEF_VEC_GC_O(TDEF) DEF_VEC_O(TDEF,gc)
00612 #define DEF_VEC_MALLOC_O(TDEF) DEF_VEC_O(TDEF,heap)
00613
00614 #define DEF_VEC_O(TDEF,a) \
00615 VEC_TDEF (TDEF); \
00616 \
00617 static inline unsigned VEC_OP (TDEF,length) \
00618 (const VEC (TDEF) *vec_) \
00619 { \
00620 return vec_ ? vec_->num : 0; \
00621 } \
00622 \
00623 static inline TDEF *VEC_OP (TDEF,last) \
00624 (VEC (TDEF) *vec_ VEC_CHECK_DECL) \
00625 { \
00626 VEC_ASSERT (vec_ && vec_->num, "last", TDEF); \
00627 \
00628 return &vec_->vec[vec_->num - 1]; \
00629 } \
00630 \
00631 static inline TDEF *VEC_OP (TDEF,index) \
00632 (VEC (TDEF) *vec_, unsigned ix_ VEC_CHECK_DECL) \
00633 { \
00634 VEC_ASSERT (vec_ && ix_ < vec_->num, "index", TDEF); \
00635 \
00636 return &vec_->vec[ix_]; \
00637 } \
00638 \
00639 static inline int VEC_OP (TDEF,iterate) \
00640 (VEC (TDEF) *vec_, unsigned ix_, TDEF **ptr) \
00641 { \
00642 if (vec_ && ix_ < vec_->num) \
00643 { \
00644 *ptr = &vec_->vec[ix_]; \
00645 return 1; \
00646 } \
00647 else \
00648 { \
00649 *ptr = 0; \
00650 return 0; \
00651 } \
00652 } \
00653 \
00654 static inline VEC (TDEF) *VEC_OP (TDEF,alloc) \
00655 (int alloc_ MEM_STAT_DECL) \
00656 { \
00657 return (VEC (TDEF) *) vec_##a##_o_reserve (NULL, alloc_ - !alloc_, \
00658 offsetof (VEC(TDEF),vec), sizeof (TDEF)\
00659 PASS_MEM_STAT); \
00660 } \
00661 \
00662 static inline void VEC_OP (TDEF,free) \
00663 (VEC (TDEF) **vec_) \
00664 { \
00665 vec_##a##_free (*vec_); \
00666 *vec_ = NULL; \
00667 } \
00668 \
00669 static inline size_t VEC_OP (TDEF,embedded_size) \
00670 (int alloc_) \
00671 { \
00672 return offsetof (VEC(TDEF),vec) + alloc_ * sizeof(TDEF); \
00673 } \
00674 \
00675 static inline void VEC_OP (TDEF,embedded_init) \
00676 (VEC (TDEF) *vec_, int alloc_) \
00677 { \
00678 vec_->num = 0; \
00679 vec_->alloc = alloc_; \
00680 } \
00681 \
00682 static inline int VEC_OP (TDEF,space) \
00683 (VEC (TDEF) *vec_, int alloc_) \
00684 { \
00685 return vec_ ? ((vec_)->alloc - (vec_)->num \
00686 >= (unsigned)(alloc_ < 0 ? 1 : alloc_)) : !alloc_; \
00687 } \
00688 \
00689 static inline int VEC_OP (TDEF,reserve) \
00690 (VEC (TDEF) **vec_, int alloc_ MEM_STAT_DECL) \
00691 { \
00692 int extend = !VEC_OP (TDEF,space) (*vec_, alloc_); \
00693 \
00694 if (extend) \
00695 *vec_ = (VEC (TDEF) *) vec_##a##_o_reserve (*vec_, alloc_, \
00696 offsetof (VEC(TDEF),vec), sizeof (TDEF) \
00697 PASS_MEM_STAT); \
00698 \
00699 return extend; \
00700 } \
00701 \
00702 static inline TDEF *VEC_OP (TDEF,quick_push) \
00703 (VEC (TDEF) *vec_, const TDEF *obj_ VEC_CHECK_DECL) \
00704 { \
00705 TDEF *slot_; \
00706 \
00707 VEC_ASSERT (vec_->num < vec_->alloc, "push", TDEF); \
00708 slot_ = &vec_->vec[vec_->num++]; \
00709 if (obj_) \
00710 *slot_ = *obj_; \
00711 \
00712 return slot_; \
00713 } \
00714 \
00715 static inline TDEF *VEC_OP (TDEF,safe_push) \
00716 (VEC (TDEF) **vec_, const TDEF *obj_ VEC_CHECK_DECL MEM_STAT_DECL) \
00717 { \
00718 VEC_OP (TDEF,reserve) (vec_, -1 PASS_MEM_STAT); \
00719 \
00720 return VEC_OP (TDEF,quick_push) (*vec_, obj_ VEC_CHECK_PASS); \
00721 } \
00722 \
00723 static inline void VEC_OP (TDEF,pop) \
00724 (VEC (TDEF) *vec_ VEC_CHECK_DECL) \
00725 { \
00726 VEC_ASSERT (vec_->num, "pop", TDEF); \
00727 --vec_->num; \
00728 } \
00729 \
00730 static inline void VEC_OP (TDEF,truncate) \
00731 (VEC (TDEF) *vec_, unsigned size_ VEC_CHECK_DECL) \
00732 { \
00733 VEC_ASSERT (vec_ ? vec_->num >= size_ : !size_, "truncate", TDEF); \
00734 if (vec_) \
00735 vec_->num = size_; \
00736 } \
00737 \
00738 static inline TDEF *VEC_OP (TDEF,replace) \
00739 (VEC (TDEF) *vec_, unsigned ix_, const TDEF *obj_ VEC_CHECK_DECL) \
00740 { \
00741 TDEF *slot_; \
00742 \
00743 VEC_ASSERT (ix_ < vec_->num, "replace", TDEF); \
00744 slot_ = &vec_->vec[ix_]; \
00745 if (obj_) \
00746 *slot_ = *obj_; \
00747 \
00748 return slot_; \
00749 } \
00750 \
00751 static inline unsigned VEC_OP (TDEF,lower_bound) \
00752 (VEC (TDEF) *vec_, const TDEF *obj_, bool (*lessthan_)(const TDEF *, const TDEF *) VEC_CHECK_DECL) \
00753 { \
00754 unsigned int len_ = VEC_OP (TDEF, length) (vec_); \
00755 unsigned int half_, middle_; \
00756 unsigned int first_ = 0; \
00757 while (len_ > 0) \
00758 { \
00759 TDEF *middle_elem_; \
00760 half_ = len_ >> 1; \
00761 middle_ = first_; \
00762 middle_ += half_; \
00763 middle_elem_ = VEC_OP (TDEF, index) (vec_, middle_ VEC_CHECK_PASS); \
00764 if (lessthan_ (middle_elem_, obj_)) \
00765 { \
00766 first_ = middle_; \
00767 ++first_; \
00768 len_ = len_ - half_ - 1; \
00769 } \
00770 else \
00771 len_ = half_; \
00772 } \
00773 return first_; \
00774 } \
00775 \
00776 static inline TDEF *VEC_OP (TDEF,quick_insert) \
00777 (VEC (TDEF) *vec_, unsigned ix_, const TDEF *obj_ VEC_CHECK_DECL) \
00778 { \
00779 TDEF *slot_; \
00780 \
00781 VEC_ASSERT (vec_->num < vec_->alloc, "insert", TDEF); \
00782 VEC_ASSERT (ix_ <= vec_->num, "insert", TDEF); \
00783 slot_ = &vec_->vec[ix_]; \
00784 memmove (slot_ + 1, slot_, (vec_->num++ - ix_) * sizeof (TDEF)); \
00785 if (obj_) \
00786 *slot_ = *obj_; \
00787 \
00788 return slot_; \
00789 } \
00790 \
00791 static inline TDEF *VEC_OP (TDEF,safe_insert) \
00792 (VEC (TDEF) **vec_, unsigned ix_, const TDEF *obj_ \
00793 VEC_CHECK_DECL MEM_STAT_DECL) \
00794 { \
00795 VEC_OP (TDEF,reserve) (vec_, -1 PASS_MEM_STAT); \
00796 \
00797 return VEC_OP (TDEF,quick_insert) (*vec_, ix_, obj_ VEC_CHECK_PASS); \
00798 } \
00799 \
00800 static inline void VEC_OP (TDEF,ordered_remove) \
00801 (VEC (TDEF) *vec_, unsigned ix_ VEC_CHECK_DECL) \
00802 { \
00803 TDEF *slot_; \
00804 \
00805 VEC_ASSERT (ix_ < vec_->num, "remove", TDEF); \
00806 slot_ = &vec_->vec[ix_]; \
00807 memmove (slot_, slot_ + 1, (--vec_->num - ix_) * sizeof (TDEF)); \
00808 } \
00809 \
00810 static inline void VEC_OP (TDEF,unordered_remove) \
00811 (VEC (TDEF) *vec_, unsigned ix_ VEC_CHECK_DECL) \
00812 { \
00813 VEC_ASSERT (ix_ < vec_->num, "remove", TDEF); \
00814 vec_->vec[ix_] = vec_->vec[--vec_->num]; \
00815 } \
00816 \
00817 static inline TDEF *VEC_OP (TDEF,address) \
00818 (VEC (TDEF) *vec_) \
00819 { \
00820 return vec_ ? vec_->vec : 0; \
00821 } \
00822 \
00823 struct vec_swallow_trailing_semi
00824 #endif
00825
00826 #endif