CVector  4.1.0
A C++ style vector library in strict ANSI C (C89)
cvector_void.c
Go to the documentation of this file.
1 #include "cvector_void.h"
2 
3 
4 
5 #if defined(CVEC_MALLOC) && defined(CVEC_FREE) && defined(CVEC_REALLOC)
6 /* ok */
7 #elif !defined(CVEC_MALLOC) && !defined(CVEC_FREE) && !defined(CVEC_REALLOC)
8 /* ok */
9 #else
10 #error "Must define all or none of CVEC_MALLOC, CVEC_FREE, and CVEC_REALLOC."
11 #endif
12 
13 #ifndef CVEC_MALLOC
14 #define CVEC_MALLOC(sz) malloc(sz)
15 #define CVEC_REALLOC(p, sz) realloc(p, sz)
16 #define CVEC_FREE(p) free(p)
17 #endif
18 
19 #ifndef CVEC_MEMMOVE
20 #include <string.h>
21 #define CVEC_MEMMOVE(dst, src, sz) memmove(dst, src, sz)
22 #endif
23 
24 #ifndef CVEC_ASSERT
25 #include <assert.h>
26 #define CVEC_ASSERT(x) assert(x)
27 #endif
28 
30 
31 #define CVEC_VOID_ALLOCATOR(x) ((x+1) * 2)
32 
61 cvector_void* cvec_void_heap(cvec_sz size, cvec_sz capacity, cvec_sz elem_sz, void(*elem_free)(void*), int(*elem_init)(void*, void*))
62 {
63  cvector_void* vec;
64  if (!(vec = (cvector_void*)CVEC_MALLOC(sizeof(cvector_void)))) {
65  CVEC_ASSERT(vec != NULL);
66  return NULL;
67  }
68 
69  vec->size = size;
70  vec->capacity = (capacity > vec->size || (vec->size && capacity == vec->size)) ? capacity : vec->size + CVEC_VOID_START_SZ;
71 
72  vec->elem_size = elem_sz;
73 
74  if (!(vec->a = (cvec_u8*)CVEC_MALLOC(vec->capacity*elem_sz))) {
75  CVEC_ASSERT(vec->a != NULL);
76  CVEC_FREE(vec);
77  return NULL;
78  }
79  /* not clearing to 0 here as in cvector_str because elem_free cannot be calling CVEC_FREE directly
80  * since it takes the address of the element not the element itself */
81 
82  vec->elem_free = elem_free;
83  vec->elem_init = elem_init;
84 
85  return vec;
86 }
87 
92 cvector_void* cvec_init_void_heap(void* vals, cvec_sz num, cvec_sz elem_sz, void(*elem_free)(void*), int(*elem_init)(void*, void*))
93 {
94  cvector_void* vec;
95  cvec_sz i;
96 
97  if (!(vec = (cvector_void*)CVEC_MALLOC(sizeof(cvector_void)))) {
98  CVEC_ASSERT(vec != NULL);
99  return NULL;
100  }
101 
102  vec->elem_size = elem_sz;
103 
104  vec->capacity = num + CVEC_VOID_START_SZ;
105  vec->size = num;
106  if (!(vec->a = (cvec_u8*)CVEC_MALLOC(vec->capacity*elem_sz))) {
107  CVEC_ASSERT(vec->a != NULL);
108  CVEC_FREE(vec);
109  return NULL;
110  }
111 
112  if (elem_init) {
113  for (i=0; i<num; ++i) {
114  if (!elem_init(&vec->a[i*elem_sz], &((cvec_u8*)vals)[i*elem_sz])) {
115  CVEC_ASSERT(0);
116  CVEC_FREE(vec->a);
117  CVEC_FREE(vec);
118  return NULL;
119  }
120  }
121  } else {
122  CVEC_MEMMOVE(vec->a, vals, elem_sz*num);
123  }
124 
125  vec->elem_free = elem_free;
126  vec->elem_init = elem_init;
127 
128  return vec;
129 }
130 
134 int cvec_void(cvector_void* vec, cvec_sz size, cvec_sz capacity, cvec_sz elem_sz, void(*elem_free)(void*), int(*elem_init)(void*, void*))
135 {
136  vec->size = size;
137  vec->capacity = (capacity > vec->size || (vec->size && capacity == vec->size)) ? capacity : vec->size + CVEC_VOID_START_SZ;
138 
139  vec->elem_size = elem_sz;
140 
141  if (!(vec->a = (cvec_u8*)CVEC_MALLOC(vec->capacity*elem_sz))) {
142  CVEC_ASSERT(vec->a != NULL);
143  vec->size = vec->capacity = 0;
144  return 0;
145  }
146 
147  vec->elem_free = elem_free;
148  vec->elem_init = elem_init;
149 
150  return 1;
151 }
152 
156 int cvec_init_void(cvector_void* vec, void* vals, cvec_sz num, cvec_sz elem_sz, void(*elem_free)(void*), int(*elem_init)(void*, void*))
157 {
158  cvec_sz i;
159 
160  vec->elem_size = elem_sz;
161 
162  vec->capacity = num + CVEC_VOID_START_SZ;
163  vec->size = num;
164  if (!(vec->a = (cvec_u8*)CVEC_MALLOC(vec->capacity*elem_sz))) {
165  CVEC_ASSERT(vec->a != NULL);
166  vec->size = vec->capacity = 0;
167  return 0;
168  }
169 
170  if (elem_init) {
171  for (i=0; i<num; ++i) {
172  if (!elem_init(&vec->a[i*elem_sz], &((cvec_u8*)vals)[i*elem_sz])) {
173  CVEC_ASSERT(0);
174  return 0;
175  }
176  }
177  } else {
178  CVEC_MEMMOVE(vec->a, vals, elem_sz*num);
179  }
180 
181  vec->elem_free = elem_free;
182  vec->elem_init = elem_init;
183 
184  return 1;
185 }
186 
197 int cvec_copyc_void(void* dest, void* src)
198 {
199  cvector_void* vec1 = (cvector_void*)dest;
200  cvector_void* vec2 = (cvector_void*)src;
201 
202  vec1->a = NULL;
203  vec1->size = 0;
204  vec1->capacity = 0;
205 
206  return cvec_copy_void(vec1, vec2);
207 }
208 
219 {
220  int i;
221  cvec_u8* tmp = NULL;
222  if (!(tmp = (cvec_u8*)CVEC_REALLOC(dest->a, src->capacity*src->elem_size))) {
223  CVEC_ASSERT(tmp != NULL);
224  return 0;
225  }
226  dest->a = tmp;
227 
228  if (src->elem_init) {
229  for (i=0; i<src->size; ++i) {
230  if (!src->elem_init(&dest->a[i*src->elem_size], &src->a[i*src->elem_size])) {
231  CVEC_ASSERT(0);
232  return 0;
233  }
234  }
235  } else {
236  /* could use memcpy here since we know we just allocated dest->a */
237  CVEC_MEMMOVE(dest->a, src->a, src->size*src->elem_size);
238  }
239 
240  dest->size = src->size;
241  dest->capacity = src->capacity;
242  dest->elem_size = src->elem_size;
243  dest->elem_free = src->elem_free;
244  dest->elem_init = src->elem_init;
245  return 1;
246 }
247 
254 int cvec_push_void(cvector_void* vec, void* a)
255 {
256  cvec_u8* tmp;
257  cvec_sz tmp_sz;
258  if (vec->capacity == vec->size) {
259  tmp_sz = CVEC_VOID_ALLOCATOR(vec->capacity);
260  if (!(tmp = (cvec_u8*)CVEC_REALLOC(vec->a, vec->elem_size*tmp_sz))) {
261  CVEC_ASSERT(tmp != NULL);
262  return 0;
263  }
264  vec->a = tmp;
265  vec->capacity = tmp_sz;
266  }
267  if (vec->elem_init) {
268  if (!vec->elem_init(&vec->a[vec->size*vec->elem_size], a)) {
269  CVEC_ASSERT(0);
270  return 0;
271  }
272  } else {
273  CVEC_MEMMOVE(&vec->a[vec->size*vec->elem_size], a, vec->elem_size);
274  }
275 
276  vec->size++;
277  return 1;
278 }
279 
281 int cvec_pushm_void(cvector_void* vec, void* a)
282 {
283  cvec_u8* tmp;
284  cvec_sz tmp_sz;
285  if (vec->capacity == vec->size) {
286  tmp_sz = CVEC_VOID_ALLOCATOR(vec->capacity);
287  if (!(tmp = (cvec_u8*)CVEC_REALLOC(vec->a, vec->elem_size*tmp_sz))) {
288  CVEC_ASSERT(tmp != NULL);
289  return 0;
290  }
291  vec->a = tmp;
292  vec->capacity = tmp_sz;
293  }
294  CVEC_MEMMOVE(&vec->a[vec->size*vec->elem_size], a, vec->elem_size);
295 
296  vec->size++;
297  return 1;
298 }
299 
300 
306 void cvec_pop_void(cvector_void* vec, void* ret)
307 {
308  vec->size--;
309  if (ret) {
310  CVEC_MEMMOVE(ret, &vec->a[vec->size*vec->elem_size], vec->elem_size);
311  }
312  if (vec->elem_free) {
313  vec->elem_free(&vec->a[vec->size*vec->elem_size]);
314  }
315 }
316 
318 void cvec_popm_void(cvector_void* vec, void* ret)
319 {
320  vec->size--;
321  if (ret) {
322  CVEC_MEMMOVE(ret, &vec->a[vec->size*vec->elem_size], vec->elem_size);
323  }
324 }
325 
328 {
329  return &vec->a[(vec->size-1)*vec->elem_size];
330 }
331 
335 {
336  cvec_u8* tmp;
337  cvec_sz tmp_sz;
338  if (vec->capacity < vec->size + num) {
339  tmp_sz = vec->capacity + num + CVEC_VOID_START_SZ;
340  if (!(tmp = (cvec_u8*)CVEC_REALLOC(vec->a, vec->elem_size*tmp_sz))) {
341  CVEC_ASSERT(tmp != NULL);
342  return 0;
343  }
344  vec->a = tmp;
345  vec->capacity = tmp_sz;
346  }
347 
348  vec->size += num;
349  return 1;
350 }
351 
358 {
359  return &vec->a[i*vec->elem_size];
360 }
361 
366 int cvec_insert_void(cvector_void* vec, cvec_sz i, void* a)
367 {
368  cvec_u8* tmp;
369  cvec_sz tmp_sz;
370  if (vec->capacity == vec->size) {
371  tmp_sz = CVEC_VOID_ALLOCATOR(vec->capacity);
372  if (!(tmp = (cvec_u8*)CVEC_REALLOC(vec->a, vec->elem_size*tmp_sz))) {
373  CVEC_ASSERT(tmp != NULL);
374  return 0;
375  }
376 
377  vec->a = tmp;
378  vec->capacity = tmp_sz;
379  }
380  CVEC_MEMMOVE(&vec->a[(i+1)*vec->elem_size], &vec->a[i*vec->elem_size], (vec->size-i)*vec->elem_size);
381 
382  if (vec->elem_init) {
383  if (!vec->elem_init(&vec->a[i*vec->elem_size], a)) {
384  CVEC_ASSERT(0);
385  return 0;
386  }
387  } else {
388  CVEC_MEMMOVE(&vec->a[i*vec->elem_size], a, vec->elem_size);
389  }
390 
391  vec->size++;
392  return 1;
393 }
394 
397 {
398  cvec_u8* tmp;
399  cvec_sz tmp_sz;
400  if (vec->capacity == vec->size) {
401  tmp_sz = CVEC_VOID_ALLOCATOR(vec->capacity);
402  if (!(tmp = (cvec_u8*)CVEC_REALLOC(vec->a, vec->elem_size*tmp_sz))) {
403  CVEC_ASSERT(tmp != NULL);
404  return 0;
405  }
406 
407  vec->a = tmp;
408  vec->capacity = tmp_sz;
409  }
410  CVEC_MEMMOVE(&vec->a[(i+1)*vec->elem_size], &vec->a[i*vec->elem_size], (vec->size-i)*vec->elem_size);
411 
412  CVEC_MEMMOVE(&vec->a[i*vec->elem_size], a, vec->elem_size);
413 
414  vec->size++;
415  return 1;
416 }
417 
426 {
427  cvec_u8* tmp;
428  cvec_sz tmp_sz, j;
429  if (vec->capacity < vec->size + num) {
430  tmp_sz = vec->capacity + num + CVEC_VOID_START_SZ;
431  if (!(tmp = (cvec_u8*)CVEC_REALLOC(vec->a, vec->elem_size*tmp_sz))) {
432  CVEC_ASSERT(tmp != NULL);
433  return 0;
434  }
435  vec->a = tmp;
436  vec->capacity = tmp_sz;
437  }
438 
439  CVEC_MEMMOVE(&vec->a[(i+num)*vec->elem_size], &vec->a[i*vec->elem_size], (vec->size-i)*vec->elem_size);
440  if (vec->elem_init) {
441  for (j=0; j<num; ++j) {
442  if (!vec->elem_init(&vec->a[(j+i)*vec->elem_size], &((cvec_u8*)a)[j*vec->elem_size])) {
443  CVEC_ASSERT(0);
444  return 0;
445  }
446  }
447  } else {
448  CVEC_MEMMOVE(&vec->a[i*vec->elem_size], a, num*vec->elem_size);
449  }
450  vec->size += num;
451  return 1;
452 }
453 
456 {
457  cvec_u8* tmp;
458  cvec_sz tmp_sz;
459  if (vec->capacity < vec->size + num) {
460  tmp_sz = vec->capacity + num + CVEC_VOID_START_SZ;
461  if (!(tmp = (cvec_u8*)CVEC_REALLOC(vec->a, vec->elem_size*tmp_sz))) {
462  CVEC_ASSERT(tmp != NULL);
463  return 0;
464  }
465  vec->a = tmp;
466  vec->capacity = tmp_sz;
467  }
468 
469  CVEC_MEMMOVE(&vec->a[(i+num)*vec->elem_size], &vec->a[i*vec->elem_size], (vec->size-i)*vec->elem_size);
470 
471  CVEC_MEMMOVE(&vec->a[i*vec->elem_size], a, num*vec->elem_size);
472  vec->size += num;
473  return 1;
474 }
475 
479 int cvec_replace_void(cvector_void* vec, cvec_sz i, void* a, void* ret)
480 {
481  if (ret) {
482  CVEC_MEMMOVE(ret, &vec->a[i*vec->elem_size], vec->elem_size);
483  } else if (vec->elem_free) {
484  vec->elem_free(&vec->a[i*vec->elem_size]);
485  }
486 
487  if (vec->elem_init) {
488  if (!vec->elem_init(&vec->a[i*vec->elem_size], a)) {
489  CVEC_ASSERT(0);
490  return 0;
491  }
492  } else {
493  CVEC_MEMMOVE(&vec->a[i*vec->elem_size], a, vec->elem_size);
494  }
495  return 1;
496 }
497 
503 void cvec_replacem_void(cvector_void* vec, cvec_sz i, void* a, void* ret)
504 {
505  if (ret) {
506  CVEC_MEMMOVE(ret, &vec->a[i*vec->elem_size], vec->elem_size);
507  }
508 
509  CVEC_MEMMOVE(&vec->a[i*vec->elem_size], a, vec->elem_size);
510 }
511 
518 {
519  cvec_sz i;
520  cvec_sz d = end - start + 1;
521  if (vec->elem_free) {
522  for (i=start; i<=end; i++) {
523  vec->elem_free(&vec->a[i*vec->elem_size]);
524  }
525  }
526  CVEC_MEMMOVE(&vec->a[start*vec->elem_size], &vec->a[(end+1)*vec->elem_size], (vec->size-1-end)*vec->elem_size);
527  vec->size -= d;
528 }
529 
532 {
533  cvec_sz d = end - start + 1;
534  CVEC_MEMMOVE(&vec->a[start*vec->elem_size], &vec->a[(end+1)*vec->elem_size], (vec->size-1-end)*vec->elem_size);
535  vec->size -= d;
536 }
537 
540 {
541  cvec_u8* tmp;
542  if (vec->capacity < size) {
543  if (!(tmp = (cvec_u8*)CVEC_REALLOC(vec->a, vec->elem_size*(size+CVEC_VOID_START_SZ)))) {
544  CVEC_ASSERT(tmp != NULL);
545  return 0;
546  }
547  vec->a = tmp;
548  vec->capacity = size + CVEC_VOID_START_SZ;
549  }
550  return 1;
551 }
552 
558 {
559  cvec_sz i;
560  cvec_u8* tmp;
561  if (size < vec->size) {
562  if (vec->elem_free) {
563  for (i=vec->size-1; i>=size; i--) {
564  vec->elem_free(&vec->a[i*vec->elem_size]);
565  }
566  }
567  vec->size = size;
568  }
569 
570  vec->capacity = size;
571 
572  if (!(tmp = (cvec_u8*)CVEC_REALLOC(vec->a, vec->elem_size*size))) {
573  CVEC_ASSERT(tmp != NULL);
574  return 0;
575  }
576  vec-> a = tmp;
577  return 1;
578 }
579 
581 int cvec_set_val_sz_void(cvector_void* vec, void* val)
582 {
583  cvec_sz i;
584 
585  if (vec->elem_free) {
586  for(i=0; i<vec->size; i++) {
587  vec->elem_free(&vec->a[i*vec->elem_size]);
588  }
589  }
590 
591  if (vec->elem_init) {
592  for (i=0; i<vec->size; i++) {
593  if (!vec->elem_init(&vec->a[i*vec->elem_size], val)) {
594  CVEC_ASSERT(0);
595  return 0;
596  }
597  }
598  } else {
599  for (i=0; i<vec->size; i++) {
600  CVEC_MEMMOVE(&vec->a[i*vec->elem_size], val, vec->elem_size);
601  }
602  }
603  return 1;
604 }
605 
612 {
613  cvec_sz i;
614  if (vec->elem_free) {
615  for (i=0; i<vec->size; i++) {
616  vec->elem_free(&vec->a[i*vec->elem_size]);
617  }
618  vec->size = vec->capacity;
619  }
620 
621  if (vec->elem_init) {
622  for (i=0; i<vec->capacity; i++) {
623  if (!vec->elem_init(&vec->a[i*vec->elem_size], val)) {
624  CVEC_ASSERT(0);
625  return 0;
626  }
627  }
628  } else {
629  for (i=0; i<vec->capacity; i++) {
630  CVEC_MEMMOVE(&vec->a[i*vec->elem_size], val, vec->elem_size);
631  }
632  }
633  return 1;
634 }
635 
639 {
640  cvec_sz i;
641  if (vec->elem_free) {
642  for (i=0; i<vec->size; ++i) {
643  vec->elem_free(&vec->a[i*vec->elem_size]);
644  }
645  }
646  vec->size = 0;
647 }
648 
652 void cvec_free_void_heap(void* vec)
653 {
654  cvec_sz i;
655  cvector_void* tmp = (cvector_void*)vec;
656  if (!tmp) return;
657  if (tmp->elem_free) {
658  for (i=0; i<tmp->size; i++) {
659  tmp->elem_free(&tmp->a[i*tmp->elem_size]);
660  }
661  }
662  CVEC_FREE(tmp->a);
663  CVEC_FREE(tmp);
664 }
665 
667 void cvec_free_void(void* vec)
668 {
669  cvec_sz i;
670  cvector_void* tmp = (cvector_void*)vec;
671  if (tmp->elem_free) {
672  for (i=0; i<tmp->size; i++) {
673  tmp->elem_free(&tmp->a[i*tmp->elem_size]);
674  }
675  }
676 
677  CVEC_FREE(tmp->a);
678 
679  tmp->size = 0;
680  tmp->capacity = 0;
681 }
682 
unsigned char cvec_u8
Definition: cvector.h:239
CVEC_SIZE_T cvec_sz
Definition: cvector.h:88
#define CVEC_FREE(p)
Definition: cvector_void.c:16
cvector_void * cvec_init_void_heap(void *vals, cvec_sz num, cvec_sz elem_sz, void(*elem_free)(void *), int(*elem_init)(void *, void *))
Create (on the heap) and initialize vector with num elements of vals.
Definition: cvector_void.c:92
int cvec_set_val_sz_void(cvector_void *vec, void *val)
Set all size elements to val.
Definition: cvector_void.c:581
int cvec_copyc_void(void *dest, void *src)
Makes dest a copy of src.
Definition: cvector_void.c:197
#define CVEC_VOID_ALLOCATOR(x)
Definition: cvector_void.c:31
int cvec_insert_array_void(cvector_void *vec, cvec_sz i, void *a, cvec_sz num)
Insert the first num elements of array a at index i.
Definition: cvector_void.c:425
int cvec_copy_void(cvector_void *dest, cvector_void *src)
Makes dest a copy of src.
Definition: cvector_void.c:218
int cvec_reserve_void(cvector_void *vec, cvec_sz size)
Makes sure capacity >= size (the parameter not the member).
Definition: cvector_void.c:539
#define CVEC_REALLOC(p, sz)
Definition: cvector_void.c:15
int cvec_pushm_void(cvector_void *vec, void *a)
Same as push except no elem_init even if it's set.
Definition: cvector_void.c:281
int cvec_insert_arraym_void(cvector_void *vec, cvec_sz i, void *a, cvec_sz num)
Same as insert_array but no elem_init even if defined.
Definition: cvector_void.c:455
int cvec_replace_void(cvector_void *vec, cvec_sz i, void *a, void *ret)
Replace value at i with a, return old value in ret if non-NULL.
Definition: cvector_void.c:479
void cvec_remove_void(cvector_void *vec, cvec_sz start, cvec_sz end)
Same as erase except it does not call elem_free.
Definition: cvector_void.c:531
int cvec_init_void(cvector_void *vec, void *vals, cvec_sz num, cvec_sz elem_sz, void(*elem_free)(void *), int(*elem_init)(void *, void *))
Same as init_vec_heap() except the vector passed in was declared on the stack so it isn't allocated i...
Definition: cvector_void.c:156
void * cvec_back_void(cvector_void *vec)
Return pointer to last element.
Definition: cvector_void.c:327
#define CVEC_MEMMOVE(dst, src, sz)
Definition: cvector_void.c:21
void cvec_erase_void(cvector_void *vec, cvec_sz start, cvec_sz end)
Erases elements from start to end inclusive.
Definition: cvector_void.c:517
int cvec_push_void(cvector_void *vec, void *a)
Append a to end of vector (size increased 1).
Definition: cvector_void.c:254
int cvec_insertm_void(cvector_void *vec, cvec_sz i, void *a)
Same as insert but no elem_init even if defined.
Definition: cvector_void.c:396
#define CVEC_MALLOC(sz)
Definition: cvector_void.c:14
int cvec_void(cvector_void *vec, cvec_sz size, cvec_sz capacity, cvec_sz elem_sz, void(*elem_free)(void *), int(*elem_init)(void *, void *))
Same as cvec_void_heap() except the vector passed in was declared on the stack so it isn't allocated ...
Definition: cvector_void.c:134
#define CVEC_ASSERT(x)
Definition: cvector_void.c:26
void cvec_pop_void(cvector_void *vec, void *ret)
Remove the last element (size decreased 1).
Definition: cvector_void.c:306
int cvec_set_cap_void(cvector_void *vec, cvec_sz size)
Set capacity to size.
Definition: cvector_void.c:557
void cvec_free_void(void *vec)
Frees the internal array and sets size and capacity to 0.
Definition: cvector_void.c:667
cvector_void * cvec_void_heap(cvec_sz size, cvec_sz capacity, cvec_sz elem_sz, void(*elem_free)(void *), int(*elem_init)(void *, void *))
Creates a new vector on the heap.
Definition: cvector_void.c:61
void cvec_replacem_void(cvector_void *vec, cvec_sz i, void *a, void *ret)
Same as replace but no elem_free or elem_init even if they're defined.
Definition: cvector_void.c:503
cvec_sz CVEC_VOID_START_SZ
Definition: cvector_void.c:29
int cvec_set_val_cap_void(cvector_void *vec, void *val)
Fills entire allocated array (capacity) with val.
Definition: cvector_void.c:611
void cvec_free_void_heap(void *vec)
Frees everything so don't use vec after calling this.
Definition: cvector_void.c:652
int cvec_extend_void(cvector_void *vec, cvec_sz num)
Increase the size of the array num items.
Definition: cvector_void.c:334
void * cvec_get_void(cvector_void *vec, cvec_sz i)
Return a void pointer to the ith element.
Definition: cvector_void.c:357
void cvec_clear_void(cvector_void *vec)
Sets size to 0 (does not change contents unless elem_free is set then it will elem_free all size elem...
Definition: cvector_void.c:638
void cvec_popm_void(cvector_void *vec, void *ret)
Same as pop except no elem_free even if it's set.
Definition: cvector_void.c:318
int cvec_insert_void(cvector_void *vec, cvec_sz i, void *a)
Insert a at index i (0 based).
Definition: cvector_void.c:366
Data structure for generic type (cast to void) vectors.
Definition: cvector.h:243
cvec_sz size
Current size (amount you should use when manipulating array directly).
Definition: cvector.h:245
cvec_sz elem_size
Size in bytes of type stored (sizeof(T) where T is type).
Definition: cvector.h:247
cvec_sz capacity
Allocated size of array; always >= size.
Definition: cvector.h:246
void(* elem_free)(void *)
Definition: cvector.h:248
cvec_u8 * a
Array.
Definition: cvector.h:244
int(* elem_init)(void *, void *)
Definition: cvector.h:249