@@ -63,7 +63,7 @@ static int find(const BS_LIST *list, const void *data)
63
63
//closest match is found if we move back to where we have already been
64
64
65
65
while (1 ) {
66
- int r = memcmp (data , list -> data + list -> size * i , list -> size );
66
+ int r = memcmp (data , list -> data + list -> element_size * i , list -> element_size );
67
67
68
68
if (r == 0 ) {
69
69
return i ;
@@ -105,14 +105,52 @@ static int find(const BS_LIST *list, const void *data)
105
105
}
106
106
}
107
107
108
+ /* Resized the list list
109
+ *
110
+ * return value:
111
+ * 1 : success
112
+ * 0 : failure
113
+ */
114
+ static int resize (BS_LIST * list , uint32_t new_size )
115
+ {
116
+ void * p ;
117
+
118
+ p = realloc (list -> data , list -> element_size * new_size );
119
+
120
+ if (!p ) {
121
+ return 0 ;
122
+ } else {
123
+ list -> data = p ;
124
+ }
125
+
126
+ p = realloc (list -> ids , sizeof (int ) * new_size );
108
127
109
- void bs_list_init (BS_LIST * list , uint32_t element_size )
128
+ if (!p ) {
129
+ return 0 ;
130
+ } else {
131
+ list -> ids = p ;
132
+ }
133
+
134
+ return 1 ;
135
+ }
136
+
137
+
138
+ int bs_list_init (BS_LIST * list , uint32_t element_size , uint32_t initial_capacity )
110
139
{
111
140
//set initial values
112
141
list -> n = 0 ;
113
- list -> size = element_size ;
114
- list -> data = NULL ;
115
- list -> ids = NULL ;
142
+ list -> element_size = element_size ;
143
+ if (initial_capacity == 0 ) {
144
+ list -> data = NULL ;
145
+ list -> ids = NULL ;
146
+ } else {
147
+ if (!resize (list , initial_capacity )) {
148
+ return 0 ;
149
+ }
150
+ }
151
+ list -> capacity = initial_capacity ;
152
+
153
+ return 1 ;
116
154
}
117
155
118
156
void bs_list_free (BS_LIST * list )
@@ -147,28 +185,19 @@ int bs_list_add(BS_LIST *list, const void *data, int id)
147
185
148
186
i = ~i ;
149
187
150
- //increase the size of the arrays by one
151
- void * p ;
152
-
153
- p = realloc (list -> data , list -> size * (list -> n + 1 ));
154
-
155
- if (!p ) {
156
- return 0 ;
157
- } else {
158
- list -> data = p ;
159
- }
160
-
161
- p = realloc (list -> ids , sizeof (int ) * (list -> n + 1 ));
162
-
163
- if (!p ) {
164
- return 0 ;
165
- } else {
166
- list -> ids = p ;
188
+ //increase the size of the arrays if needed
189
+ if (list -> n == list -> capacity ) {
190
+ // 1.5 * n + 1
191
+ const uint32_t new_capacity = list -> n + list -> n /2 + 1 ;
192
+ if (!resize (list , new_capacity )) {
193
+ return 0 ;
194
+ }
195
+ list -> capacity = new_capacity ;
167
196
}
168
197
169
198
//insert data to element array
170
- memmove (list -> data + (i + 1 ) * list -> size , list -> data + i * list -> size , (list -> n - i ) * list -> size );
171
- memcpy (list -> data + i * list -> size , data , list -> size );
199
+ memmove (list -> data + (i + 1 ) * list -> element_size , list -> data + i * list -> element_size , (list -> n - i ) * list -> element_size );
200
+ memcpy (list -> data + i * list -> element_size , data , list -> element_size );
172
201
173
202
//insert id to id array
174
203
memmove (& list -> ids [i + 1 ], & list -> ids [i ], (list -> n - i ) * sizeof (int ));
@@ -193,10 +222,29 @@ int bs_list_remove(BS_LIST *list, const void *data, int id)
193
222
return 0 ;
194
223
}
195
224
225
+ //decrease the size of the arrays if needed
226
+ if (list -> n < list -> capacity /2 ) {
227
+ const uint32_t new_capacity = list -> capacity /2 ;
228
+ if (!resize (list , new_capacity )) {
229
+ return 0 ;
230
+ }
231
+ list -> capacity = new_capacity ;
232
+ }
233
+
196
234
list -> n -- ;
197
235
198
- memmove (list -> data + i * list -> size , list -> data + (i + 1 ) * list -> size , (list -> n - i ) * list -> size );
236
+ memmove (list -> data + i * list -> element_size , list -> data + (i + 1 ) * list -> element_size , (list -> n - i ) * list -> element_size );
199
237
memmove (& list -> ids [i ], & list -> ids [i + 1 ], (list -> n - i ) * sizeof (int ));
200
238
201
239
return 1 ;
202
240
}
241
+
242
+ int bs_list_trim (BS_LIST * list )
243
+ {
244
+ if (!resize (list , list -> n )) {
245
+ return 0 ;
246
+ }
247
+
248
+ list -> capacity = list -> n ;
249
+ return 1 ;
250
+ }
0 commit comments