38 #ifndef included_vec_h 39 #define included_vec_h 100 word length_increment,
115 _vec_resize (
void *v,
116 word length_increment,
120 uword new_data_bytes, aligned_header_bytes;
124 new_data_bytes = data_bytes + aligned_header_bytes;
128 void *p = v - aligned_header_bytes;
136 vh->
len += length_increment;
159 _vec_resize_will_expand (
void *v,
160 word length_increment,
164 uword new_data_bytes, aligned_header_bytes;
168 new_data_bytes = data_bytes + aligned_header_bytes;
172 void *p = v - aligned_header_bytes;
207 #define _v(var) _vec_##var 221 #define vec_resize_ha(V,N,H,A) \ 224 word _v(l) = vec_len (V); \ 225 V = _vec_resize ((V), _v(n), (_v(l) + _v(n)) * sizeof ((V)[0]), (H), (A)); \ 237 #define vec_resize(V,N) vec_resize_ha(V,N,0,0) 250 #define vec_resize_aligned(V,N,A) vec_resize_ha(V,N,0,A) 261 #define vec_alloc_ha(V,N,H,A) \ 263 uword _v(l) = vec_len (V); \ 264 vec_resize_ha (V, N, H, A); \ 265 _vec_len (V) = _v(l); \ 275 #define vec_alloc(V,N) vec_alloc_ha(V,N,0,0) 284 #define vec_alloc_aligned(V,N,A) vec_alloc_ha(V,N,0,A) 293 #define vec_new_ha(T,N,H,A) \ 296 _vec_resize ((T *) 0, _v(n), _v(n) * sizeof (T), (H), (A)); \ 306 #define vec_new(T,N) vec_new_ha(T,N,0,0) 315 #define vec_new_aligned(T,N,A) vec_new_ha(T,N,0,A) 323 #define vec_free_h(V,H) \ 327 clib_mem_free (vec_header ((V), (H))); \ 336 #define vec_free(V) vec_free_h(V,0) 342 #define vec_free_header(h) clib_mem_free (h) 353 #define vec_dup_ha(V,H,A) \ 355 __typeof__ ((V)[0]) * _v(v) = 0; \ 356 uword _v(l) = vec_len (V); \ 359 vec_resize_ha (_v(v), _v(l), (H), (A)); \ 360 clib_memcpy (_v(v), (V), _v(l) * sizeof ((V)[0]));\ 370 #define vec_dup(V) vec_dup_ha(V,0,0) 379 #define vec_dup_aligned(V,A) vec_dup_ha(V,0,A) 387 #define vec_copy(DST,SRC) clib_memcpy (DST, SRC, vec_len (DST) * \ 396 #define vec_clone(NEW_V,OLD_V) \ 399 (NEW_V) = _vec_resize ((NEW_V), vec_len (OLD_V), \ 400 vec_len (OLD_V) * sizeof ((NEW_V)[0]), (0), (0)); \ 412 #define vec_validate_ha(V,I,H,A) \ 415 word _v(l) = vec_len (V); \ 416 if (_v(i) >= _v(l)) \ 418 vec_resize_ha ((V), 1 + (_v(i) - _v(l)), (H), (A)); \ 421 memset ((V) + _v(l), 0, (1 + (_v(i) - _v(l))) * sizeof ((V)[0])); \ 432 #define vec_validate(V,I) vec_validate_ha(V,I,0,0) 443 #define vec_validate_aligned(V,I,A) vec_validate_ha(V,I,0,A) 455 #define vec_validate_init_empty_ha(V,I,INIT,H,A) \ 458 word _v(l) = vec_len (V); \ 459 if (_v(i) >= _v(l)) \ 461 vec_resize_ha ((V), 1 + (_v(i) - _v(l)), (H), (A)); \ 462 while (_v(l) <= _v(i)) \ 464 (V)[_v(l)] = (INIT); \ 481 #define vec_validate_init_empty(V,I,INIT) \ 482 vec_validate_init_empty_ha(V,I,INIT,0,0) 494 #define vec_validate_init_empty_aligned(V,I,INIT,A) \ 495 vec_validate_init_empty_ha(V,I,INIT,0,A) 505 #define vec_add1_ha(V,E,H,A) \ 507 word _v(l) = vec_len (V); \ 508 V = _vec_resize ((V), 1, (_v(l) + 1) * sizeof ((V)[0]), (H), (A)); \ 518 #define vec_add1(V,E) vec_add1_ha(V,E,0,0) 528 #define vec_add1_aligned(V,E,A) vec_add1_ha(V,E,0,A) 540 #define vec_add2_ha(V,P,N,H,A) \ 543 word _v(l) = vec_len (V); \ 544 V = _vec_resize ((V), _v(n), (_v(l) + _v(n)) * sizeof ((V)[0]), (H), (A)); \ 557 #define vec_add2(V,P,N) vec_add2_ha(V,P,N,0,0) 569 #define vec_add2_aligned(V,P,N,A) vec_add2_ha(V,P,N,0,A) 580 #define vec_add_ha(V,E,N,H,A) \ 583 word _v(l) = vec_len (V); \ 584 V = _vec_resize ((V), _v(n), (_v(l) + _v(n)) * sizeof ((V)[0]), (H), (A)); \ 585 clib_memcpy ((V) + _v(l), (E), _v(n) * sizeof ((V)[0])); \ 595 #define vec_add(V,E,N) vec_add_ha(V,E,N,0,0) 605 #define vec_add_aligned(V,E,N,A) vec_add_ha(V,E,N,0,A) 614 uword _v(l) = vec_len (V); \ 615 ASSERT (_v(l) > 0); \ 617 _vec_len (V) = _v (l); \ 628 #define vec_pop2(V,E) \ 630 uword _v(l) = vec_len (V); \ 631 if (_v(l) > 0) (E) = vec_pop (V); \ 646 #define vec_insert_init_empty_ha(V,N,M,INIT,H,A) \ 648 word _v(l) = vec_len (V); \ 651 V = _vec_resize ((V), \ 653 (_v(l) + _v(n))*sizeof((V)[0]), \ 655 ASSERT (_v(m) <= _v(l)); \ 656 memmove ((V) + _v(m) + _v(n), \ 658 (_v(l) - _v(m)) * sizeof ((V)[0])); \ 659 memset ((V) + _v(m), INIT, _v(n) * sizeof ((V)[0])); \ 672 #define vec_insert_ha(V,N,M,H,A) vec_insert_init_empty_ha(V,N,M,0,H,A) 682 #define vec_insert(V,N,M) vec_insert_ha(V,N,M,0,0) 693 #define vec_insert_aligned(V,N,M,A) vec_insert_ha(V,N,M,0,A) 705 #define vec_insert_init_empty(V,N,M,INIT) \ 706 vec_insert_init_empty_ha(V,N,M,INIT,0,0) 719 #define vec_insert_init_empty_aligned(V,N,M,INIT,A) \ 720 vec_insert_init_empty_ha(V,N,M,INIT,0,A) 734 #define vec_insert_elts_ha(V,E,N,M,H,A) \ 736 word _v(l) = vec_len (V); \ 739 V = _vec_resize ((V), \ 741 (_v(l) + _v(n))*sizeof((V)[0]), \ 743 ASSERT (_v(m) <= _v(l)); \ 744 memmove ((V) + _v(m) + _v(n), \ 746 (_v(l) - _v(m)) * sizeof ((V)[0])); \ 747 clib_memcpy ((V) + _v(m), (E), \ 748 _v(n) * sizeof ((V)[0])); \ 760 #define vec_insert_elts(V,E,N,M) vec_insert_elts_ha(V,E,N,M,0,0) 772 #define vec_insert_elts_aligned(V,E,N,M,A) vec_insert_elts_ha(V,E,N,M,0,A) 781 #define vec_delete(V,N,M) \ 783 word _v(l) = vec_len (V); \ 787 if (_v(l) - _v(n) - _v(m) > 0) \ 788 memmove ((V) + _v(m), (V) + _v(m) + _v(n), \ 789 (_v(l) - _v(n) - _v(m)) * sizeof ((V)[0])); \ 792 memset ((V) + _v(l) - _v(n), 0, _v(n) * sizeof ((V)[0])); \ 793 _vec_len (V) -= _v(n); \ 801 #define vec_del1(v,i) \ 803 uword _vec_del_l = _vec_len (v) - 1; \ 804 uword _vec_del_i = (i); \ 805 if (_vec_del_i < _vec_del_l) \ 806 (v)[_vec_del_i] = (v)[_vec_del_l]; \ 807 _vec_len (v) = _vec_del_l; \ 815 #define vec_append(v1,v2) \ 817 uword _v(l1) = vec_len (v1); \ 818 uword _v(l2) = vec_len (v2); \ 820 v1 = _vec_resize ((v1), _v(l2), \ 821 (_v(l1) + _v(l2)) * sizeof ((v1)[0]), 0, 0); \ 822 clib_memcpy ((v1) + _v(l1), (v2), _v(l2) * sizeof ((v2)[0])); \ 831 #define vec_append_aligned(v1,v2,align) \ 833 uword _v(l1) = vec_len (v1); \ 834 uword _v(l2) = vec_len (v2); \ 836 v1 = _vec_resize ((v1), _v(l2), \ 837 (_v(l1) + _v(l2)) * sizeof ((v1)[0]), 0, align); \ 838 clib_memcpy ((v1) + _v(l1), (v2), _v(l2) * sizeof ((v2)[0])); \ 846 #define vec_prepend(v1,v2) \ 848 uword _v(l1) = vec_len (v1); \ 849 uword _v(l2) = vec_len (v2); \ 851 v1 = _vec_resize ((v1), _v(l2), \ 852 (_v(l1) + _v(l2)) * sizeof ((v1)[0]), 0, 0); \ 853 memmove ((v1) + _v(l2), (v1), _v(l1) * sizeof ((v1)[0])); \ 854 clib_memcpy ((v1), (v2), _v(l2) * sizeof ((v2)[0])); \ 863 #define vec_prepend_aligned(v1,v2,align) \ 865 uword _v(l1) = vec_len (v1); \ 866 uword _v(l2) = vec_len (v2); \ 868 v1 = _vec_resize ((v1), _v(l2), \ 869 (_v(l1) + _v(l2)) * sizeof ((v1)[0]), 0, align); \ 870 memmove ((v1) + _v(l2), (v1), _v(l1) * sizeof ((v1)[0])); \ 871 clib_memcpy ((v1), (v2), _v(l2) * sizeof ((v2)[0])); \ 878 #define vec_zero(var) \ 881 memset ((var), 0, vec_len (var) * sizeof ((var)[0])); \ 888 #define vec_set(v,val) \ 891 __typeof__ ((v)[0]) _val = (val); \ 892 for (_v(i) = 0; _v(i) < vec_len (v); _v(i)++) \ 906 #define vec_is_equal(v1,v2) \ 907 (vec_len (v1) == vec_len (v2) && ! memcmp ((v1), (v2), vec_len (v1) * sizeof ((v1)[0]))) 916 #define vec_cmp(v1,v2) \ 918 word _v(i), _v(cmp), _v(l); \ 919 _v(l) = clib_min (vec_len (v1), vec_len (v2)); \ 921 for (_v(i) = 0; _v(i) < _v(l); _v(i)++) { \ 922 _v(cmp) = (v1)[_v(i)] - (v2)[_v(i)]; \ 926 if (_v(cmp) == 0 && _v(l) > 0) \ 927 _v(cmp) = vec_len(v1) - vec_len(v2); \ 928 (_v(cmp) < 0 ? -1 : (_v(cmp) > 0 ? +1 : 0)); \ 937 #define vec_search(v,E) \ 940 while (_v(i) < vec_len(v)) \ 942 if ((v)[_v(i)] == E) \ 946 if (_v(i) == vec_len(v)) \ 956 #define vec_sort_with_function(vec,f) \ 958 qsort (vec, vec_len (vec), sizeof (vec[0]), (void *) (f)); \ 967 #define vec_validate_init_c_string(V, S, L) \ 969 vec_reset_length (V); \ 970 vec_validate ((V), (L)); \ 972 clib_memcpy ((V), (S), (L)); \ 982 #define vec_c_string_is_terminated(V) \ 983 (((V) != 0) && (vec_len (V) != 0) && ((V)[vec_len ((V)) - 1] == 0)) 990 #define vec_terminate_c_string(V) \ 992 u32 vl = vec_len ((V)); \ 993 if (!vec_c_string_is_terminated(V)) \ 995 vec_validate ((V), vl); \ uword clib_mem_is_vec_h(void *v, uword header_bytes)
Predicate function, says whether the supplied vector is a clib heap object (general version)...
static uword vec_header_bytes(uword header_bytes)
void * vec_resize_allocate_memory(void *v, word length_increment, uword data_bytes, uword header_bytes, uword data_align)
Low-level resize allocation function, usually not called directly.
static uword clib_mem_size(void *p)
static uword clib_mem_is_heap_object(void *p)
static uword clib_mem_is_vec(void *v)
Predicate function, says whether the supplied vector is a clib heap object.
Vector bootsrap header file.