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 | |
| 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')
| -rw-r--r-- | examples/advanced.c | 5 | ||||
| -rw-r--r-- | examples/complex.c | 42 | ||||
| -rw-r--r-- | examples/demos.c | 4 | ||||
| -rw-r--r-- | examples/inits.c | 2 | ||||
| -rw-r--r-- | examples/ptr.c | 82 | ||||
| -rw-r--r-- | examples/share_ptr.c | 6 |
6 files changed, 77 insertions, 64 deletions
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 <stc/cpque.h>
#include <stc/clist.h>
-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<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 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);
|
