Lines Matching +full:- +full:a

2 Copyright (c) 2008-2013, Troy D. Hanson   http://uthash.sourceforge.net
13 TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
24 /* $Id: utarray.h 2694 2012-11-24 17:11:58Z kaiwang27 $ */
26 /* a dynamic array implementation using macros
45 #define oom() exit(-1)
61 char *d; /* n slots of size icd->sz*/
64 #define utarray_init(a,_icd) do { \ argument
65 memset(a,0,sizeof(UT_array)); \
66 (a)->icd=*_icd; \
69 #define utarray_done(a) do { \ argument
70 if ((a)->n) { \
71 if ((a)->icd.dtor) { \
73 for(_ut_i=0; _ut_i < (a)->i; _ut_i++) { \
74 (a)->icd.dtor(utarray_eltptr(a,_ut_i)); \
77 free((a)->d); \
79 (a)->n=0; \
82 #define utarray_new(a,_icd) do { \ argument
83 a=(UT_array*)malloc(sizeof(UT_array)); \
84 utarray_init(a,_icd); \
87 #define utarray_free(a) do { \ argument
88 utarray_done(a); \
89 free(a); \
92 #define utarray_reserve(a,by) do { \ argument
93 if (((a)->i+by) > ((a)->n)) { \
94 while(((a)->i+by) > ((a)->n)) { (a)->n = ((a)->n ? (2*(a)->n) : 8); } \
95 if ( ((a)->d=(char*)realloc((a)->d, (a)->n*(a)->icd.sz)) == NULL) oom(); \
99 #define utarray_push_back(a,p) do { \ argument
100 utarray_reserve(a,1); \
101 if ((a)->icd.copy) { (a)->icd.copy( _utarray_eltptr(a,(a)->i++), p); } \
102 else { memcpy(_utarray_eltptr(a,(a)->i++), p, (a)->icd.sz); }; \
105 #define utarray_pop_back(a) do { \ argument
106 if ((a)->icd.dtor) { (a)->icd.dtor( _utarray_eltptr(a,--((a)->i))); } \
107 else { (a)->i--; } \
110 #define utarray_extend_back(a) do { \ argument
111 utarray_reserve(a,1); \
112 if ((a)->icd.init) { (a)->icd.init(_utarray_eltptr(a,(a)->i)); } \
113 else { memset(_utarray_eltptr(a,(a)->i),0,(a)->icd.sz); } \
114 (a)->i++; \
117 #define utarray_len(a) ((a)->i) argument
119 #define utarray_eltptr(a,j) (((j) < (a)->i) ? _utarray_eltptr(a,j) : NULL) argument
120 #define _utarray_eltptr(a,j) ((char*)((a)->d + ((a)->icd.sz*(j) ))) argument
122 #define utarray_insert(a,p,j) do { \ argument
123 utarray_reserve(a,1); \
124 if (j > (a)->i) break; \
125 if ((j) < (a)->i) { \
126 memmove( _utarray_eltptr(a,(j)+1), _utarray_eltptr(a,j), \
127 ((a)->i - (j))*((a)->icd.sz)); \
129 if ((a)->icd.copy) { (a)->icd.copy( _utarray_eltptr(a,j), p); } \
130 else { memcpy(_utarray_eltptr(a,j), p, (a)->icd.sz); }; \
131 (a)->i++; \
134 #define utarray_inserta(a,w,j) do { \ argument
136 if (j > (a)->i) break; \
137 utarray_reserve(a,utarray_len(w)); \
138 if ((j) < (a)->i) { \
139 memmove(_utarray_eltptr(a,(j)+utarray_len(w)), \
140 _utarray_eltptr(a,j), \
141 ((a)->i - (j))*((a)->icd.sz)); \
143 if ((a)->icd.copy) { \
145 for(_ut_i=0;_ut_i<(w)->i;_ut_i++) { \
146 (a)->icd.copy(_utarray_eltptr(a,j+_ut_i), _utarray_eltptr(w,_ut_i)); \
149 memcpy(_utarray_eltptr(a,j), _utarray_eltptr(w,0), \
150 utarray_len(w)*((a)->icd.sz)); \
152 (a)->i += utarray_len(w); \
157 if (dst->i > (size_t)(num)) { \
158 if ((dst)->icd.dtor) { \
159 for(_ut_i=num; _ut_i < dst->i; _ut_i++) { \
160 (dst)->icd.dtor(utarray_eltptr(dst,_ut_i)); \
163 } else if (dst->i < (size_t)(num)) { \
164 utarray_reserve(dst,num-dst->i); \
165 if ((dst)->icd.init) { \
166 for(_ut_i=dst->i; _ut_i < num; _ut_i++) { \
167 (dst)->icd.init(utarray_eltptr(dst,_ut_i)); \
170 memset(_utarray_eltptr(dst,dst->i),0,(dst)->icd.sz*(num-dst->i)); \
173 dst->i = num; \
180 #define utarray_erase(a,pos,len) do { \ argument
181 if ((a)->icd.dtor) { \
184 (a)->icd.dtor(utarray_eltptr((a),pos+_ut_i)); \
187 if ((a)->i > (pos+len)) { \
188 memmove( _utarray_eltptr((a),pos), _utarray_eltptr((a),pos+len), \
189 (((a)->i)-(pos+len))*((a)->icd.sz)); \
191 (a)->i -= (len); \
194 #define utarray_renew(a,u) do { \ argument
195 if (a) utarray_clear(a); \
196 else utarray_new((a),(u)); \
199 #define utarray_clear(a) do { \ argument
200 if ((a)->i > 0) { \
201 if ((a)->icd.dtor) { \
203 for(_ut_i=0; _ut_i < (a)->i; _ut_i++) { \
204 (a)->icd.dtor(utarray_eltptr(a,_ut_i)); \
207 (a)->i = 0; \
211 #define utarray_sort(a,cmp) do { \ argument
212 qsort((a)->d, (a)->i, (a)->icd.sz, cmp); \
215 #define utarray_find(a,v,cmp) bsearch((v),(a)->d,(a)->i,(a)->icd.sz,cmp) argument
217 #define utarray_front(a) (((a)->i) ? (_utarray_eltptr(a,0)) : NULL) argument
218 …ine utarray_next(a,e) (((e)==NULL) ? utarray_front(a) : (((int)((a)->i) > (utarray_eltidx(a,e)+1))… argument
219 #define utarray_prev(a,e) (((e)==NULL) ? utarray_back(a) : ((utarray_eltidx(a,e) > 0) ? _utarray_el… argument
220 #define utarray_back(a) (((a)->i) ? (_utarray_eltptr(a,(a)->i-1)) : NULL) argument
221 #define utarray_eltidx(a,e) (((char*)(e) >= (char*)((a)->d)) ? (int)(((char*)(e) - (char*)((a)->d))… argument
223 /* last we pre-define a few icd for common utarrays of ints and strings */