diff options
| author | Tyge Løvset <[email protected]> | 2021-01-02 20:59:48 +0100 |
|---|---|---|
| committer | Tyge Løvset <[email protected]> | 2021-01-02 20:59:48 +0100 |
| commit | 7afd74657220e0fb1fc05e9d0a053cfa2acc767a (patch) | |
| tree | 1cffb4bfee0bee258c196d4a4df58fbd48a88667 /examples/ptr.c | |
| parent | 5ef224ec36f91ec6b44f9574e2d832a5ce92750e (diff) | |
| download | STC-modified-7afd74657220e0fb1fc05e9d0a053cfa2acc767a.tar.gz STC-modified-7afd74657220e0fb1fc05e9d0a053cfa2acc767a.zip | |
Major upgrade: Added 'clone' template parameters to containers. Reorganized arg positions. Renamed csptr_X_share() to csptr_X_clone()
Diffstat (limited to 'examples/ptr.c')
| -rw-r--r-- | examples/ptr.c | 82 |
1 files changed, 47 insertions, 35 deletions
diff --git a/examples/ptr.c b/examples/ptr.c index a9c4d258..37138952 100644 --- a/examples/ptr.c +++ b/examples/ptr.c @@ -8,23 +8,30 @@ Person* Person_make(Person* p, const char* name, const char* last) { p->name = cstr_from(name), p->last = cstr_from(last);
return p;
}
+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;
+}
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;
+Person Person_clone(Person p) {
+ p.name = cstr_clone(p.name);
+ p.last = cstr_clone(p.last);
+ return p;
}
+// 1. cvec of Person struct
using_cvec(pe, Person, Person_compare, Person_del);
-using_cptr(pu, Person, Person_compare, Person_del);
-using_cvec(pu, Person*, cptr_pu_compare, cptr_pu_del);
-
-using_csptr(ps, Person, Person_compare, Person_del);
-using_cvec(ps, csptr_ps, csptr_ps_compare, csptr_ps_del);
+// 2. cvec of raw/owned pointers to Person
+using_cptr(pe, Person, Person_compare, Person_del);
+using_cvec(pp, Person*, cptr_pe_compare, cptr_pe_del, cptr_pe_clone);
+// 3. cvec of shared-ptr to Person
+using_csptr(pe, Person, Person_compare, Person_del);
+using_cvec(ps, csptr_pe, csptr_pe_compare, csptr_pe_del);
const char* names[] = {
"Joe", "Jordan",
@@ -33,36 +40,41 @@ const char* names[] = { };
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)
+ cvec_pe vec1 = cvec_inits;
+ cvec_pp vec2 = cvec_inits;
+ cvec_ps vec3 = cvec_inits;
+
+ for (int i = 0; i < 6; i += 2) {
+ Person tmp;
+ cvec_pe_push_back(&vec1, *Person_make(&tmp, names[i], names[i+1]));
+ cvec_pp_push_back(&vec2, Person_make(c_new(Person), names[i], names[i+1]));
+ cvec_ps_push_back(&vec3, csptr_pe_from(Person_make(c_new(Person), names[i], names[i+1])));
+ }
+ puts("1. sorted cvec of Person :");
+ cvec_pe_sort(&vec1);
+ c_foreach (i, cvec_pe, vec1)
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)
+ puts("\n2. sorted cvec of pointer to Person :");
+ cvec_pp_sort(&vec2);
+ c_foreach (i, cvec_pp, vec2)
printf(" %s %s\n", (*i.ref)->name.str, (*i.ref)->last.str);
+
+ puts("\n3. sorted cvec of shared-pointer to Person :");
+ cvec_ps_sort(&vec3);
+ c_foreach (i, cvec_ps, vec3)
+ printf(" %s %s\n", i.ref->get->name.str, i.ref->get->last.str);
+
+ // share vec3[1] with elem variable.
+ csptr_pe elem = csptr_pe_clone(vec3.data[1]);
- 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 vec3:");
+ cvec_ps_del(&vec3); // destroys all elements, but elem!
+ puts("\nDestroy vec2:");
+ cvec_pp_del(&vec2);
+ puts("\nDestroy vec1:");
+ cvec_pe_del(&vec1);
- 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);
+ puts("\nDestroy elem:");
+ csptr_pe_del(&elem);
}
\ No newline at end of file |
