summaryrefslogtreecommitdiffhomepage
path: root/examples/ptr.c
blob: 3ffb92922f877c7b1166d49fd016fc031b8fffd3 (plain)
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
#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(pe, Person, Person_del, Person_compare);
using_cvec(pp, Person*, cptr_pe_del, cptr_pe_compare);

int main() {
    puts("Vec of Person *:");
    cvec_pp pvec = cvec_pp_init();
    cvec_pp_push_back(&pvec, Person_make(c_new(Person), "Joe", "Jordan"));
    cvec_pp_push_back(&pvec, Person_make(c_new(Person), "Annie", "Aniston"));
    cvec_pp_push_back(&pvec, Person_make(c_new(Person), "Jane", "Jacobs"));

    cvec_pp_sort(&pvec);
    c_foreach (i, cvec_pp, pvec)
        printf("%s %s\n", (*i.val)->name.str, (*i.val)->last.str);

    puts("\nVec of Person:");
    cvec_pe vec = cvec_pe_init();
    Person tmp;
    cvec_pe_push_back(&vec, *Person_make(&tmp, "Joe", "Jordan"));
    cvec_pe_push_back(&vec, *Person_make(&tmp, "Annie", "Aniston"));
    cvec_pe_push_back(&vec, *Person_make(&tmp, "Jane", "Jacobs"));

    cvec_pe_sort(&vec);
    c_foreach (i, cvec_pe, vec)
        printf("%s %s\n", i.val->name.str, i.val->last.str);

    puts("\nDestroy pvec:");
    cvec_pp_del(&pvec);
    puts("\nDestroy vec:");
    cvec_pe_del(&vec);
}