Lines Matching full:v
46 bc_vec_grow(BcVec* restrict v, size_t n)
53 cap = v->cap;
54 len = v->len + n;
69 v->v = bc_vm_realloc(v->v, bc_vm_arraySize(cap, v->size));
70 v->cap = cap;
76 bc_vec_init(BcVec* restrict v, size_t esize, BcDtorType dtor)
80 assert(v != NULL && esize);
82 v->v = bc_vm_malloc(bc_vm_arraySize(BC_VEC_START_CAP, esize));
84 v->size = (BcSize) esize;
85 v->cap = BC_VEC_START_CAP;
86 v->len = 0;
87 v->dtor = (BcSize) dtor;
91 bc_vec_expand(BcVec* restrict v, size_t req)
93 assert(v != NULL);
96 if (v->cap < req)
104 v->v = bc_vm_realloc(v->v, bc_vm_arraySize(req, v->size));
105 v->cap = req;
112 bc_vec_npop(BcVec* restrict v, size_t n)
118 assert(v != NULL && n <= v->len);
122 if (!v->dtor) v->len -= n;
125 const BcVecFree d = bc_vec_dtors[v->dtor];
126 size_t esize = v->size;
127 size_t len = v->len - n;
130 while (v->len > len)
132 d(v->v + (esize * --v->len));
140 bc_vec_npopAt(BcVec* restrict v, size_t n, size_t idx)
148 assert(v != NULL);
149 assert(idx + n < v->len);
152 ptr = bc_vec_item(v, idx);
153 data = bc_vec_item(v, idx + n);
157 if (v->dtor)
160 const BcVecFree d = bc_vec_dtors[v->dtor];
165 d(bc_vec_item(v, idx + i));
169 v->len -= n;
171 memmove(ptr, data, (v->len - idx) * v->size);
177 bc_vec_npush(BcVec* restrict v, size_t n, const void* data)
184 assert(v != NULL && data != NULL);
189 if (v->len + n > v->cap) bc_vec_grow(v, n);
191 esize = v->size;
195 memcpy(v->v + (esize * v->len), data, esize * n);
196 v->len += n;
202 bc_vec_push(BcVec* restrict v, const void* data)
204 bc_vec_npush(v, 1, data);
208 bc_vec_pushEmpty(BcVec* restrict v)
215 assert(v != NULL);
220 if (v->len + 1 > v->cap) bc_vec_grow(v, 1);
222 ptr = v->v + v->size * v->len;
223 v->len += 1;
231 bc_vec_pushByte(BcVec* restrict v, uchar data)
233 assert(v != NULL && v->size == sizeof(uchar));
234 bc_vec_npush(v, 1, &data);
238 bc_vec_pushIndex(BcVec* restrict v, size_t idx)
242 assert(v != NULL);
243 assert(v->size == sizeof(uchar));
256 bc_vec_npush(v, amt + 1, nums);
260 bc_vec_pushAt(BcVec* restrict v, const void* data, size_t idx)
262 assert(v != NULL && data != NULL && idx <= v->len);
267 if (idx == v->len) bc_vec_push(v, data);
274 if (v->len == v->cap) bc_vec_grow(v, 1);
276 esize = v->size;
278 ptr = v->v + esize * idx;
281 memmove(ptr + esize, ptr, esize * (v->len++ - idx));
288 bc_vec_string(BcVec* restrict v, size_t len, const char* restrict str)
294 assert(v != NULL && v->size == sizeof(char));
295 assert(!v->dtor);
296 assert(!v->len || !v->v[v->len - 1]);
297 assert(v->v != str);
301 bc_vec_popAll(v);
302 bc_vec_expand(v, bc_vm_growSize(len, 1));
304 memcpy(v->v, str, len);
305 v->len = len;
307 bc_vec_pushByte(v, '\0');
313 bc_vec_concat(BcVec* restrict v, const char* restrict str)
319 assert(v != NULL && v->size == sizeof(char));
320 assert(!v->dtor);
321 assert(!v->len || !v->v[v->len - 1]);
322 assert(v->v != str);
327 if (v->len) v->len -= 1;
329 bc_vec_npush(v, strlen(str) + 1, str);
335 bc_vec_empty(BcVec* restrict v)
341 assert(v != NULL && v->size == sizeof(char));
342 assert(!v->dtor);
346 bc_vec_popAll(v);
347 bc_vec_pushByte(v, '\0');
354 bc_vec_replaceAt(BcVec* restrict v, size_t idx, const void* data)
360 assert(v != NULL);
362 ptr = bc_vec_item(v, idx);
364 if (v->dtor) bc_vec_dtors[v->dtor](ptr);
367 memcpy(ptr, data, v->size);
372 bc_vec_item(const BcVec* restrict v, size_t idx)
374 assert(v != NULL && v->len && idx < v->len);
375 return v->v + v->size * idx;
379 bc_vec_item_rev(const BcVec* restrict v, size_t idx)
381 assert(v != NULL && v->len && idx < v->len);
382 return v->v + v->size * (v->len - idx - 1);
386 bc_vec_clear(BcVec* restrict v)
389 v->v = NULL;
390 v->len = 0;
391 v->dtor = BC_DTOR_NONE;
397 BcVec* v = (BcVec*) vec;
399 bc_vec_popAll(v);
400 free(v->v);
409 * @param v The map.
415 bc_map_find(const BcVec* restrict v, const char* name)
417 size_t low = 0, high = v->len;
422 const BcId* id = bc_vec_item(v, mid);
434 bc_map_insert(BcVec* restrict v, const char* name, size_t idx,
441 assert(v != NULL && name != NULL && i != NULL);
443 *i = bc_map_find(v, name);
445 assert(*i <= v->len);
447 if (*i != v->len && !strcmp(name, ((BcId*) bc_vec_item(v, *i))->name))
455 bc_vec_pushAt(v, &id, *i);
461 bc_map_index(const BcVec* restrict v, const char* name)
466 assert(v != NULL && name != NULL);
468 i = bc_map_find(v, name);
471 if (i >= v->len) return BC_VEC_INVALID_IDX;
473 id = (BcId*) bc_vec_item(v, i);
481 bc_map_name(const BcVec* restrict v, size_t idx)
483 size_t i, len = v->len;
487 BcId* id = (BcId*) bc_vec_item(v, i);
547 bc_slabvec_init(BcVec* v)
551 assert(v != NULL);
553 bc_vec_init(v, sizeof(BcSlab), BC_DTOR_SLAB);
556 slab = bc_vec_pushEmpty(v);
561 bc_slabvec_strdup(BcVec* v, const char* str)
570 assert(v != NULL && v->len);
584 bc_vec_pushAt(v, &slab, v->len - 1);
590 slab_ptr = bc_vec_top(v);
596 slab_ptr = bc_vec_pushEmpty(v);
608 bc_slabvec_clear(BcVec* v)
618 s = bc_vec_item(v, 0);
622 assert(s->len != SIZE_MAX || v->len > 1);
628 if (again) bc_vec_npopAt(v, 1, 0);
634 if (v->len > 1) bc_vec_npop(v, v->len - 1);
644 bc_slabvec_print(BcVec* v, const char* func)
651 for (i = 0; i < v->len; ++i)
653 s = bc_vec_item(v, i);