summaryrefslogtreecommitdiffhomepage
path: root/examples/sharedptr.c
blob: dbb3746fb18154f80f480049e959f2fb602cc652 (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
51
52
53
#include <stdio.h>

void int_del(int* x) { printf("del: %d\n", *x); }

#define i_val int
#define i_valdel int_del      // optional func to show elements destroyed
#include <stc/csptr.h>        // csptr_int: shared pointer to int

#define i_key_csptr csptr_int
#define i_tag intp
#include <stc/csset.h>        // csset_intp: csset<csptr_int>

#define i_val_csptr csptr_int
#define i_tag intp
#include <stc/cvec.h>         // cvec_intp: cvec<csptr_int>

int main()
{
    c_auto (cvec_intp, vec)
    c_auto (csset_intp, set)   // declare and init set, call del at scope exit
    {
        c_apply(cvec_intp, push_back, &vec, {
            csptr_int_make(2021),
            csptr_int_make(2012),
            csptr_int_make(2022),
            csptr_int_make(2015),
        });
        printf("vec:");
        c_foreach (i, cvec_intp, vec) printf(" %d", *i.ref->get);
        puts("");

        // add odd numbers from vec to set
        c_foreach (i, cvec_intp, vec)
            if (*i.ref->get & 1)
                csset_intp_emplace(&set, *i.ref); // copy shared pointer => increments counter.

        // erase the two last elements in vec
        cvec_intp_pop_back(&vec);
        cvec_intp_pop_back(&vec);

        printf("vec:");
        c_foreach (i, cvec_intp, vec) printf(" %d", *i.ref->get);

        printf("\nset:");
        c_foreach (i, csset_intp, set) printf(" %d", *i.ref->get);

        c_autovar (csptr_int p = csptr_int_clone(vec.data[0]), csptr_int_del(&p)) {
            printf("\n%d is now owned by %lu objects\n", *p.get, *p.use_count);
        }

        puts("Done");
    }
}