CVector  4.1.0
A C++ style vector library in strict ANSI C (C89)
cvector_tests.c
Go to the documentation of this file.
1 
2 #include "test_types.h"
3 
4 /*
5  uncomment this and in cvector_all.c to test with something other than
6  the default size_t
7 
8 #define CVEC_SIZE_T int
9 */
10 
11 /*
12  * recommended way is cvector.h which has everythng: all 4 base types flat
13  * (not #included) + the macros for compile time code generation
14  */
15 #ifdef USE_CVECTOR_H
16 
17 #define CVECTOR_IMPLEMENTATION
18 #ifdef USE_POSIX_STRDUP
19 #define CVEC_STRDUP strdup
20 #endif
21 #include "cvector.h"
22 
23 #define RESIZE(a) ((a+1)*2)
24 
25 CVEC_NEW_DECLS(short)
27 
28 CVEC_NEW_DEFS(short, RESIZE)
30 
31 #else
32 /* otherwise you can use individual headers (cvector_all.h just includes them) */
33 
34 #include "cvector_all.h"
35 
36 #ifdef USE_TEMPLATES
37 
38 /* plus files generated with generate_code.py and the template files */
39 
40 /* replace with or add your own generated file and edit the template test*/
41 #define CVECTOR_short_IMPLEMENTATION
42 #define CVECTOR_f_struct_IMPLEMENTATION
43 #include "cvector_short.h"
44 #include "cvector_f_struct.h"
45 
46 #else
47 
48 /* or plus cvector_macro.h which has only the macros */
49 
50 #include "cvector_macro.h"
51 
52 #define RESIZE(a) ((a+1)*2)
53 
54 CVEC_NEW_DECLS(short)
56 
57 CVEC_NEW_DEFS(short, RESIZE)
59 
60 #endif
61 /* end templates vs macros */
62 
63 #endif
64 /* end cvector.h vs cvector_all.h */
65 
66 #include <CUnit/Automated.h>
67 #include <stdio.h>
68 
69 
70 /* cvector_i tests */
72 {
73  int i;
74  cvector_i vec;
75  cvec_i(&vec, 0, 0);
76 
77  CU_ASSERT_EQUAL(CVEC_I_START_SZ, vec.capacity);
78  CU_ASSERT_EQUAL(0, vec.size);
79 
80  for (i=0; i<100; i++)
81  cvec_push_i(&vec, i);
82 
83  CU_ASSERT_EQUAL(100, vec.size);
84 
85  for (i=0; i<vec.size; i++)
86  CU_ASSERT_EQUAL(i, vec.a[i]);
87 
88  cvec_free_i(&vec);
89 }
90 
91 
93 {
94  int i,j;
95  cvector_i vec;
96  cvec_i(&vec, 100, 0);
97 
98  CU_ASSERT_EQUAL(CVEC_I_START_SZ+100, vec.capacity);
99  CU_ASSERT_EQUAL(100, vec.size);
100 
101 
102  for (i=0; i<100; i++)
103  vec.a[i] = i;
104 
105  CU_ASSERT_EQUAL(100, vec.size);
106 
107  cvec_erase_i(&vec, 25, 74);
108 
109  CU_ASSERT_EQUAL(50, vec.size);
110 
111  for (i=0,j=0; i<vec.size; i++,j++) {
112  CU_ASSERT_EQUAL(j, vec.a[i]);
113  if(i == 24) j +=50;
114  }
115 
116  cvec_free_i(&vec);
117 }
118 
119 /* zeroing is valid initialization */
121 {
122  int i;
123  cvector_i vec = { 0 };
124 
125  CU_ASSERT(vec.capacity == 0)
126  CU_ASSERT(vec.size == 0)
127  CU_ASSERT(vec.a == NULL)
128 
129  for (i=0; i<100; i++)
130  cvec_push_i(&vec, i);
131 
132  CU_ASSERT_EQUAL(100, vec.size);
133 
134  /* based on (x+1)*2 allocator macros */
135  CU_ASSERT_EQUAL(126, vec.capacity);
136 
137  for (i=0; i<vec.size; i++)
138  CU_ASSERT_EQUAL(i, vec.a[i]);
139 
140  cvec_free_i(&vec);
141 }
142 
143 
145 {
146  int array[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
147  int i;
148 
149  cvector_i vec;
150  cvec_init_i(&vec, array, 10);
151 
152  CU_ASSERT_EQUAL(vec.size, 10);
153 
154  for (i=0; i<vec.size; i++)
155  CU_ASSERT_EQUAL(vec.a[i], i);
156 
157  for (i=0; i<10; i++)
158  cvec_insert_i(&vec, 0, -i);
159 
160  CU_ASSERT_EQUAL(vec.size, 20);
161 
162  for (i=0; i<vec.size; i++)
163  CU_ASSERT_EQUAL(vec.a[i], i-((i<10)? 9 : 10) );
164 
165  cvec_free_i(&vec);
166 }
167 
169 {
170  int i;
171  int array[] = { 0, 1, 0, 1, 0, 1, 0, 1 };
172  cvector_i vec;
173  cvec_i(&vec, 0, 0);
174 
175  for (i=0; i<CVEC_I_START_SZ*2-5; ++i)
176  cvec_push_i(&vec, i);
177 
178  CU_ASSERT_EQUAL(vec.size, CVEC_I_START_SZ*2-5);
179  CU_ASSERT_EQUAL(vec.capacity, (CVEC_I_START_SZ+1)*2);
180 
181  cvec_insert_array_i(&vec, 30, array, 8);
182 
183  CU_ASSERT_EQUAL(vec.size, CVEC_I_START_SZ*2-5 + 8);
184 
185  CU_ASSERT_EQUAL(vec.capacity, (CVEC_I_START_SZ+1)*2 + 8 + CVEC_I_START_SZ);
186 
187  for (i=0; i<vec.size; ++i) {
188  if (i < 30) {
189  CU_ASSERT_EQUAL(vec.a[i], i);
190  } else if (i < 38) {
191  CU_ASSERT_EQUAL(vec.a[i], (i%2));
192  } else {
193  CU_ASSERT_EQUAL(vec.a[i], i-8);
194  }
195  }
196 
197  cvec_free_i(&vec);
198 }
199 
201 {
202  int i;
203  cvector_i vec1 = { 0 };
204  cvector_i vec2 = { 0 };
205 
206  for (i=0; i<123; i++)
207  cvec_push_i(&vec1, i);
208 
209  CU_ASSERT_EQUAL(123, vec1.size);
210 
211  cvec_copy_i(&vec2, &vec1);
212 
213  CU_ASSERT_EQUAL(123, vec2.size);
214 
215  /* This is true for now, could change. See TODO note above implementation */
216  CU_ASSERT_EQUAL(vec1.capacity, vec2.capacity);
217 
218  for (i=0; i<vec1.size; i++)
219  CU_ASSERT_EQUAL(vec1.a[i], vec2.a[i]);
220 
221  cvec_free_i(&vec1);
222  cvec_free_i(&vec2);
223 }
224 
225 
227 {
228  int i, temp;
229  cvector_i vec;
230  cvec_i(&vec, 10, 100);
231 
232  CU_ASSERT_EQUAL(vec.capacity, 100);
233  CU_ASSERT_EQUAL(vec.size, 10);
234 
235  for (i=0; i<1000; i++) {
236  cvec_push_i(&vec, i);
237  }
238  CU_ASSERT_EQUAL(vec.size, 1010);
239 
240 
241  cvec_set_cap_i(&vec, vec.size);
242  CU_ASSERT_EQUAL(vec.size, vec.capacity);
243 
244  for (i=999; i>=0; i--) {
245  temp = cvec_pop_i(&vec);
246  CU_ASSERT_EQUAL(temp, i);
247  }
248 
249  CU_ASSERT_EQUAL(vec.size, 10);
250 
251  cvec_free_i(&vec);
252 }
253 
255 {
256  int array[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
257  int ret;
258 
259  cvector_i vec;
260  cvec_init_i(&vec, array, 10);
261 
262  CU_ASSERT_EQUAL(vec.a[4], 4);
263 
264  ret = cvec_replace_i(&vec, 4, 42);
265 
266  CU_ASSERT_EQUAL(ret, 4);
267  CU_ASSERT_EQUAL(vec.a[4], 42);
268 
269  cvec_free_i(&vec);
270 }
271 
273 {
274  cvector_i* vec = cvec_i_heap(0, 0);
275 
276  CU_ASSERT_EQUAL(vec->size, 0);
277  CU_ASSERT_EQUAL(vec->capacity, CVEC_I_START_SZ);
278 
279  cvec_reserve_i(vec, 20);
280  CU_ASSERT(vec->capacity >= 20);
281 
282  cvec_free_i_heap(vec);
283 }
284 
285 
287 {
288  int i;
289  cvector_i* vec = cvec_i_heap(0, 0);
290 
291  CU_ASSERT_EQUAL(vec->size, 0);
292  CU_ASSERT_EQUAL(vec->capacity, CVEC_I_START_SZ);
293 
294  for (i=0; i<1000; i++)
295  cvec_push_i(vec, i);
296 
297  CU_ASSERT(vec->capacity >= 1000);
298  CU_ASSERT(vec->size == 1000);
299 
300  cvec_set_cap_i(vec, 500);
301 
302  CU_ASSERT(vec->capacity == 500);
303  CU_ASSERT(vec->size == 500);
304 
305  for (i=0; i<vec->size; i++)
306  CU_ASSERT_EQUAL(vec->a[i], i);
307 
308  cvec_free_i_heap(vec);
309 }
310 
311 
312 
313 
315 {
316  int i;
317  cvector_i vec;
318  cvec_i(&vec, 20, 20);
319 
320  CU_ASSERT_EQUAL(vec.size, 20);
321  CU_ASSERT_EQUAL(vec.capacity, 20);
322 
323  cvec_set_val_cap_i(&vec, 25);
324 
325  for (i=0; i<vec.capacity; i++)
326  CU_ASSERT_EQUAL(vec.a[i], 25);
327 
328  cvec_set_val_sz_i(&vec, 42);
329  for (i=0; i<vec.capacity; i++) {
330  /*macro is multiple lines/operations, hence the need for braces*/
331  if (i < vec.size) {
332  CU_ASSERT_EQUAL(vec.a[i], 42);
333  } else {
334  CU_ASSERT_EQUAL(vec.a[i], 25);
335  }
336  }
337 
338  cvec_free_i(&vec);
339 }
340 
341 
342 
343 
344 
345 /* cvector_d tests */
347 {
348  int i;
349  cvector_d vec;
350  cvec_d(&vec, 0, 1);
351 
352  CU_ASSERT_EQUAL(1, vec.capacity);
353  CU_ASSERT_EQUAL(0, vec.size);
354 
355 
356  for (i=0; i<100; i++)
357  cvec_push_d(&vec, i+0.5);
358 
359  CU_ASSERT_EQUAL(100, vec.size);
360 
361  for (i=0; i<vec.size; i++)
362  CU_ASSERT_EQUAL(i+0.5, vec.a[i]);
363 
364  cvec_free_d(&vec);
365 }
366 
367 
369 {
370  int i,j;
371  cvector_d vec;
372  cvec_d(&vec, 100, 101);
373 
374  CU_ASSERT_EQUAL(101, vec.capacity);
375  CU_ASSERT_EQUAL(100, vec.size);
376 
377  for (i=0; i<100; i++)
378  vec.a[i] = i+0.5;
379 
380  CU_ASSERT_EQUAL(100, vec.size);
381 
382  cvec_erase_d(&vec, 25, 74);
383 
384  CU_ASSERT_EQUAL(50, vec.size);
385 
386  for (i=0,j=0; i<vec.size; i++,j++) {
387  CU_ASSERT_EQUAL(j+0.5, vec.a[i]);
388  if(i==24) j +=50;
389  }
390 
391  cvec_free_d(&vec);
392 }
393 
394 /* zeroing is valid initialization */
396 {
397  int i;
398  cvector_d vec = { 0 };
399 
400  CU_ASSERT(vec.capacity == 0)
401  CU_ASSERT(vec.size == 0)
402  CU_ASSERT(vec.a == NULL)
403 
404  for (i=0; i<100; i++)
405  cvec_push_d(&vec, i+0.5);
406 
407  CU_ASSERT_EQUAL(100, vec.size);
408 
409  /* based on (x+1)*2 allocator macros */
410  CU_ASSERT_EQUAL(126, vec.capacity);
411 
412  for (i=0; i<vec.size; i++)
413  CU_ASSERT_EQUAL(i+0.5, vec.a[i]);
414 
415  cvec_free_d(&vec);
416 }
417 
419 {
420  int i;
421  double array[] = { 0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5 };
422 
423  cvector_d vec1;
424  cvec_init_d(&vec1, array, 10);
425 
426  CU_ASSERT_EQUAL(vec1.size, 10);
427  CU_ASSERT_EQUAL(vec1.capacity, 10+CVEC_D_START_SZ);
428 
429  for (i=0; i<vec1.size; i++)
430  CU_ASSERT_EQUAL(vec1.a[i], i+0.5);
431 
432  for (i=0; i<10; i++)
433  cvec_insert_d(&vec1, 0, -i-0.5);
434 
435  CU_ASSERT_EQUAL(vec1.size, 20);
436 
437  for (i=0; i<vec1.size; i++)
438  CU_ASSERT_EQUAL(vec1.a[i], i-9.5 );
439 
440  cvec_free_d(&vec1);
441 }
442 
443 
445 {
446  int i;
447  double array[] = { 0, 1, 0, 1, 0, 1 };
448  cvector_d vec;
449  cvec_d(&vec, 0, 0);
450 
451  for (i=0; i<CVEC_D_START_SZ*2-5; ++i)
452  cvec_push_d(&vec, i);
453 
454  CU_ASSERT_EQUAL(vec.size, CVEC_D_START_SZ*2-5);
455 
456  cvec_insert_array_d(&vec, 30, array, 6);
457 
458  CU_ASSERT_EQUAL(vec.size, CVEC_D_START_SZ*2+1);
459 
460  for (i=0; i<vec.size; ++i) {
461  if (i < 30) {
462  CU_ASSERT_EQUAL(vec.a[i], i);
463  } else if (i < 36) {
464  CU_ASSERT_EQUAL(vec.a[i], (i%2));
465  } else {
466  CU_ASSERT_EQUAL(vec.a[i], i-6);
467  }
468  }
469 
470  cvec_free_d(&vec);
471 }
472 
474 {
475  int i;
476  cvector_d vec1 = { 0 };
477  cvector_d vec2 = { 0 };
478 
479  for (i=0; i<123; i++)
480  cvec_push_d(&vec1, i+0.5);
481 
482  CU_ASSERT_EQUAL(123, vec1.size);
483 
484  cvec_copy_d(&vec2, &vec1);
485 
486  CU_ASSERT_EQUAL(123, vec2.size);
487 
488  /* This is true for now, could change. See TODO note above implementation */
489  CU_ASSERT_EQUAL(vec1.capacity, vec2.capacity);
490 
491  for (i=0; i<vec1.size; i++)
492  CU_ASSERT_EQUAL(vec1.a[i], vec2.a[i]);
493 
494  cvec_free_d(&vec1);
495  cvec_free_d(&vec2);
496 }
497 
499 {
500  int i;
501  double temp;
502  cvector_d vec1;
503  cvec_d(&vec1, 0, 0);
504 
505  CU_ASSERT_EQUAL(vec1.capacity, CVEC_D_START_SZ);
506  CU_ASSERT_EQUAL(vec1.size, 0);
507 
508  for (i=0; i<1000; i++)
509  cvec_push_d(&vec1, i);
510 
511  CU_ASSERT_EQUAL(vec1.size, 1000);
512 
513  cvec_set_cap_d(&vec1, vec1.size);
514  CU_ASSERT_EQUAL(vec1.size, vec1.capacity);
515 
516  for (i=999; i>=0; i--) {
517  temp = cvec_pop_d(&vec1);
518  CU_ASSERT_EQUAL(temp, i);
519  }
520 
521  CU_ASSERT_EQUAL(vec1.size, 0);
522 
523  cvec_free_d(&vec1);
524 }
525 
527 {
528  double array[] = { 0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5 };
529  double ret;
530 
531  cvector_d vec;
532  cvec_init_d(&vec, array, 10);
533 
534  CU_ASSERT_EQUAL(vec.a[4], 4.5);
535 
536  ret = cvec_replace_d(&vec, 4, 42);
537 
538  CU_ASSERT_EQUAL(ret, 4.5);
539  CU_ASSERT_EQUAL(vec.a[4], 42);
540 
541  cvec_free_d(&vec);
542 }
543 
545 {
546  cvector_d* vec = cvec_d_heap(0, 0);
547 
548  cvec_reserve_d(vec, 20);
549  CU_ASSERT(vec->capacity >= 20);
550 
551  cvec_free_d_heap(vec);
552 }
553 
554 
555 
557 {
558  int i;
559  cvector_d vec1;
560  cvec_d(&vec1, 0, 10);
561 
562  CU_ASSERT_EQUAL(vec1.capacity, 10);
563 
564  for (i=0; i<1000; i++)
565  cvec_push_d(&vec1, i+0.5);
566 
567  CU_ASSERT(vec1.capacity >= 1000);
568  CU_ASSERT(vec1.size == 1000);
569 
570  cvec_set_cap_d(&vec1, 500);
571 
572  CU_ASSERT(vec1.capacity == 500);
573  CU_ASSERT(vec1.size == 500);
574 
575  for (i=0; i<vec1.size; i++)
576  CU_ASSERT_EQUAL(vec1.a[i], i+0.5);
577 
578  cvec_free_d(&vec1);
579 }
580 
581 
582 
584 {
585  int i;
586  cvector_d* vec = cvec_d_heap(20, 20);
587 
588  CU_ASSERT_EQUAL(vec->capacity, 20);
589 
590  cvec_set_val_sz_d(vec, 42.5);
591  for (i=0; i<vec->size; i++)
592  CU_ASSERT_EQUAL(vec->a[i], 42.5);
593 
594  cvec_set_val_cap_d(vec, 25.5);
595 
596  for (i=0; i<vec->capacity; i++)
597  CU_ASSERT_EQUAL(vec->a[i], 25.5);
598 
599  cvec_free_d_heap(vec);
600 }
601 
602 
603 
604 
605 
606 
607 /* cvector_str tests */
609 {
610  int i;
611  char buffer[50];
612  cvector_str* vec = cvec_str_heap(0, 0);
613 
614  CU_ASSERT_EQUAL(CVEC_STR_START_SZ, vec->capacity);
615  CU_ASSERT_EQUAL(0, vec->size);
616 
617  for (i=0; i<50; i++) {
618  sprintf(buffer, "hello %d", i);
619  cvec_push_str(vec, buffer);
620  }
621 
622  CU_ASSERT_EQUAL(50, vec->size);
623 
624  for (i=0; i<vec->size; i++) {
625  sprintf(buffer, "hello %d", i);
626  CU_ASSERT_STRING_EQUAL(vec->a[i], buffer);
627  }
628 
629 
630  cvec_free_str_heap(vec);
631 }
632 
633 
635 {
636  int i,j;
637  char buffer[50];
638  cvector_str vec1;
639  cvec_str(&vec1, 0, 0);
640 
641  CU_ASSERT_EQUAL(CVEC_STR_START_SZ, vec1.capacity);
642 
643  for (i=0; i<100; i++) {
644  sprintf(buffer, "hello %d", i);
645  cvec_push_str(&vec1, buffer);
646  }
647 
648  CU_ASSERT_EQUAL(100, vec1.size);
649 
650  cvec_erase_str(&vec1, 25, 74);
651 
652  CU_ASSERT_EQUAL(50, vec1.size);
653 
654  for (i=0,j=0; i<vec1.size; i++,j++) {
655  sprintf(buffer, "hello %d", j);
656  CU_ASSERT_STRING_EQUAL(vec1.a[i], buffer);
657 
658  if(i==24) j +=50;
659  }
660 
661  cvec_free_str(&vec1);
662 
663 }
664 
666 {
667  int i,j;
668  char buffer[50];
669  char* strs[100];
670  cvector_str vec1;
671  cvec_str(&vec1, 0, 0);
672 
673  for (i=0; i<100; i++) {
674  sprintf(buffer, "hello %d", i);
675  cvec_push_str(&vec1, buffer);
676  }
677 
678  CU_ASSERT_EQUAL(100, vec1.size);
679 
680  for (i=25; i<75; ++i)
681  strs[i] = vec1.a[i];
682 
683  cvec_remove_str(&vec1, 25, 74);
684 
685  CU_ASSERT_EQUAL(50, vec1.size);
686 
687  for (i=0,j=0; i<vec1.size; i++,j++) {
688  sprintf(buffer, "hello %d", j);
689  CU_ASSERT_STRING_EQUAL(vec1.a[i], buffer);
690 
691  if(i==24) j +=50;
692  }
693  for (i=25; i<75; ++i) {
694  sprintf(buffer, "hello %d", i);
695  CU_ASSERT_STRING_EQUAL(strs[i], buffer);
696  free(strs[i]);
697  }
698 
699  cvec_free_str(&vec1);
700 
701 }
702 
703 /* zeroing is valid initialization */
705 {
706  int i;
707  char buffer[50];
708  cvector_str vec = { 0 };
709 
710  CU_ASSERT(vec.capacity == 0)
711  CU_ASSERT(vec.size == 0)
712  CU_ASSERT(vec.a == NULL)
713 
714  for (i=0; i<50; i++) {
715  sprintf(buffer, "hello %d", i);
716  cvec_push_str(&vec, buffer);
717  }
718 
719  CU_ASSERT_EQUAL(50, vec.size);
720 
721  /* based on (x+1)*2 allocator macros */
722  CU_ASSERT_EQUAL(62, vec.capacity);
723 
724  for (i=0; i<vec.size; i++) {
725  sprintf(buffer, "hello %d", i);
726  CU_ASSERT_STRING_EQUAL(vec.a[i], buffer);
727  }
728 
729  cvec_free_str(&vec);
730 }
731 
732 
734 {
735  char* array[] = { "hello 0", "hello 1", "hello 2", "hello 3", "hello 4",
736  "hello 5", "hello 6", "hello 7", "hello 8", "hello 9" };
737 
738  char buffer[50];
739  int i;
740 
741  cvector_str* vec = cvec_init_str_heap(array, 10);
742 
743  CU_ASSERT_EQUAL(vec->size, 10);
744 
745  for (i=0; i<vec->size; i++) {
746  sprintf(buffer, "hello %d", i);
747  CU_ASSERT_STRING_EQUAL(vec->a[i], buffer);
748  }
749 
750  for (i=0; i<10; i++) {
751  sprintf(buffer, "hello %d", -i);
752  cvec_insert_str(vec, 0, buffer);
753  }
754 
755 
756  CU_ASSERT_EQUAL(vec->size, 20);
757 
758  for (i=0; i<vec->size; i++) {
759  sprintf(buffer, "hello %d", i-((i<10)? 9 : 10));
760  CU_ASSERT_STRING_EQUAL(vec->a[i], buffer);
761  }
762 
763  cvec_free_str_heap(vec);
764 }
765 
766 
768 {
769  int i;
770  char buffer[50];
771  char* array[] = { "hello 0", "hello 1", "hello 2", "hello 3", "hello 4",
772  "hello 5", "hello 6", "hello 7", "hello 8", "hello 9", "hello 10" };
773  cvector_str vec;
774  cvec_init_str(&vec, array, 10);
775 
776  CU_ASSERT_EQUAL(vec.size, 10);
777  CU_ASSERT_EQUAL(vec.capacity, 10+CVEC_STR_START_SZ);
778 
779  cvec_insert_array_str(&vec, 0, array, 11);
780 
781  CU_ASSERT_EQUAL(vec.size, 21);
782  CU_ASSERT_EQUAL(vec.capacity, 10+CVEC_STR_START_SZ);
783 
784  for (i=0; i<vec.size; ++i) {
785  if (i < 11) {
786  sprintf(buffer, "hello %d", i);
787  CU_ASSERT_STRING_EQUAL(vec.a[i], buffer);
788  }
789  else {
790  sprintf(buffer, "hello %d", i-11);
791  CU_ASSERT_STRING_EQUAL(vec.a[i], buffer);
792  }
793  }
794 
795  cvec_free_str(&vec);
796 }
797 
798 
800 {
801  int i;
802  cvector_str vec1 = { 0 };
803  cvector_str vec2 = { 0 };
804  char buffer[50];
805 
806  for (i=0; i<123; i++) {
807  sprintf(buffer, "hello %d", i);
808  cvec_push_str(&vec1, buffer);
809  }
810 
811  CU_ASSERT_EQUAL(123, vec1.size);
812 
813  cvec_copy_str(&vec2, &vec1);
814 
815  CU_ASSERT_EQUAL(123, vec2.size);
816 
817  /* This is true for now, could change. See TODO note above implementation */
818  CU_ASSERT_EQUAL(vec1.capacity, vec2.capacity);
819 
820  for (i=0; i<vec1.size; i++) {
821  CU_ASSERT_STRING_EQUAL(vec1.a[i], vec2.a[i]);
822  }
823 
824  cvec_free_str(&vec1);
825  cvec_free_str(&vec2);
826 }
827 
828 
829 
831 {
832  int i;
833  char buffer[50];
834  char buffer2[50];
835 
836  cvector_str vec1;
837  cvec_str(&vec1, 0, 10);
838 
839  CU_ASSERT_EQUAL(vec1.capacity, 10);
840 
841  cvec_push_str(&vec1, "whatever");
842  CU_ASSERT_EQUAL(vec1.size, 1);
843  cvec_pop_str(&vec1, NULL);
844  CU_ASSERT_EQUAL(vec1.size, 0);
845 
846  for (i=0; i<1000; i++) {
847  sprintf(buffer, "hello %d", i);
848  cvec_push_str(&vec1, buffer);
849  }
850 
851  CU_ASSERT_EQUAL(vec1.size, 1000);
852 
853  cvec_set_cap_str(&vec1, vec1.size);
854  CU_ASSERT_EQUAL(vec1.size, vec1.capacity);
855 
856  for (i=999; i>=0; i--) {
857  sprintf(buffer, "hello %d", i);
858  cvec_pop_str(&vec1, buffer2);
859  CU_ASSERT_STRING_EQUAL(buffer, buffer2);
860  }
861 
862  CU_ASSERT_EQUAL(vec1.size, 0);
863 
864  cvec_free_str(&vec1);
865 }
866 
868 {
869  int i, loc, to_replace[] = { 0, 125, 256 };
870  char buffer[50];
871  char buffer2[50];
872  char retbuf[50];
873 
874  cvector_str vec;
875  cvec_str(&vec, 0, 10);
876 
877  CU_ASSERT_EQUAL(vec.capacity, 10);
878 
879  for (i=0; i<1000; i++) {
880  sprintf(buffer, "hello %d", i);
881  cvec_push_str(&vec, buffer);
882  }
883 
884  for (i=0; i<sizeof(to_replace)/sizeof(int); i++) {
885  loc = to_replace[i];
886  sprintf(buffer, "hello %d", loc);
887  sprintf(buffer2, "goodbye %d", loc);
888  CU_ASSERT_STRING_EQUAL(vec.a[loc], buffer);
889 
890  cvec_replace_str(&vec, loc, buffer2, retbuf);
891  CU_ASSERT_STRING_EQUAL(vec.a[loc], buffer2);
892  CU_ASSERT_STRING_EQUAL(retbuf, buffer);
893  }
894  cvec_free_str(&vec);
895 }
896 
898 {
899  cvector_str vec;
900  cvec_str(&vec, 0, 100);
901 
902  cvec_reserve_str(&vec, 20);
903  CU_ASSERT(vec.capacity >= 20);
904 
905  cvec_free_str(&vec);
906 }
907 
908 
909 
911 {
912  int i;
913  char buffer[50];
914 
915  cvector_str vec;
916  cvec_str(&vec, 1, 1);
917 
918  CU_ASSERT_EQUAL(vec.size, 1);
919  CU_ASSERT_EQUAL(vec.capacity, 1);
920 
921  for (i=0; i<1000; i++) {
922  sprintf(buffer, "hello %d", i);
923  cvec_push_str(&vec, buffer);
924  }
925 
926  CU_ASSERT(vec.capacity >= 1001);
927  CU_ASSERT(vec.size == 1001);
928 
929  cvec_set_cap_str(&vec, 500);
930 
931  CU_ASSERT(vec.capacity == 500);
932  CU_ASSERT(vec.size == 500);
933 
934  for (i=0; i<vec.size; i++) {
935  sprintf(buffer, "hello %d", i-1);
936  if (i) {
937  CU_ASSERT_STRING_EQUAL(vec.a[i], buffer);
938  } else {
939  CU_ASSERT_EQUAL(vec.a[i], NULL);
940  }
941  }
942 
943  cvec_free_str(&vec);
944 }
945 
946 
948 {
949  int i;
950  cvector_str vec;
951  cvec_str(&vec, 20, 0);
952 
953  CU_ASSERT_EQUAL(vec.size, 20)
954  CU_ASSERT_EQUAL(vec.capacity, 20+CVEC_STR_START_SZ);
955 
956  cvec_set_val_sz_str(&vec, "42");
957 
958  for (i=0; i<vec.size; i++)
959  CU_ASSERT_STRING_EQUAL(vec.a[i], "42");
960 
961  cvec_set_val_cap_str(&vec, "25");
962 
963  for (i=0; i<vec.capacity; i++)
964  CU_ASSERT_STRING_EQUAL(vec.a[i], "25");
965 
966  cvec_free_str(&vec);
967 }
968 
970 {
971  int i, j;
972  char* ret;
973  char buffer[50];
974  char* strs[] = {
975  "one", "two", "three",
976  "four", "five", "six",
977  "seven", "eight", "nine",
978  "ten"
979  };
980 
981  cvector_str vec1;
982  cvec_str(&vec1, 0, 10);
983 
984  cvec_pushm_str(&vec1, CVEC_STRDUP("whatever"));
985  CU_ASSERT_EQUAL(vec1.size, 1);
986  cvec_pop_str(&vec1, NULL);
987  CU_ASSERT_EQUAL(vec1.size, 0);
988 
989  for (i=0; i<1000; i++) {
990  sprintf(buffer, "hello %d", i);
991  cvec_pushm_str(&vec1, CVEC_STRDUP(buffer));
992  }
993 
994  CU_ASSERT_EQUAL(vec1.size, 1000);
995 
996  for (i=999; i>=0; i--) {
997  sprintf(buffer, "hello %d", i);
998  ret = cvec_popm_str(vec1);
999  CU_ASSERT_STRING_EQUAL(buffer, ret);
1000  free(ret);
1001  }
1002 
1003  CU_ASSERT_EQUAL(vec1.size, 0);
1004 
1005  for (i=0; i<100; i++) {
1006  sprintf(buffer, "hello %d", i);
1007  cvec_push_str(&vec1, buffer);
1008  }
1009  cvec_insertm_str(&vec1, 50, CVEC_STRDUP("hello insertm"));
1010  cvec_replacem_str(vec1, 25, CVEC_STRDUP("hello replacem"), ret);
1011 
1012  CU_ASSERT_STRING_EQUAL(ret, "hello 25");
1013  free(ret);
1014 
1015  CU_ASSERT_EQUAL(vec1.size, 101);
1016 
1017  j = 0;
1018  for (i=0; i<101; i++) {
1019  if (i == 25) {
1020  CU_ASSERT_STRING_EQUAL(vec1.a[i], "hello replacem");
1021  } else if (i == 50) {
1022  CU_ASSERT_STRING_EQUAL(vec1.a[i], "hello insertm");
1023  j++;
1024  } else {
1025  sprintf(buffer, "hello %d", i-j);
1026  CU_ASSERT_STRING_EQUAL(vec1.a[i], buffer);
1027  }
1028  }
1029 
1030  cvec_insert_arraym_str(&vec1, 60, strs, 10);
1031  CU_ASSERT_EQUAL(vec1.size, 111);
1032 
1033  for (i=0; i<10; ++i) {
1034  CU_ASSERT_STRING_EQUAL(vec1.a[60+i], strs[i]);
1035  }
1036  cvec_remove_str(&vec1, 60, 69);
1037 
1038  CU_ASSERT_EQUAL(vec1.size, 101);
1039 
1040  cvec_free_str(&vec1);
1041 }
1042 
1043 
1044 
1045 
1046 
1047 /* vector tests */
1048 
1049 t_struct mk_t_struct(double d, int i, char* word)
1050 {
1051  /*could make this static since I'm just copying the values outside */
1052  t_struct a;
1053  a.d = d;
1054  a.i = i;
1055  strcpy(a.word, word);
1056  return a;
1057 }
1058 
1059 f_struct mk_f_struct(double d, int i, char* word)
1060 {
1061  /*could make this static since I'm just copying the values outside */
1062  f_struct a;
1063  a.d = d;
1064  a.i = i;
1065  a.word = CVEC_STRDUP(word);
1066  return a;
1067 }
1068 
1069 f_struct set_f_struct(double d, int i, char* word)
1070 {
1071  /*could make this static since I'm just copying the values outside */
1072  f_struct a;
1073  a.d = d;
1074  a.i = i;
1075  a.word = word;
1076  return a;
1077 }
1078 
1079 
1080 #define GET_T(X,Y) ((t_struct*)&X.a[Y*X.elem_size])
1081 #define GET_F(X,Y) ((f_struct*)&X.a[Y*X.elem_size])
1082 
1083 #define GET_TP(X,Y) ((t_struct*)&X->a[Y*X->elem_size])
1084 #define GET_FP(X,Y) ((f_struct*)&X->a[Y*X->elem_size])
1085 
1086 void free_f_struct(void* tmp)
1087 {
1088  f_struct* f = (f_struct*)tmp;
1089  free(f->word);
1090  f->word = NULL;
1091 }
1092 
1093 
1094 int init_f_struct(void* dest, void* src)
1095 {
1096  f_struct* d = (f_struct*)dest;
1097  f_struct* s = (f_struct*)src;
1098  d->i = s->i;
1099  d->d = s->d;
1100  d->word = CVEC_STRDUP(s->word);
1101 
1102  return d->word != NULL;
1103 }
1104 
1105 
1106 
1108 {
1109  char buffer[50];
1110  int i;
1111  t_struct temp;
1112  f_struct temp2;
1113 
1114  cvector_void vec1;
1115  cvector_void vec2;
1116 
1117  cvec_void(&vec1, 0, 0, sizeof(t_struct), NULL, NULL);
1118  cvec_void(&vec2, 0, 1, sizeof(f_struct), free_f_struct, NULL);
1119 
1120  CU_ASSERT_EQUAL(CVEC_VOID_START_SZ, vec1.capacity);
1121  CU_ASSERT_EQUAL(0, vec1.size);
1122 
1123  CU_ASSERT_EQUAL(1, vec2.capacity);
1124  CU_ASSERT_EQUAL(0, vec2.size);
1125 
1126  for (i=0; i<100; i++) {
1127  sprintf(buffer, "%d", i);
1128  temp = mk_t_struct(i, i, buffer);
1129  temp2 = mk_f_struct(i, i, buffer);
1130 
1131  cvec_push_void(&vec1, &temp);
1132  cvec_push_void(&vec2, &temp2);
1133  }
1134 
1135  CU_ASSERT_EQUAL(100, vec1.size);
1136  CU_ASSERT_EQUAL(100, vec2.size);
1137 
1138 
1139  for (i=0; i<vec1.size; i++) {
1140 
1141  sprintf(buffer, "%d", i);
1142  CU_ASSERT_EQUAL(i, GET_T(vec1, i)->d);
1143  CU_ASSERT_EQUAL(i, GET_T(vec1, i)->i);
1144  CU_ASSERT_STRING_EQUAL(buffer, GET_T(vec1, i)->word);
1145 
1146  CU_ASSERT_EQUAL(i, GET_F(vec2, i)->d);
1147  CU_ASSERT_EQUAL(i, GET_F(vec2, i)->i);
1148  CU_ASSERT_STRING_EQUAL(buffer, GET_F(vec2, i)->word);
1149  }
1150 
1151  cvec_free_void(&vec1);
1152  cvec_free_void(&vec2);
1153 }
1154 
1155 
1157 {
1158  char buffer[50];
1159  int i,j;
1160 
1161  cvector_void* vec1 = cvec_void_heap(100, 101, sizeof(t_struct), NULL, NULL);
1162  cvector_void* vec2 = cvec_void_heap(100, 0, sizeof(f_struct), free_f_struct, NULL);
1163 
1164  CU_ASSERT_EQUAL(101, vec1->capacity);
1165  CU_ASSERT_EQUAL(100, vec1->size);
1166 
1167  CU_ASSERT_EQUAL(CVEC_VOID_START_SZ+100, vec2->capacity);
1168  CU_ASSERT_EQUAL(100, vec2->size);
1169 
1170  for (i=0; i<100; i++) {
1171  sprintf(buffer, "%d", i);
1172 
1173  GET_TP(vec1, i)->d = i+0.5;
1174  GET_TP(vec1, i)->i = i;
1175  strcpy(GET_TP(vec1, i)->word, buffer);
1176 
1177  GET_FP(vec2, i)->d = i+0.5;
1178  GET_FP(vec2, i)->i = i;
1179  GET_FP(vec2, i)->word = CVEC_STRDUP(buffer);
1180  }
1181 
1182  CU_ASSERT_EQUAL(100, vec1->size);
1183  CU_ASSERT_EQUAL(100, vec2->size);
1184 
1185  cvec_erase_void(vec1, 25, 74);
1186  cvec_erase_void(vec2, 25, 74);
1187 
1188  CU_ASSERT_EQUAL(50, vec1->size);
1189  CU_ASSERT_EQUAL(50, vec2->size);
1190 
1191  for (i=0,j=0; i<vec1->size; i++,j++) {
1192  sprintf(buffer, "%d", j);
1193  CU_ASSERT_EQUAL(GET_TP(vec1, i)->d, j+0.5);
1194  CU_ASSERT_EQUAL(GET_TP(vec1, i)->i, j);
1195  CU_ASSERT_STRING_EQUAL(GET_TP(vec1, i)->word, buffer);
1196 
1197  CU_ASSERT_EQUAL(GET_FP(vec2, i)->d, j+0.5);
1198  CU_ASSERT_EQUAL(GET_FP(vec2, i)->i, j);
1199  CU_ASSERT_STRING_EQUAL(GET_FP(vec2, i)->word, buffer);
1200 
1201  if(i==24) j +=50;
1202  }
1203 
1204  cvec_free_void_heap(vec1);
1205  cvec_free_void_heap(vec2);
1206 }
1207 
1209 {
1210  char buffer[50];
1211  char* strs[100];
1212  int i,j;
1213 
1214  cvector_void* vec2 = cvec_void_heap(100, 0, sizeof(f_struct), free_f_struct, NULL);
1215 
1216  CU_ASSERT_EQUAL(CVEC_VOID_START_SZ+100, vec2->capacity);
1217  CU_ASSERT_EQUAL(100, vec2->size);
1218 
1219  for (i=0; i<100; i++) {
1220  sprintf(buffer, "%d", i);
1221 
1222  GET_FP(vec2, i)->d = i+0.5;
1223  GET_FP(vec2, i)->i = i;
1224  GET_FP(vec2, i)->word = CVEC_STRDUP(buffer);
1225  }
1226 
1227  CU_ASSERT_EQUAL(100, vec2->size);
1228 
1229  for (i=25; i<75; i++)
1230  strs[i] = GET_FP(vec2, i)->word;
1231 
1232  cvec_remove_void(vec2, 25, 74);
1233 
1234  CU_ASSERT_EQUAL(50, vec2->size);
1235 
1236  for (i=0,j=0; i<vec2->size; i++,j++) {
1237  sprintf(buffer, "%d", j);
1238 
1239  CU_ASSERT_EQUAL(GET_FP(vec2, i)->d, j+0.5);
1240  CU_ASSERT_EQUAL(GET_FP(vec2, i)->i, j);
1241  CU_ASSERT_STRING_EQUAL(GET_FP(vec2, i)->word, buffer);
1242 
1243  if(i==24) j +=50;
1244  }
1245 
1246  cvec_free_void_heap(vec2);
1247 
1248  for (i=25; i<75; ++i) {
1249  sprintf(buffer, "%d", i);
1250  CU_ASSERT_STRING_EQUAL(strs[i], buffer);
1251  free(strs[i]);
1252  }
1253 
1254 }
1255 
1256 
1258 {
1259  t_struct array[10];
1260  f_struct array2[10];
1261  int i;
1262  char buffer[50];
1263 
1264  cvector_void vec1, vec2;
1265 
1266  t_struct temp;
1267  f_struct temp2;
1268 
1269  for (i=0; i<10; i++) {
1270  sprintf(buffer, "hello %d", i);
1271  array[i].d = i+0.5;
1272  array[i].i = i;
1273  strcpy(array[i].word, buffer);
1274 
1275  array2[i].d = i+0.5;
1276  array2[i].i = i;
1277  array2[i].word = CVEC_STRDUP(buffer);
1278  }
1279 
1280 
1281  cvec_init_void(&vec1, array, 10, sizeof(t_struct), NULL, NULL);
1282  cvec_init_void(&vec2, array2, 10, sizeof(f_struct), free_f_struct, NULL);
1283 
1284 
1285  CU_ASSERT_EQUAL(vec1.size, 10);
1286  CU_ASSERT_EQUAL(vec2.size, 10);
1287 
1288 
1289  for (i=0; i<vec1.size; i++) {
1290  sprintf(buffer, "hello %d", i);
1291  CU_ASSERT_EQUAL(GET_T(vec1, i)->d, i+0.5);
1292  CU_ASSERT_EQUAL(GET_T(vec1, i)->i, i);
1293  CU_ASSERT_STRING_EQUAL(GET_T(vec1, i)->word, buffer);
1294 
1295  CU_ASSERT_EQUAL(GET_F(vec2, i)->d, i+0.5);
1296  CU_ASSERT_EQUAL(GET_F(vec2, i)->i, i);
1297  CU_ASSERT_STRING_EQUAL(GET_F(vec2, i)->word, buffer);
1298  }
1299 
1300  for (i=0; i<10; i++) {
1301  sprintf(buffer, "hello %d", -i);
1302  temp = mk_t_struct(-i-0.5, -i, buffer);
1303  temp2 = mk_f_struct(-i-0.5, -i, buffer);
1304 
1305  cvec_insert_void(&vec1, 0, &temp);
1306  cvec_insert_void(&vec2, 0, &temp2);
1307  }
1308 
1309  CU_ASSERT_EQUAL(vec1.size, 20);
1310  CU_ASSERT_EQUAL(vec2.size, 20);
1311 
1312 
1313  for (i=0; i<vec1.size; i++) {
1314  sprintf(buffer, "hello %d", i-((i<10)? 9 : 10));
1315 
1316  CU_ASSERT_EQUAL(GET_T(vec1, i)->d, i-0.5-9 );
1317  CU_ASSERT_EQUAL(GET_T(vec1, i)->i, i-((i<10)? 9 : 10) );
1318  CU_ASSERT_STRING_EQUAL(GET_T(vec1, i)->word, buffer);
1319 
1320  CU_ASSERT_EQUAL(GET_F(vec2, i)->d, i-0.5-9 );
1321  CU_ASSERT_EQUAL(GET_F(vec2, i)->i, i-((i<10)? 9 : 10) );
1322  CU_ASSERT_STRING_EQUAL(GET_F(vec2, i)->word, buffer);
1323 
1324  }
1325 
1326  cvec_free_void(&vec1);
1327  cvec_free_void(&vec2);
1328 }
1329 
1330 
1332 {
1333  int i;
1334  float array1[] = { 0.5f, 1.5f, 7.5f, 8.5f, 9.5f };
1335  float array2[] = { 2.5f, 3.5f, 4.5f, 5.5f, 6.5f };
1336  cvector_void vec1;
1337 
1338  cvec_init_void(&vec1, array1, 5, sizeof(float), NULL, NULL);
1339  cvec_insert_array_void(&vec1, 2, array2, 5);
1340  CU_ASSERT_EQUAL(vec1.size, 10);
1341 
1342  for (i=0; i<vec1.size; ++i)
1343  CU_ASSERT_EQUAL(((float*)vec1.a)[i], i+0.5f);
1344 
1345  cvec_free_void(&vec1);
1346 }
1347 
1348 
1349 /* zeroing size, capacity, and a is valid initialization,
1350  * you still need to set elem_size and optionally elem_init/elem_free */
1352 {
1353  char buffer[50];
1354  int i;
1355  t_struct temp;
1356  f_struct temp2;
1357 
1358  cvector_void vec1 = { 0, 0, 0, sizeof(t_struct) };
1359  cvector_void vec2 = { 0, 0, 0, sizeof(f_struct), free_f_struct };
1360 
1361  CU_ASSERT(vec1.capacity == 0)
1362  CU_ASSERT(vec1.size == 0)
1363  CU_ASSERT(vec1.a == NULL)
1364  CU_ASSERT(vec2.capacity == 0)
1365  CU_ASSERT(vec2.size == 0)
1366  CU_ASSERT(vec2.a == NULL)
1367 
1368  for (i=0; i<100; i++) {
1369  sprintf(buffer, "%d", i);
1370  temp = mk_t_struct(i, i, buffer);
1371  temp2 = mk_f_struct(i, i, buffer);
1372 
1373  cvec_push_void(&vec1, &temp);
1374  cvec_push_void(&vec2, &temp2);
1375  }
1376 
1377  /* based on (x+1)*2 allocator macros */
1378  CU_ASSERT_EQUAL(126, vec1.capacity);
1379  CU_ASSERT_EQUAL(126, vec2.capacity);
1380 
1381  for (i=0; i<vec1.size; i++) {
1382 
1383  sprintf(buffer, "%d", i);
1384  CU_ASSERT_EQUAL(i, GET_T(vec1, i)->d);
1385  CU_ASSERT_EQUAL(i, GET_T(vec1, i)->i);
1386  CU_ASSERT_STRING_EQUAL(buffer, GET_T(vec1, i)->word);
1387 
1388  CU_ASSERT_EQUAL(i, GET_F(vec2, i)->d);
1389  CU_ASSERT_EQUAL(i, GET_F(vec2, i)->i);
1390  CU_ASSERT_STRING_EQUAL(buffer, GET_F(vec2, i)->word);
1391  }
1392 
1393  cvec_free_void(&vec1);
1394  cvec_free_void(&vec2);
1395 }
1396 
1397 
1399 {
1400  char buffer[50];
1401  int i;
1402  t_struct temp;
1403  f_struct temp2;
1404 
1405  cvector_void vec1;
1406  cvector_void vec2;
1407  cvector_void vec3 = { 0 };
1408  cvector_void vec4 = { 0 };
1409 
1410  cvec_void(&vec1, 0, 0, sizeof(t_struct), NULL, NULL);
1411  cvec_void(&vec2, 0, 1, sizeof(f_struct), free_f_struct, init_f_struct);
1412 
1413  CU_ASSERT_EQUAL(CVEC_VOID_START_SZ, vec1.capacity);
1414  CU_ASSERT_EQUAL(0, vec1.size);
1415 
1416  CU_ASSERT_EQUAL(1, vec2.capacity);
1417  CU_ASSERT_EQUAL(0, vec2.size);
1418 
1419  for (i=0; i<100; i++) {
1420  sprintf(buffer, "%d", i);
1421  temp = mk_t_struct(i, i, buffer);
1422  temp2 = set_f_struct(i, i, buffer);
1423 
1424  cvec_push_void(&vec1, &temp);
1425  cvec_push_void(&vec2, &temp2);
1426  }
1427 
1428  CU_ASSERT_EQUAL(100, vec1.size);
1429  CU_ASSERT_EQUAL(100, vec2.size);
1430 
1431  cvec_copy_void(&vec3, &vec1);
1432  cvec_copy_void(&vec4, &vec2);
1433 
1434  CU_ASSERT_EQUAL(vec3.size, vec1.size);
1435  CU_ASSERT_EQUAL(vec4.size, vec2.size);
1436 
1437  /* This is true for now, could change. See TODO note above implementation */
1438  CU_ASSERT_EQUAL(vec3.capacity, vec1.capacity);
1439  CU_ASSERT_EQUAL(vec4.capacity, vec2.capacity);
1440 
1441  CU_ASSERT_EQUAL(vec3.elem_size, vec1.elem_size);
1442  CU_ASSERT_EQUAL(vec4.elem_size, vec2.elem_size);
1443 
1444  CU_ASSERT_EQUAL(vec3.elem_free, vec1.elem_free);
1445  CU_ASSERT_EQUAL(vec4.elem_free, vec2.elem_free);
1446 
1447  CU_ASSERT_EQUAL(vec3.elem_init, vec1.elem_init);
1448  CU_ASSERT_EQUAL(vec4.elem_init, vec2.elem_init);
1449 
1450  for (i=0; i<vec1.size; i++) {
1451 
1452  CU_ASSERT_EQUAL(GET_T(vec3, i)->d, GET_T(vec1, i)->d);
1453  CU_ASSERT_EQUAL(GET_T(vec3, i)->i, GET_T(vec1, i)->i);
1454  CU_ASSERT_STRING_EQUAL(GET_T(vec3, i)->word, GET_T(vec1, i)->word);
1455 
1456  CU_ASSERT_EQUAL(GET_F(vec4, i)->d, GET_F(vec2, i)->d);
1457  CU_ASSERT_EQUAL(GET_F(vec4, i)->i, GET_F(vec2, i)->i);
1458  CU_ASSERT_STRING_EQUAL(GET_F(vec4, i)->word, GET_F(vec2, i)->word);
1459  }
1460 
1461  cvec_free_void(&vec1);
1462  cvec_free_void(&vec2);
1463  cvec_free_void(&vec3);
1464  cvec_free_void(&vec4);
1465 }
1466 
1467 
1468 
1470 {
1471  char buffer[50];
1472  int i;
1473  t_struct temp;
1474  f_struct temp2;
1475 
1476  cvector_void vec1, vec2;
1477 
1478  cvec_void(&vec1, 10, 0, sizeof(t_struct), NULL, NULL);
1479  cvec_void(&vec2, 10, 0, sizeof(f_struct), free_f_struct, NULL);
1480 
1481  CU_ASSERT_EQUAL(vec1.capacity, 10+CVEC_VOID_START_SZ);
1482  CU_ASSERT_EQUAL(vec2.capacity, 10+CVEC_VOID_START_SZ);
1483 
1484  for (i=0; i<vec2.size; ++i)
1485  GET_F(vec2, i)->word = CVEC_STRDUP("hello");
1486 
1487 
1488  strcpy(buffer, "test_pop_null");
1489  temp = mk_t_struct(i, i, buffer);
1490  temp2 = mk_f_struct(i, i, buffer);
1491 
1492  cvec_push_void(&vec1, &temp);
1493  cvec_push_void(&vec2, &temp2);
1494  CU_ASSERT_EQUAL(vec1.size, 11);
1495  CU_ASSERT_EQUAL(vec2.size, 11);
1496  cvec_pop_void(&vec1, NULL);
1497  cvec_pop_void(&vec2, NULL);
1498  CU_ASSERT_EQUAL(vec1.size, 10);
1499  CU_ASSERT_EQUAL(vec2.size, 10);
1500 
1501 
1502  for (i=0; i<1000; i++) {
1503  sprintf(buffer, "hello %d", i);
1504  temp = mk_t_struct(i, i, buffer);
1505  temp2 = mk_f_struct(i, i, buffer);
1506 
1507  cvec_push_void(&vec1, &temp);
1508  cvec_push_void(&vec2, &temp2);
1509  }
1510 
1511  cvec_set_cap_void(&vec1, vec1.size);
1512  CU_ASSERT_EQUAL(vec1.size, vec1.capacity);
1513  CU_ASSERT_EQUAL(vec1.size, 1010);
1514 
1515  cvec_set_cap_void(&vec2, vec2.size);
1516  CU_ASSERT_EQUAL(vec2.size, vec2.capacity);
1517  CU_ASSERT_EQUAL(vec2.size, 1010);
1518 
1519 
1520 
1521  for (i=999; i>=0; i--) {
1522  sprintf(buffer, "hello %d", i);
1523  cvec_pop_void(&vec1, &temp);
1524  cvec_pop_void(&vec2, &temp2);
1525 
1526  CU_ASSERT_EQUAL(temp.d, i );
1527  CU_ASSERT_EQUAL(temp.i, i );
1528  CU_ASSERT_STRING_EQUAL(temp.word, buffer);
1529 
1530  CU_ASSERT_EQUAL(temp2.d, i );
1531  CU_ASSERT_EQUAL(temp2.i, i );
1532  /*No CU_ASSERT_STRING_EQUAL here because the string
1533  was freed when it was popped */
1534  }
1535 
1536  CU_ASSERT_EQUAL(vec1.size, 10);
1537  CU_ASSERT_EQUAL(vec2.size, 10);
1538 
1539  cvec_free_void(&vec1);
1540  cvec_free_void(&vec2);
1541 }
1542 
1544 {
1545  char buffer[50];
1546  char buffer2[50];
1547  int i, loc, to_replace[] = { 1, 25, 50 };
1548  t_struct temp, ret_t_struct;
1549  f_struct temp2, ret_f_struct, temp3;
1550 
1551  cvector_void vec1;
1552  cvector_void vec2;
1553  cvector_void vec3;
1554 
1555  cvec_void(&vec1, 0, 0, sizeof(t_struct), NULL, NULL);
1556  cvec_void(&vec2, 0, 0, sizeof(f_struct), free_f_struct, NULL);
1557  cvec_void(&vec3, 0, 0, sizeof(f_struct), free_f_struct, init_f_struct);
1558 
1559 
1560  for (i=0; i<100; i++) {
1561  sprintf(buffer, "%d", i);
1562  temp = mk_t_struct(i, i, buffer);
1563  temp2 = mk_f_struct(i, i, buffer);
1564  temp3 = set_f_struct(i, i, buffer);
1565 
1566  cvec_push_void(&vec1, &temp);
1567  cvec_push_void(&vec2, &temp2);
1568  cvec_push_void(&vec3, &temp3);
1569  }
1570 
1571  for (i=0; i<sizeof(to_replace)/sizeof(int); ++i) {
1572  loc = to_replace[i];
1573  sprintf(buffer, "%d", loc);
1574  CU_ASSERT_EQUAL(loc, GET_T(vec1, loc)->d);
1575  CU_ASSERT_EQUAL(loc, GET_T(vec1, loc)->i);
1576  CU_ASSERT_STRING_EQUAL(buffer, GET_T(vec1, loc)->word);
1577 
1578  CU_ASSERT_EQUAL(loc, GET_F(vec2, loc)->d);
1579  CU_ASSERT_EQUAL(loc, GET_F(vec2, loc)->i);
1580  CU_ASSERT_STRING_EQUAL(buffer, GET_F(vec2, loc)->word);
1581 
1582  CU_ASSERT_EQUAL(loc, GET_F(vec3, loc)->d);
1583  CU_ASSERT_EQUAL(loc, GET_F(vec3, loc)->i);
1584  CU_ASSERT_STRING_EQUAL(buffer, GET_F(vec3, loc)->word);
1585 
1586  sprintf(buffer2, "neg %d", -loc);
1587  temp = mk_t_struct(-loc, -loc, buffer2);
1588  temp2 = mk_f_struct(-loc, -loc, buffer2);
1589  temp3 = set_f_struct(-loc, -loc, buffer2);
1590 
1591  cvec_replace_void(&vec1, loc, &temp, &ret_t_struct);
1592  cvec_replace_void(&vec2, loc, &temp2, &ret_f_struct);
1593 
1594  CU_ASSERT_EQUAL(-loc, GET_T(vec1, loc)->d);
1595  CU_ASSERT_EQUAL(-loc, GET_T(vec1, loc)->i);
1596  CU_ASSERT_STRING_EQUAL(buffer2, GET_T(vec1, loc)->word);
1597 
1598  CU_ASSERT_EQUAL(-loc, GET_F(vec2, loc)->d);
1599  CU_ASSERT_EQUAL(-loc, GET_F(vec2, loc)->i);
1600  CU_ASSERT_STRING_EQUAL(buffer2, GET_F(vec2, loc)->word);
1601 
1602  CU_ASSERT_EQUAL(loc, ret_t_struct.d);
1603  CU_ASSERT_EQUAL(loc, ret_t_struct.i);
1604  CU_ASSERT_STRING_EQUAL(buffer, ret_t_struct.word);
1605 
1606  CU_ASSERT_EQUAL(loc, ret_f_struct.d);
1607  CU_ASSERT_EQUAL(loc, ret_f_struct.i);
1608  CU_ASSERT_STRING_EQUAL(buffer, ret_f_struct.word);
1609 
1610  free_f_struct(&ret_f_struct);
1611 
1612  /* Test replace with elem_init */
1613  cvec_replace_void(&vec3, loc, &temp3, &ret_f_struct);
1614  CU_ASSERT_EQUAL(-loc, GET_F(vec3, loc)->d);
1615  CU_ASSERT_EQUAL(-loc, GET_F(vec3, loc)->i);
1616  CU_ASSERT_STRING_EQUAL(buffer2, GET_F(vec3, loc)->word);
1617 
1618  CU_ASSERT_EQUAL(loc, ret_f_struct.d);
1619  CU_ASSERT_EQUAL(loc, ret_f_struct.i);
1620  CU_ASSERT_STRING_EQUAL(buffer, ret_f_struct.word);
1621 
1622  free_f_struct(&ret_f_struct);
1623  }
1624 
1625  /* Test replace with no ret val */
1626  loc = 20;
1627  sprintf(buffer, "%d", loc);
1628  sprintf(buffer2, "neg %d", -loc);
1629  temp = mk_t_struct(-loc, -loc, buffer2);
1630  temp2 = mk_f_struct(-loc, -loc, buffer2);
1631  temp3 = set_f_struct(-loc, -loc, buffer2);
1632 
1633  cvec_replace_void(&vec1, loc, &temp, NULL);
1634  cvec_replace_void(&vec2, loc, &temp2, NULL);
1635  cvec_replace_void(&vec3, loc, &temp2, NULL);
1636 
1637  CU_ASSERT_EQUAL(-loc, GET_T(vec1, loc)->d);
1638  CU_ASSERT_EQUAL(-loc, GET_T(vec1, loc)->i);
1639  CU_ASSERT_STRING_EQUAL(buffer2, GET_T(vec1, loc)->word);
1640 
1641  CU_ASSERT_EQUAL(-loc, GET_F(vec2, loc)->d);
1642  CU_ASSERT_EQUAL(-loc, GET_F(vec2, loc)->i);
1643  CU_ASSERT_STRING_EQUAL(buffer2, GET_F(vec2, loc)->word);
1644 
1645  CU_ASSERT_EQUAL(-loc, GET_F(vec3, loc)->d);
1646  CU_ASSERT_EQUAL(-loc, GET_F(vec3, loc)->i);
1647  CU_ASSERT_STRING_EQUAL(buffer2, GET_F(vec3, loc)->word);
1648 
1649  cvec_free_void(&vec1);
1650  cvec_free_void(&vec2);
1651  cvec_free_void(&vec3);
1652 }
1653 
1655 {
1656  cvector_void* vect = cvec_void_heap(0, 19, sizeof(t_struct), NULL, NULL);
1657  cvector_void* vec2 = cvec_void_heap(0, 21, sizeof(f_struct), NULL, NULL);
1658 
1659  CU_ASSERT_EQUAL(vect->capacity, 19);
1660  CU_ASSERT_EQUAL(vec2->capacity, 21);
1661 
1662  cvec_reserve_void(vect, 20);
1663  cvec_reserve_void(vec2, 20);
1664 
1665  CU_ASSERT(vect->capacity >= 20);
1666  CU_ASSERT(vec2->capacity >= 20);
1667 
1668  cvec_free_void_heap(vect);
1669  cvec_free_void_heap(vec2);
1670 }
1671 
1672 
1674 {
1675  char buffer[50];
1676  int i;
1677  t_struct temp;
1678  f_struct temp2;
1679  cvector_void vec1, vec2;
1680 
1681  cvec_void(&vec1, 0, 0, sizeof(t_struct), NULL, NULL);
1682  cvec_void(&vec2, 0, 0, sizeof(f_struct), free_f_struct, NULL);
1683 
1684  CU_ASSERT_EQUAL(vec1.size, 0);
1685  CU_ASSERT_EQUAL(vec1.capacity, CVEC_VOID_START_SZ);
1686  CU_ASSERT_EQUAL(vec2.size, 0);
1687  CU_ASSERT_EQUAL(vec2.capacity, CVEC_VOID_START_SZ);
1688 
1689  for (i=0; i<1000; i++) {
1690  sprintf(buffer, "hello %d", i);
1691  temp = mk_t_struct(i, i, buffer);
1692  temp2 = mk_f_struct(i, i, buffer);
1693 
1694  cvec_push_void(&vec1, &temp);
1695  cvec_push_void(&vec2, &temp2);
1696  }
1697 
1698  CU_ASSERT(vec1.capacity >= 1000);
1699  CU_ASSERT(vec1.size == 1000);
1700 
1701  CU_ASSERT(vec2.capacity >= 1000);
1702  CU_ASSERT(vec2.size == 1000);
1703 
1704  cvec_set_cap_void(&vec1, 500);
1705  cvec_set_cap_void(&vec2, 500);
1706 
1707 
1708  CU_ASSERT(vec1.capacity == 500);
1709  CU_ASSERT(vec1.size == 500);
1710 
1711  CU_ASSERT(vec2.capacity == 500);
1712  CU_ASSERT(vec2.size == 500);
1713 
1714  for (i=0; i<vec1.size; i++) {
1715  sprintf(buffer, "hello %d", i);
1716 
1717  CU_ASSERT_EQUAL(GET_T(vec1, i)->d, i );
1718  CU_ASSERT_EQUAL(GET_T(vec1, i)->i, i );
1719  CU_ASSERT_STRING_EQUAL(GET_T(vec1, i)->word, buffer);
1720 
1721  CU_ASSERT_EQUAL(GET_F(vec2, i)->d, i );
1722  CU_ASSERT_EQUAL(GET_F(vec2, i)->i, i );
1723  CU_ASSERT_STRING_EQUAL(GET_F(vec2, i)->word, buffer);
1724  }
1725 
1726  cvec_free_void(&vec1);
1727  cvec_free_void(&vec2);
1728 }
1729 
1731 {
1732  int i;
1733  cvector_void vec1, vec2;
1734  t_struct temp;
1735  f_struct temp2;
1736 
1737  cvec_void(&vec1, 20, 25, sizeof(t_struct), NULL, NULL);
1738  cvec_void(&vec2, 20, 0, sizeof(f_struct), free_f_struct, init_f_struct);
1739 
1740  CU_ASSERT_EQUAL(vec1.size, 20);
1741  CU_ASSERT_EQUAL(vec2.size, 20);
1742 
1743  CU_ASSERT_EQUAL(vec1.capacity, 25);
1744  CU_ASSERT_EQUAL(vec2.capacity, 20+CVEC_VOID_START_SZ);
1745 
1746  for (i=0; i<vec2.size; ++i)
1747  GET_F(vec2, i)->word = CVEC_STRDUP("hello");
1748 
1749  temp = mk_t_struct(42.5, 42, "hello");
1750  temp2 = mk_f_struct(42.5, 42, "hello");
1751 
1752  cvec_set_val_sz_void(&vec1, &temp);
1753  cvec_set_val_sz_void(&vec2, &temp2);
1754 
1755  free_f_struct(&temp2);
1756 
1757  for (i=0; i<vec1.size; i++) {
1758  CU_ASSERT_EQUAL(GET_T(vec1, i)->d, 42.5);
1759  CU_ASSERT_EQUAL(GET_T(vec1, i)->i, 42);
1760  CU_ASSERT_STRING_EQUAL(GET_T(vec1, i)->word, "hello");
1761 
1762  CU_ASSERT_EQUAL(GET_F(vec2, i)->d, 42.5);
1763  CU_ASSERT_EQUAL(GET_F(vec2, i)->i, 42);
1764  CU_ASSERT_STRING_EQUAL(GET_F(vec2, i)->word, "hello");
1765  }
1766 
1767  temp = mk_t_struct(25.5, 25, "goodbye");
1768  temp2 = mk_f_struct(25.5, 25, "goodbye");
1769 
1770  cvec_set_val_cap_void(&vec1, &temp);
1771  cvec_set_val_cap_void(&vec2, &temp2);
1772 
1773  free_f_struct(&temp2);
1774 
1775  /*difference here between having a free function and not
1776  if yes then size is set to capacity by set_val_cap. */
1777  CU_ASSERT_EQUAL(vec1.size, 20);
1778  CU_ASSERT_EQUAL(vec1.capacity, 25);
1779 
1780  CU_ASSERT_EQUAL(vec2.size, vec2.capacity);
1781  CU_ASSERT_EQUAL(vec2.capacity, 20+CVEC_VOID_START_SZ);
1782 
1783 
1784  for (i=0; i<vec2.capacity; i++) {
1785  if (i < vec1.capacity) {
1786  CU_ASSERT_EQUAL(GET_T(vec1, i)->d, 25.5);
1787  CU_ASSERT_EQUAL(GET_T(vec1, i)->i, 25);
1788  CU_ASSERT_STRING_EQUAL(GET_T(vec1, i)->word, "goodbye");
1789  }
1790 
1791  CU_ASSERT_EQUAL(GET_F(vec2, i)->d, 25.5);
1792  CU_ASSERT_EQUAL(GET_F(vec2, i)->i, 25);
1793  CU_ASSERT_STRING_EQUAL(GET_F(vec2, i)->word, "goodbye");
1794  }
1795 
1796  cvec_free_void(&vec1);
1797  cvec_free_void(&vec2);
1798 }
1799 
1800 void free_str(void* s)
1801 {
1802  free(*((char**)s));
1803 }
1804 
1808 int init_str(void* dest, void* src)
1809 {
1810  char** d = (char**)dest;
1811  char** s = (char**)src;
1812 
1813  *d = CVEC_STRDUP(*s);
1814  return *d != 0;
1815 }
1816 
1817 /*
1818  * TODO
1819  * Should I add another version that dereferences so you actually get type instead
1820  * of type* back? Also should I add this to cvector_void.h or change
1821  * CVEC_GET_VOID's parameter order?
1822  */
1823 #define GET_ELEMENT(VEC,I,TYPE) ((TYPE*)&(VEC).a[(I)*(VEC).elem_size])
1824 
1825 /* direct mapping of move_str_test to show how and highlight
1826  * differences */
1828 {
1829  int i, j;
1830  char* ret, *val;
1831  char buffer[50];
1832  char* strs[] = {
1833  "one", "two", "three",
1834  "four", "five", "six",
1835  "seven", "eight", "nine",
1836  "ten"
1837  };
1838 
1839  cvector_void vec1;
1840  cvec_void(&vec1, 0, 10, sizeof(char*), free_str, init_str);
1841 
1842  val = CVEC_STRDUP("whatever");
1843  cvec_pushm_void(&vec1, &val);
1844  CU_ASSERT_EQUAL(vec1.size, 1);
1845  cvec_pop_void(&vec1, NULL);
1846  CU_ASSERT_EQUAL(vec1.size, 0);
1847 
1848  for (i=0; i<1000; i++) {
1849  sprintf(buffer, "hello %d", i);
1850  val = CVEC_STRDUP(buffer);
1851  cvec_pushm_void(&vec1, &val);
1852  }
1853 
1854  CU_ASSERT_EQUAL(vec1.size, 1000);
1855 
1856  for (i=999; i>=0; i--) {
1857  sprintf(buffer, "hello %d", i);
1858  cvec_popm_void(&vec1, &ret);
1859  CU_ASSERT_STRING_EQUAL(buffer, ret);
1860  free(ret);
1861  }
1862 
1863  CU_ASSERT_EQUAL(vec1.size, 0);
1864 
1865  for (i=0; i<100; i++) {
1866  sprintf(buffer, "hello %d", i);
1867  val = buffer;
1868  cvec_push_void(&vec1, &val);
1869  }
1870  val = CVEC_STRDUP("hello insertm");
1871  cvec_insertm_void(&vec1, 50, &val);
1872  val = CVEC_STRDUP("hello replacem");
1873  cvec_replacem_void(&vec1, 25, &val, &ret);
1874 
1875  CU_ASSERT_STRING_EQUAL(ret, "hello 25");
1876  free(ret);
1877 
1878  CU_ASSERT_EQUAL(vec1.size, 101);
1879 
1880  j = 0;
1881  for (i=0; i<101; i++) {
1882  if (i == 25) {
1883  CU_ASSERT_STRING_EQUAL(*GET_ELEMENT(vec1, i, char*), "hello replacem");
1884  } else if (i == 50) {
1885  CU_ASSERT_STRING_EQUAL(*GET_ELEMENT(vec1, i, char*), "hello insertm");
1886  j++;
1887  } else {
1888  sprintf(buffer, "hello %d", i-j);
1889  CU_ASSERT_STRING_EQUAL(*GET_ELEMENT(vec1, i, char*), buffer);
1890  }
1891  }
1892 
1893  cvec_insert_arraym_void(&vec1, 60, strs, 10);
1894  CU_ASSERT_EQUAL(vec1.size, 111);
1895 
1896  for (i=0; i<10; ++i) {
1897  CU_ASSERT_STRING_EQUAL(*GET_ELEMENT(vec1, 60+i, char*), strs[i]);
1898  }
1899  cvec_remove_void(&vec1, 60, 69);
1900 
1901  CU_ASSERT_EQUAL(vec1.size, 101);
1902 
1903  cvec_free_void(&vec1);
1904 }
1905 
1906 
1907 
1909 {
1910  int i, j, tmp_int;
1911  cvector_void vec1, vec2;
1912  cvector_i tmp_vec_i, *tmp_vec_i2;
1913  cvector_str tmp_vecs;
1914  char buffer[50];
1915 
1916  cvec_void(&vec1, 0, 0, sizeof(cvector_i), cvec_free_i, cvec_copyc_i);
1917  cvec_void(&vec2, 0, 0, sizeof(cvector_str), cvec_free_str, cvec_copyc_i);
1918 
1919  cvec_str(&tmp_vecs, 0, 0);
1920 
1921  CU_ASSERT_EQUAL(CVEC_STR_START_SZ, tmp_vecs.capacity);
1922  CU_ASSERT_EQUAL(0, tmp_vecs.size);
1923 
1924  for (i=0; i<50; i++) {
1925  sprintf(buffer, "hello %d", i);
1926  cvec_push_str(&tmp_vecs, buffer);
1927  }
1928 
1929  CU_ASSERT_EQUAL(vec1.size, 0);
1930  CU_ASSERT_EQUAL(vec1.capacity, CVEC_VOID_START_SZ);
1931 
1932  cvec_i(&tmp_vec_i, 0, 0);
1933 
1934  for (i=0; i<20; ++i)
1935  cvec_push_i(&tmp_vec_i, rand());
1936 
1937  for (i=0; i<20; ++i) {
1938  cvec_push_void(&vec1, &tmp_vec_i);
1939  for (j=0; j<500; ++j) {
1940  cvec_push_i((cvector_i*)(&vec1.a[i*vec1.elem_size]), j);
1941  }
1942  tmp_vec_i2 = cvec_get_void(&vec1, i);
1943  CU_ASSERT_EQUAL(tmp_vec_i2->size, 520);
1944  }
1945 
1946  CU_ASSERT_EQUAL(vec1.size, 20);
1947 
1948  for (i=0; i<20; ++i) {
1949  for (j=0; j<500; ++j) {
1950  tmp_int = cvec_pop_i(GET_ELEMENT(vec1, (vec1.size-1), cvector_i)); /*&vec1.a[(vec1.size-1)*vec1.elem_size]); GET_ELEMENT(vec1, i, cvector_i));*/
1951  CU_ASSERT_EQUAL(tmp_int, 499-j);
1952  }
1953  tmp_vec_i2 = cvec_get_void(&vec1, vec1.size-1);
1954  CU_ASSERT_EQUAL(tmp_vec_i2->size, 20);
1955 
1956  for (j=0; j<20; j++) {
1957  CU_ASSERT_EQUAL(tmp_vec_i.a[i], tmp_vec_i2->a[i]);
1958  }
1959 
1960  cvec_pop_void(&vec1, NULL);
1961  }
1962 
1963  cvec_free_void(&vec1);
1964  cvec_free_void(&vec2);
1965  cvec_free_i(&tmp_vec_i);
1966  cvec_free_str(&tmp_vecs);
1967 }
1968 
1969 
1971 {
1972  int i;
1973  cvector_short vec;
1974 
1975  cvec_short(&vec, 0, 0);
1976 
1977  CU_ASSERT_EQUAL(CVEC_short_SZ, vec.capacity);
1978  CU_ASSERT_EQUAL(0, vec.size);
1979 
1980  for (i=0; i<100; i++)
1981  cvec_push_short(&vec, i);
1982 
1983  CU_ASSERT_EQUAL(100, vec.size);
1984 
1985  for (i=0; i<vec.size; i++)
1986  CU_ASSERT_EQUAL(i, vec.a[i]);
1987 
1988  cvec_free_short(&vec);
1989 }
1990 
1992 {
1993  int i, j, loc;
1994  char buffer[50];
1995  f_struct temp, ret;
1996  cvector_f_struct vec;
1997  f_struct array[] = {
1998  {0, 0, "one"},
1999  {0, 0, "two"},
2000  {0, 0, "three"},
2001  {0, 0, "four"},
2002  {0, 0, "five"},
2003  {0, 0, "six"},
2004  {0, 0, "seven"},
2005  {0, 0, "eight"},
2006  {0, 0, "nine"},
2007  {0, 0, "ten"}
2008  };
2009 
2010  cvec_f_struct(&vec, 20, 0, free_f_struct, init_f_struct);
2011 
2012  CU_ASSERT_EQUAL(vec.size, 20);
2013  CU_ASSERT_EQUAL(vec.capacity, 20+CVEC_f_struct_SZ);
2014 
2015  for (i=0; i<vec.size; ++i)
2016  vec.a[i].word = CVEC_STRDUP("hello");
2017 
2018  temp = mk_f_struct(42.5, 42, "hello");
2019 
2020  cvec_set_val_sz_f_struct(&vec, &temp);
2021 
2022  free_f_struct(&temp);
2023 
2024  for (i=0; i<vec.size; i++) {
2025  CU_ASSERT_EQUAL(vec.a[i].d, 42.5);
2026  CU_ASSERT_EQUAL(vec.a[i].i, 42);
2027  CU_ASSERT_STRING_EQUAL(vec.a[i].word, "hello");
2028  }
2029 
2030  temp = mk_f_struct(25.5, 25, "goodbye");
2031 
2032  cvec_set_val_cap_f_struct(&vec, &temp);
2033 
2034  free_f_struct(&temp);
2035 
2036  /*
2037  * difference here between having a free function and not
2038  * if yes then size is set to capacity by set_val_cap.
2039  */
2040  CU_ASSERT_EQUAL(vec.size, vec.capacity);
2041  CU_ASSERT_EQUAL(vec.capacity, 20+CVEC_f_struct_SZ);
2042 
2043 
2044  for (i=0; i<vec.capacity; i++) {
2045  CU_ASSERT_EQUAL(vec.a[i].d, 25.5);
2046  CU_ASSERT_EQUAL(vec.a[i].i, 25);
2047  CU_ASSERT_STRING_EQUAL(vec.a[i].word, "goodbye");
2048  }
2049 
2050  loc = 20;
2051  sprintf(buffer, "neg %d", -loc);
2052  temp = set_f_struct(-loc, -loc, buffer);
2053  cvec_replace_f_struct(&vec, loc, &temp, NULL);
2054 
2055  CU_ASSERT_EQUAL(-loc, vec.a[loc].d);
2056  CU_ASSERT_EQUAL(-loc, vec.a[loc].i);
2057  CU_ASSERT_STRING_EQUAL(buffer, vec.a[loc].word);
2058 
2059  cvec_free_f_struct(&vec);
2060 
2061  cvec_f_struct(&vec, 0, 0, free_f_struct, NULL);
2062  CU_ASSERT_EQUAL(vec.capacity, CVEC_f_struct_SZ);
2063 
2064  for (i=0; i<100; i++) {
2065  sprintf(buffer, "%d", i);
2066  temp = mk_f_struct(i, i, buffer);
2067 
2068  cvec_push_f_struct(&vec, &temp);
2069  }
2070 
2071  CU_ASSERT_EQUAL(100, vec.size);
2072 
2073  for (i=0; i<vec.size; i++) {
2074  sprintf(buffer, "%d", i);
2075  CU_ASSERT_EQUAL(i, vec.a[i].d);
2076  CU_ASSERT_EQUAL(i, vec.a[i].i);
2077  CU_ASSERT_STRING_EQUAL(buffer, vec.a[i].word);
2078  }
2079 
2080  for (i=vec.size-1; i >= 10; i--) {
2081  sprintf(buffer, "%d", i);
2082  cvec_pop_f_struct(&vec, &temp);
2083 
2084  CU_ASSERT_EQUAL(temp.d, i );
2085  CU_ASSERT_EQUAL(temp.i, i );
2086  /*No CU_ASSERT_STRING_EQUAL here because the string
2087  was freed when it was popped */
2088  }
2089 
2090  CU_ASSERT_EQUAL(10, vec.size);
2091 
2092  /* Test popm */
2093  cvec_popm_f_struct(&vec, &temp);
2094  sprintf(buffer, "%d", 9);
2095  CU_ASSERT_EQUAL(temp.d, 9);
2096  CU_ASSERT_EQUAL(temp.i, 9);
2097  CU_ASSERT_STRING_EQUAL(buffer, temp.word);
2098  free_f_struct(&temp);
2099 
2100  CU_ASSERT_EQUAL(9, vec.size);
2101 
2102  /* Test remove */
2103  for (i=4; i<7; i++) {
2104  /* could just call free(vec.a[i].word) */
2105  free_f_struct(&vec.a[i]);
2106  }
2107  cvec_remove_f_struct(&vec, 4, 6);
2108 
2109  CU_ASSERT_EQUAL(6, vec.size);
2110 
2111  for (i=0; i<vec.size; i++) {
2112  int j = (i < 4) ? i : i+3;
2113  sprintf(buffer, "%d", j);
2114  CU_ASSERT_EQUAL(j, vec.a[i].d);
2115  CU_ASSERT_EQUAL(j, vec.a[i].i);
2116  CU_ASSERT_STRING_EQUAL(buffer, vec.a[i].word);
2117  }
2118 
2119  cvec_free_f_struct(&vec);
2120  CU_ASSERT_EQUAL(vec.size, 0);
2121  CU_ASSERT_EQUAL(vec.capacity, 0);
2122 
2123  /* test rest of m functions match move_str and move_void tests */
2124  cvec_f_struct(&vec, 0, 10, free_f_struct, init_f_struct);
2125  CU_ASSERT_EQUAL(vec.size, 0);
2126  CU_ASSERT_EQUAL(vec.capacity, 10);
2127 
2128  temp.word = CVEC_STRDUP("blah");
2129  cvec_pushm_f_struct(&vec, &temp);
2130  CU_ASSERT_EQUAL(vec.size, 1);
2131  cvec_pop_f_struct(&vec, NULL);
2132  CU_ASSERT_EQUAL(vec.size, 0);
2133 
2134  for (i=0; i<1000; i++) {
2135  sprintf(buffer, "hello %d", i);
2136  temp.d = i;
2137  temp.i = i;
2138  temp.word = CVEC_STRDUP(buffer);
2139  cvec_pushm_f_struct(&vec, &temp);
2140  }
2141  CU_ASSERT_EQUAL(vec.size, 1000);
2142 
2143  for (i=999; i>=0; i--) {
2144  sprintf(buffer, "hello %d", i);
2145  cvec_popm_f_struct(&vec, &temp);
2146  CU_ASSERT_EQUAL(i, temp.i);
2147  CU_ASSERT_EQUAL(i, temp.d);
2148  CU_ASSERT_STRING_EQUAL(buffer, temp.word);
2149  free(temp.word);
2150  }
2151  CU_ASSERT_EQUAL(vec.size, 0);
2152 
2153  for (i=0; i<100; i++) {
2154  sprintf(buffer, "hello %d", i);
2155  temp.d = i;
2156  temp.i = i;
2157  temp.word = buffer;
2158  cvec_push_f_struct(&vec, &temp);
2159  }
2160 
2161  temp.word = CVEC_STRDUP("hello insertm");
2162  cvec_insertm_f_struct(&vec, 50, &temp);
2163 
2164  temp.word = CVEC_STRDUP("hello replacem");
2165  cvec_replacem_f_struct(&vec, 25, &temp, &ret);
2166 
2167  CU_ASSERT_STRING_EQUAL(ret.word, "hello 25");
2168  free(ret.word);
2169 
2170  CU_ASSERT_EQUAL(vec.size, 101);
2171 
2172  j = 0;
2173  for (i=0; i<101; i++) {
2174  if (i == 25) {
2175  CU_ASSERT_STRING_EQUAL(vec.a[i].word, "hello replacem");
2176  } else if (i == 50) {
2177  CU_ASSERT_STRING_EQUAL(vec.a[i].word, "hello insertm");
2178  j++;
2179  } else {
2180  sprintf(buffer, "hello %d", i-j);
2181  CU_ASSERT_STRING_EQUAL(vec.a[i].word, buffer);
2182  }
2183  }
2184 
2185  cvec_insert_arraym_f_struct(&vec, 60, array, 10);
2186 
2187  CU_ASSERT_EQUAL(vec.size, 111);
2188 
2189  for (i=0; i<10; ++i) {
2190  CU_ASSERT_STRING_EQUAL(vec.a[60+i].word, array[i].word);
2191  }
2192  cvec_remove_f_struct(&vec, 60, 69);
2193 
2194  CU_ASSERT_EQUAL(vec.size, 101);
2195 
2196  cvec_free_f_struct(&vec);
2197 }
2198 
2199 
2200 
2201 
2202 
2203 
2204 
2205 
2206 
2207 
2208 
2209 
2210 
2211 
int cvec_init_str(cvector_str *vec, char **vals, cvec_sz num)
Same as cvec_init_str_heap() except the vector passed in was declared on the stack so it isn't alloca...
Definition: cvector_str.c:140
cvector_d * cvec_d_heap(cvec_sz size, cvec_sz capacity)
Creates a new cvector_d on the heap.
Definition: cvector_d.c:39
int cvec_insert_array_d(cvector_d *vec, cvec_sz i, double *a, cvec_sz num)
Insert the first num elements of array a at index i.
Definition: cvector_d.c:250
#define cvec_replacem_str(vec, i, s, ret)
Definition: cvector.h:214
int cvec_set_val_sz_void(cvector_void *vec, void *val)
Set all size elements to val.
Definition: cvector_void.c:581
int cvec_insert_d(cvector_d *vec, cvec_sz i, double a)
Insert a at index i (0 based).
Definition: cvector_d.c:224
int cvec_insert_i(cvector_i *vec, cvec_sz i, int a)
Insert a at index i (0 based).
Definition: cvector_i.c:224
void cvec_free_i_heap(void *vec)
Frees everything so don't use vec after calling this.
Definition: cvector_i.c:348
int cvec_copy_str(cvector_str *dest, cvector_str *src)
Makes dest a copy of src.
Definition: cvector_str.c:190
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
void cvec_free_i(void *vec)
Frees the internal array and sets size and capacity to 0.
Definition: cvector_i.c:357
void cvec_free_d(void *vec)
Frees the internal array and sets size and capacity to 0.
Definition: cvector_d.c:356
int cvec_reserve_void(cvector_void *vec, cvec_sz size)
Makes sure capacity >= size (the parameter not the member).
Definition: cvector_void.c:539
int cvec_set_cap_str(cvector_str *vec, cvec_sz size)
Set capacity to size.
Definition: cvector_str.c:444
int cvec_pop_i(cvector_i *vec)
Remove and return the last element (size decreased 1).
Definition: cvector_i.c:189
void cvec_set_val_cap_str(cvector_str *vec, char *val)
Fills entire allocated array (capacity) with val.
Definition: cvector_str.c:481
int cvec_copyc_i(void *dest, void *src)
Makes dest a copy of src.
Definition: cvector_i.c:130
void cvec_erase_d(cvector_d *vec, cvec_sz start, cvec_sz end)
Erases elements from start to end inclusive.
Definition: cvector_d.c:283
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_replace_i(cvector_i *vec, cvec_sz i, int a)
Replace value at index i with a, return original value.
Definition: cvector_i.c:271
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_insert_array_i(cvector_i *vec, cvec_sz i, int *a, cvec_sz num)
Insert the first num elements of array a at index i.
Definition: cvector_i.c:250
void cvec_set_val_cap_d(cvector_d *vec, double val)
Fills entire allocated array (capacity) with val.
Definition: cvector_d.c:334
cvec_sz CVEC_I_START_SZ
Definition: cvector_i.c:29
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
#define CVEC_NEW_DEFS2(TYPE, RESIZE_MACRO)
Definition: cvector.h:654
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_copy_d(cvector_d *dest, cvector_d *src)
Makes dest a copy of src.
Definition: cvector_d.c:152
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
int cvec_copy_i(cvector_i *dest, cvector_i *src)
Makes dest a copy of src.
Definition: cvector_i.c:151
int cvec_set_cap_i(cvector_i *vec, cvec_sz size)
Set capacity to size.
Definition: cvector_i.c:309
int cvec_reserve_d(cvector_d *vec, cvec_sz size)
Make sure capacity is at least size(parameter not member).
Definition: cvector_d.c:291
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_reserve_i(cvector_i *vec, cvec_sz size)
Make sure capacity is at least size(parameter not member).
Definition: cvector_i.c:291
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
void cvec_set_val_sz_str(cvector_str *vec, char *val)
Sets all size elements to val.
Definition: cvector_str.c:466
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
int cvec_insert_array_str(cvector_str *vec, cvec_sz i, char **a, cvec_sz num)
Insert the first num elements of array a at index i.
Definition: cvector_str.c:341
double cvec_replace_d(cvector_d *vec, cvec_sz i, double a)
Replace value at index i with a, return original value.
Definition: cvector_d.c:271
int cvec_push_i(cvector_i *vec, int a)
Append a to end of vector (size increased 1).
Definition: cvector_i.c:170
void cvec_erase_i(cvector_i *vec, cvec_sz start, cvec_sz end)
Erases elements from start to end inclusive.
Definition: cvector_i.c:283
int cvec_insertm_str(cvector_str *vec, cvec_sz i, char *a)
Same as insert except no CVEC_STRDUP.
Definition: cvector_str.c:316
#define CVEC_NEW_DECLS2(TYPE)
Definition: cvector.h:604
void cvec_set_val_sz_d(cvector_d *vec, double val)
Set all size elements to val.
Definition: cvector_d.c:325
int cvec_init_i(cvector_i *vec, int *vals, cvec_sz num)
Same as cvec_init_i_heap() except the vector passed in was declared on the stack so it isn't allocate...
Definition: cvector_i.c:105
void cvec_erase_str(cvector_str *vec, cvec_sz start, cvec_sz end)
Erases strings from start to end inclusive.
Definition: cvector_str.c:405
void cvec_free_str(void *vec)
Frees the internal array and sets size and capacity to 0.
Definition: cvector_str.c:521
void cvec_pop_void(cvector_void *vec, void *ret)
Remove the last element (size decreased 1).
Definition: cvector_void.c:306
int cvec_i(cvector_i *vec, cvec_sz size, cvec_sz capacity)
Same as cvec_i_heap() except the vector passed in was declared on the stack so it isn't allocated in ...
Definition: cvector_i.c:88
int cvec_set_cap_void(cvector_void *vec, cvec_sz size)
Set capacity to size.
Definition: cvector_void.c:557
cvector_i * cvec_i_heap(cvec_sz size, cvec_sz capacity)
Creates a new cvector_i on the heap.
Definition: cvector_i.c:39
int cvec_push_str(cvector_str *vec, char *a)
Append a to end of vector (size increased 1).
Definition: cvector_str.c:212
int cvec_insert_arraym_str(cvector_str *vec, cvec_sz i, char **a, cvec_sz num)
Same as insert_array except no CVEC_STRDUP.
Definition: cvector_str.c:367
int cvec_d(cvector_d *vec, cvec_sz size, cvec_sz capacity)
Same as cvec_d_heap() except the vector passed in was declared on the stack so it isn't allocated in ...
Definition: cvector_d.c:89
void cvec_free_void(void *vec)
Frees the internal array and sets size and capacity to 0.
Definition: cvector_void.c:667
int cvec_set_cap_d(cvector_d *vec, cvec_sz size)
Set capacity to size.
Definition: cvector_d.c:309
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
int cvec_pushm_str(cvector_str *vec, char *a)
same as push but without calling CVEC_STRDUP(a), m suffix is for "move"
Definition: cvector_str.c:231
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
void cvec_replace_str(cvector_str *vec, cvec_sz i, char *a, char *ret)
Replace string at i with a.
Definition: cvector_str.c:392
cvec_sz CVEC_VOID_START_SZ
Definition: cvector_void.c:29
#define cvec_popm_str(vec)
Definition: cvector.h:211
void cvec_pop_str(cvector_str *vec, char *ret)
Remove the last element (size decreased 1).
Definition: cvector_str.c:253
void cvec_free_str_heap(void *vec)
Frees contents (individual strings and array) and frees vector so don't use after calling this.
Definition: cvector_str.c:507
int cvec_set_val_cap_void(cvector_void *vec, void *val)
Fills entire allocated array (capacity) with val.
Definition: cvector_void.c:611
#define CVEC_NEW_DECLS(TYPE)
Definition: cvector.h:300
void cvec_free_void_heap(void *vec)
Frees everything so don't use vec after calling this.
Definition: cvector_void.c:652
int cvec_push_d(cvector_d *vec, double a)
Append a to end of vector (size increased 1).
Definition: cvector_d.c:171
int cvec_reserve_str(cvector_str *vec, cvec_sz size)
Makes sure the vector capacity is >= size (parameter not member).
Definition: cvector_str.c:426
int cvec_insert_str(cvector_str *vec, cvec_sz i, char *a)
Insert a at index i (0 based).
Definition: cvector_str.c:293
#define CVEC_STRDUP
Definition: cvector.h:195
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_set_val_cap_i(cvector_i *vec, int val)
Fills entire allocated array (capacity) with val.
Definition: cvector_i.c:335
cvector_str * cvec_str_heap(cvec_sz size, cvec_sz capacity)
Create a new cvector_str on the heap.
Definition: cvector_str.c:64
void cvec_remove_str(cvector_str *vec, cvec_sz start, cvec_sz end)
Same as erase except it does not call CVEC_FREE.
Definition: cvector_str.c:418
int cvec_str(cvector_str *vec, cvec_sz size, cvec_sz capacity)
Same as cvec_str_heap() except the vector passed in was declared on the stack so it isn't allocated i...
Definition: cvector_str.c:120
void cvec_set_val_sz_i(cvector_i *vec, int val)
Set all size elements to val.
Definition: cvector_i.c:326
cvector_str * cvec_init_str_heap(char **vals, cvec_sz num)
Create (on the heap) and initialize cvector_str with num elements of vals.
Definition: cvector_str.c:91
void cvec_free_d_heap(void *vec)
Frees everything so don't use vec after calling this.
Definition: cvector_d.c:347
int cvec_init_d(cvector_d *vec, double *vals, cvec_sz num)
Same as cvec_init_d_heap() except the vector passed in was declared on the stack so it isn't allocate...
Definition: cvector_d.c:106
double cvec_pop_d(cvector_d *vec)
Remove and return the last element (size decreased 1).
Definition: cvector_d.c:189
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
cvec_sz CVEC_STR_START_SZ
Definition: cvector_str.c:29
cvec_sz CVEC_D_START_SZ
Definition: cvector_d.c:29
#define CVEC_NEW_DEFS(TYPE, RESIZE_MACRO)
Definition: cvector.h:337
int cvec_replace_f_struct(cvector_f_struct *vec, cvec_sz i, f_struct *a, f_struct *ret)
int cvec_set_val_sz_f_struct(cvector_f_struct *vec, f_struct *val)
int cvec_f_struct(cvector_f_struct *vec, cvec_sz size, cvec_sz capacity, void(*elem_free)(void *), int(*elem_init)(void *, void *))
void cvec_pop_f_struct(cvector_f_struct *vec, f_struct *ret)
void cvec_popm_f_struct(cvector_f_struct *vec, f_struct *ret)
void cvec_free_f_struct(void *vec)
void cvec_replacem_f_struct(cvector_f_struct *vec, cvec_sz i, f_struct *a, f_struct *ret)
void cvec_remove_f_struct(cvector_f_struct *vec, cvec_sz start, cvec_sz end)
int cvec_insert_arraym_f_struct(cvector_f_struct *vec, cvec_sz i, f_struct *a, cvec_sz num)
int cvec_push_f_struct(cvector_f_struct *vec, f_struct *val)
int cvec_set_val_cap_f_struct(cvector_f_struct *vec, f_struct *val)
int cvec_pushm_f_struct(cvector_f_struct *vec, f_struct *a)
cvec_sz CVEC_f_struct_SZ
int cvec_insertm_f_struct(cvector_f_struct *vec, cvec_sz i, f_struct *a)
int cvec_short(cvector_short *vec, cvec_sz size, cvec_sz capacity)
int cvec_push_short(cvector_short *vec, short a)
cvec_sz CVEC_short_SZ
void cvec_free_short(void *vec)
void free_str(void *s)
f_struct set_f_struct(double d, int i, char *word)
void reserve_void_test()
void erase_void_test()
void insert_array_void_test()
void copy_void_test()
void reserve_d_test()
void move_void_test()
void push_str_test()
void insert_array_d_test()
void template_test2()
void set_capacity_str_test()
#define GET_ELEMENT(VEC, I, TYPE)
void erase_d_test()
void replace_d_test()
void push_i_test()
Definition: cvector_tests.c:71
void insert_i_test()
void erase_i_test()
Definition: cvector_tests.c:92
void vector_of_vectors_test()
void replace_str_test()
t_struct mk_t_struct(double d, int i, char *word)
void zero_init_void_test()
void replace_void_test()
void remove_void_test()
void erase_str_test()
void template_test()
void insert_array_str_test()
#define RESIZE(a)
Definition: cvector_tests.c:52
f_struct mk_f_struct(double d, int i, char *word)
void pop_d_test()
void zero_init_i_test()
void push_d_test()
void push_void_test()
#define GET_T(X, Y)
void set_capacity_i_test()
void free_f_struct(void *tmp)
void reserve_str_test()
void pop_str_test()
void copy_d_test()
void insert_d_test()
void set_val_str_test()
void insert_void_test()
void pop_void_test()
void move_str_test()
#define GET_FP(X, Y)
int init_f_struct(void *dest, void *src)
#define GET_TP(X, Y)
void copy_str_test()
void zero_init_d_test()
void insert_array_i_test()
int init_str(void *dest, void *src)
If we weren't testing the move functions we could have src be just a char* to more closely emulate cv...
void set_capacity_void_test()
#define GET_F(X, Y)
void set_val_i_test()
void set_val_void_test()
void set_capacity_d_test()
void zero_init_str_test()
void reserve_i_test()
void remove_str_test()
void pop_i_test()
void insert_str_test()
void set_val_d_test()
void copy_i_test()
void replace_i_test()
Data structure for double vector.
Definition: cvector.h:143
cvec_sz size
Current size (amount you use when manipulating array directly).
Definition: cvector.h:145
cvec_sz capacity
Allocated size of array; always >= size.
Definition: cvector.h:146
double * a
Array.
Definition: cvector.h:144
Data structure for int vector.
Definition: cvector.h:100
cvec_sz size
Current size (amount you use when manipulating array directly).
Definition: cvector.h:102
int * a
Array.
Definition: cvector.h:101
cvec_sz capacity
Allocated size of array; always >= size.
Definition: cvector.h:103
Data structure for short vector.
Definition: cvector_short.h:55
cvec_sz capacity
Allocated size of array; always >= size.
Definition: cvector_short.h:58
short * a
Array.
Definition: cvector_short.h:56
cvec_sz size
Current size (amount you use when manipulating array directly).
Definition: cvector_short.h:57
Data structure for string vector.
Definition: cvector.h:186
cvec_sz capacity
Allocated size of array; always >= size.
Definition: cvector.h:189
cvec_sz size
Current size (amount you use when manipulating array directly).
Definition: cvector.h:188
char ** a
Array.
Definition: cvector.h:187
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
Structure used to test generic vector.
Definition: test_types.h:14
char * word
Definition: test_types.h:17
double d
Definition: test_types.h:15
Structure used to test generic vector.
Definition: test_types.h:6
double d
Definition: test_types.h:7
int i
Definition: test_types.h:8
char word[30]
Definition: test_types.h:9