1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
|
#include <stc/cptr.h>
#include <stc/cstr.h>
#include <stc/cvec.h>
typedef struct { cstr_t name, last; } Person;
Person* Person_make(Person* p, const char* name, const char* last) {
p->name = cstr_from(name), p->last = cstr_from(last);
return p;
}
void Person_del(Person* p) {
printf("del: %s\n", p->name.str);
c_del(cstr, &p->name, &p->last);
}
int Person_compare(const Person* p, const Person* q) {
int cmp = strcmp(p->name.str, q->name.str);
return cmp == 0 ? strcmp(p->last.str, q->last.str) : cmp;
}
using_cvec(pe, Person, Person_del, Person_compare);
using_cptr(pu, Person, Person_del, Person_compare);
using_cvec(pu, Person*, cptr_pu_del, cptr_pu_compare);
using_csptr(ps, Person, Person_del, Person_compare);
using_cvec(ps, csptr_ps, csptr_ps_del, csptr_ps_compare);
const char* names[] = {
"Joe", "Jordan",
"Annie", "Aniston",
"Jane", "Jacobs"
};
int main() {
Person tmp;
cvec_pe vec = cvec_inits;
for (int i=0;i<6; i+=2) cvec_pe_push_back(&vec, *Person_make(&tmp, names[i], names[i+1]));
puts("cvec of Person:");
cvec_pe_sort(&vec);
c_foreach (i, cvec_pe, vec)
printf(" %s %s\n", i.ref->name.str, i.ref->last.str);
cvec_pu uvec = cvec_inits;
for (int i=0;i<6; i+=2) cvec_pu_push_back(&uvec, Person_make(c_new(Person), names[i], names[i+1]));
puts("cvec of cptr<Person>:");
cvec_pu_sort(&uvec);
c_foreach (i, cvec_pu, uvec)
printf(" %s %s\n", (*i.ref)->name.str, (*i.ref)->last.str);
cvec_ps svec = cvec_inits;
for (int i=0;i<6; i+=2) cvec_ps_push_back(&svec, csptr_ps_from(Person_make(c_new(Person), names[i], names[i+1])));
puts("cvec of csptr<Person>:");
cvec_ps_sort(&svec);
c_foreach (i, cvec_ps, svec)
printf(" %s %s\n", (*i.ref).get->name.str, (*i.ref).get->last.str);
csptr_ps x = csptr_ps_share(svec.data[1]);
puts("\nDestroy svec:");
cvec_ps_del(&svec);
puts("\nDestroy pvec:");
cvec_pu_del(&uvec);
puts("\nDestroy vec:");
cvec_pe_del(&vec);
puts("\nDestroy x:");
csptr_ps_del(&x);
}
|