From 7afd74657220e0fb1fc05e9d0a053cfa2acc767a Mon Sep 17 00:00:00 2001 From: Tyge Løvset Date: Sat, 2 Jan 2021 20:59:48 +0100 Subject: Major upgrade: Added 'clone' template parameters to containers. Reorganized arg positions. Renamed csptr_X_share() to csptr_X_clone() --- examples/advanced.c | 5 ++-- examples/complex.c | 42 +++++++++++++-------------- examples/demos.c | 4 +-- examples/inits.c | 2 +- examples/ptr.c | 82 ++++++++++++++++++++++++++++++---------------------- examples/share_ptr.c | 6 ++-- 6 files changed, 77 insertions(+), 64 deletions(-) (limited to 'examples') diff --git a/examples/advanced.c b/examples/advanced.c index b3f2f380..bad0346e 100644 --- a/examples/advanced.c +++ b/examples/advanced.c @@ -50,8 +50,9 @@ Viking viking_fromVw(VikingVw vw) { } // Using the full using_cmap() macro to define [Viking -> int] hash map type: -using_cmap(vk, Viking, int, c_default_del, vikingvw_equals, vikingvw_hash, viking_del, - viking_fromVw, viking_toVw, VikingVw); +using_cmap(vk, Viking, int, c_default_del, c_default_clone, + vikingvw_equals, vikingvw_hash, + viking_del, viking_fromVw, viking_toVw, VikingVw); // cmap_vk uses vikingvw_hash() for hash value calculations, and vikingvw_equals() for equality test. // cmap_vk_del() will free all memory allocated for Viking keys and the hash table values. diff --git a/examples/complex.c b/examples/complex.c index 3dbf683d..6f665208 100644 --- a/examples/complex.c +++ b/examples/complex.c @@ -5,33 +5,33 @@ void check_del(float* v) {printf("destroy %g\n", *v);} -using_carray(f, float, check_del); // normally omit the last argument - float type need no destroy. -using_clist(y, carray2f, c_no_compare, carray2f_del); -using_cmap(g, int, clist_y, clist_y_del); -using_cmap_strkey(s, cmap_g, cmap_g_del); +using_carray(f, float, check_del, c_default_clone); // normally omit the last argument - float type need no destroy. +using_clist(a, carray2f, c_no_compare, carray2f_del); +using_cmap(l, int, clist_a, clist_a_del, clist_a_clone); +using_cmap_strkey(s, cmap_l, cmap_l_del, cmap_l_clone); int main() { int xdim = 4, ydim = 6; int x = 1, y = 5, tableKey = 42; const char* strKey = "first"; + cmap_l listMap = cmap_inits; + cmap_s myMap = cmap_inits; - { // Construct. - carray2f table = carray2f_init(ydim, xdim, 0.f); - printf("table: (%zu, %zu)\n", carray2_ydim(table), carray2_xdim(table)); - clist_y tableList = clist_inits; - // Put in some data. - cmap_g listMap = cmap_inits; - - *carray2f_at(&table, y, x) = 3.1415927f; // table[y][x] - clist_y_push_back(&tableList, table); - cmap_g_put(&listMap, tableKey, tableList); - cmap_s_put(&myMap, strKey, listMap); - } - { // Access the data entry - carray2f table = *clist_y_back(&cmap_g_find(&cmap_s_find(&myMap, strKey)->second, tableKey)->second); - printf("value (%d, %d) is: %f\n", y, x, *carray2f_at(&table, y, x)); - } + // Construct. + carray2f arr_a = carray2f_init(ydim, xdim, 0.f); + printf("arr_a: (%zu, %zu)\n", carray2f_ydim(arr_a), carray2f_xdim(arr_a)); + + clist_a tableList = clist_inits; + // Put in some data. + *carray2f_at(&arr_a, y, x) = 3.1415927f; // aa[y][x] + clist_a_push_back(&tableList, arr_a); + cmap_l_put(&listMap, tableKey, tableList); + cmap_s_put(&myMap, strKey, listMap); + + // Access the data entry + carray2f arr_b = *clist_a_back(&cmap_l_find(&cmap_s_find(&myMap, strKey)->second, tableKey)->second); + printf("value (%d, %d) is: %f\n", y, x, *carray2f_at(&arr_b, y, x)); cmap_s_del(&myMap); // free up everything! -} \ No newline at end of file +} diff --git a/examples/demos.c b/examples/demos.c index 5833bc5c..e460591b 100644 --- a/examples/demos.c +++ b/examples/demos.c @@ -185,8 +185,8 @@ void arraydemo1() carray2f a2 = carray3f_at1(&a3, 5); // sub-array reference: a2 = a3[5] carray1f a1 = carray3f_at2(&a3, 5, 4); // sub-array reference: a1 = a3[5][4] - printf("a3: %zu: (%zu, %zu, %zu) = %zu\n", sizeof(a3), carray3_xdim(a3), carray3_ydim(a3), carray3_zdim(a3), carray3_size(a3)); - printf("a2: %zu: (%zu, %zu) = %zu\n", sizeof(a2), carray2_xdim(a2), carray2_ydim(a2), carray2_size(a2)); + printf("a3: %zu: (%zu, %zu, %zu) = %zu\n", sizeof(a3), carray3f_xdim(a3), carray3f_ydim(a3), carray3f_zdim(a3), carray3f_size(a3)); + printf("a2: %zu: (%zu, %zu) = %zu\n", sizeof(a2), carray2f_xdim(a2), carray2f_ydim(a2), carray2f_size(a2)); printf("%f\n", a1.data[3]); // lookup a1[3] (=10.2f) printf("%f\n", *carray2f_at(&a2, 4, 3)); // lookup a2[4][3] (=10.2f) diff --git a/examples/inits.c b/examples/inits.c index 9138c5bb..59ed0ad2 100644 --- a/examples/inits.c +++ b/examples/inits.c @@ -5,7 +5,7 @@ #include #include -using_cmap(id, int, cstr_t, cstr_del); // Map of int -> cstr_t +using_cmap(id, int, cstr, cstr_del); // Map of int -> cstr using_cmap_strkey(cnt, int); typedef struct {int x, y;} ipair_t; 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:"); - 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:"); - 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 diff --git a/examples/share_ptr.c b/examples/share_ptr.c index 785333d0..18739d29 100644 --- a/examples/share_ptr.c +++ b/examples/share_ptr.c @@ -29,8 +29,8 @@ int main() { Person tmp = {cstr_from("Joe"), cstr_from("Jordan")}; csptr_pe joe = csptr_pe_make(tmp); - clist_pe_push_back(&queue, csptr_pe_share(joe)); - cvec_pe_push_back(&vec, csptr_pe_share(joe)); + clist_pe_push_back(&queue, csptr_pe_clone(joe)); + cvec_pe_push_back(&vec, csptr_pe_clone(joe)); puts("Push 10:"); c_forrange (i, 10) { @@ -38,7 +38,7 @@ int main() { p.get->name = cstr_from_fmt("Name %d", (i * 7) % 10); p.get->last = cstr_from_fmt("Last %d", (i * 7) % 10); clist_pe_push_back(&queue, p); - cvec_pe_push_back(&vec, csptr_pe_share(p)); // Don't forget to share! + cvec_pe_push_back(&vec, csptr_pe_clone(p)); // Don't forget to share! } c_foreach (i, clist_pe, queue) printf(" %s\n", i.ref->get->name.str); -- cgit v1.2.3