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