From 40f41d2d717431023c8b835ac48bd6b90e630aa5 Mon Sep 17 00:00:00 2001 From: Tyge Løvset Date: Sun, 27 Sep 2020 22:36:38 +0200 Subject: Fixed csptr and examples. --- examples/share_ptr.c | 14 ++++++++++---- examples/share_ptr2.c | 10 +++++----- stc/cdefs.h | 2 +- stc/cptr.h | 37 ++++++++++++++++++++----------------- 4 files changed, 36 insertions(+), 27 deletions(-) diff --git a/examples/share_ptr.c b/examples/share_ptr.c index 5f5a0cc7..28f1975c 100644 --- a/examples/share_ptr.c +++ b/examples/share_ptr.c @@ -6,7 +6,7 @@ typedef struct { cstr_t name, last; } Person; -Person* Person_from(Person* p, const char* name, const char* last) { +Person* Person_make(Person* p, const char* name, const char* last) { p->name = cstr(name), p->last = cstr(last); return p; } @@ -27,9 +27,13 @@ int main() { clist_pe queue = clist_pe_init(); cvec_pe vec = cvec_pe_init(); + csptr_pe joe = csptr_pe_make((Person) {cstr("Joe"), cstr("Jordan")}); + clist_pe_push_back(&queue, csptr_pe_share(joe)); + cvec_pe_push_back(&vec, csptr_pe_share(joe)); + puts("Push 10:"); c_forrange (i, 10) { - csptr_pe p = csptr_pe_make(c_new(Person)); + csptr_pe p = csptr_pe_from(c_new(Person)); p.get->name = cstr_from("Name %d", (i * 7) % 10); p.get->last = cstr_from("Last %d", (i * 7) % 10); clist_pe_push_back(&queue, p); @@ -53,13 +57,15 @@ int main() { c_foreach (i, cvec_pe, vec) printf(" %s\n", i.val->get->name.str); - Person lost; Person_from(&lost, "Name 5", "Last 5"); + Person lost; Person_make(&lost, "Name 5", "Last 5"); csptr_pe ptmp = {&lost, NULL}; // share pointer without counter - OK. clist_pe_iter_t lit = clist_pe_find(&queue, ptmp); Person_del(&lost); - if (lit.val) printf("Found: %s\n", lit.val->get->name.str); + printf("use %ld\n", *joe.use_count); + csptr_pe_del(&joe); + puts("Destroy queue:"); clist_pe_del(&queue); diff --git a/examples/share_ptr2.c b/examples/share_ptr2.c index 1b90f49e..4c589ad1 100644 --- a/examples/share_ptr2.c +++ b/examples/share_ptr2.c @@ -5,12 +5,12 @@ typedef struct { cstr_t name, last; } Person; -Person* Person_make(Person* p, cstr_t name, cstr_t last) { +Person* Person_from(Person* p, cstr_t name, cstr_t last) { printf("make %s\n", name.str); p->name = name, p->last = last; return p; } -Person* Person_from(Person* p, const char* name, const char* last) { +Person* Person_make(Person* p, const char* name, const char* last) { p->name = cstr(name), p->last = cstr(last); return p; } @@ -19,7 +19,7 @@ void Person_del(Person* p) { c_del(cstr, &p->name, &p->last); } -using_csptr(pe, Person, Person_del); +using_csptr(pe, Person, Person_del, c_no_compare); using_cmap(pe, int, csptr_pe, csptr_pe_del); @@ -30,10 +30,10 @@ int main() { // c_try_emplace: The last argument is completely ignored if key already exist in map, so no memory leak happens! c_forrange (i, 20) { // When i>9, all key will exist, so value arg is not executed. c_try_emplace(&map, cmap_pe, (i * 7) % 10, - csptr_pe_make(Person_make(c_new(Person), cstr_from("Name %d", (i * 7) % 10), + csptr_pe_from(Person_from(c_new(Person), cstr_from("Name %d", (i * 7) % 10), cstr_from("Last %d", (i * 9) % 10)))); } - c_try_emplace(&map, cmap_pe, 11, csptr_pe_make(Person_from(c_new(Person), "Hello", "world!"))); + c_try_emplace(&map, cmap_pe, 11, csptr_pe_from(Person_make(c_new(Person), "Hello", "World!"))); c_foreach (i, cmap_pe, map) printf(" %d: %s\n", i.val->first, i.val->second.get->name.str); diff --git a/stc/cdefs.h b/stc/cdefs.h index 7bf37189..3a246372 100644 --- a/stc/cdefs.h +++ b/stc/cdefs.h @@ -73,7 +73,7 @@ enum {_c_max_buffer = 512}; #define c_default_equals(x, y) (*(x) == *(y)) #define c_default_less(x, y) (*(x) < *(y)) #define c_less_compare(less, x, y) (less(x, y) ? -1 : less(y, x)) -#define c_default_compare(x, y) c_less_compare(c_default_less, x, y) +#define c_default_compare(x, y) (*(x) - *(y)) #define c_default_from_raw(x) (x) #define c_default_to_raw(ptr) (*(ptr)) #define c_default_del(ptr) ((void) (ptr)) diff --git a/stc/cptr.h b/stc/cptr.h index c4421a37..c3ab1f74 100644 --- a/stc/cptr.h +++ b/stc/cptr.h @@ -53,7 +53,7 @@ int main() { cvec_pe vec = cvec_pe_init(); cvec_pe_push_back(&vec, Person_make(c_new(Person), "Joe", "Jordan")); cvec_pe_push_back(&vec, Person_make(c_new(Person), "Jane", "Jacobs")); - + c_foreach (i, cvec_pe, vec) printf("%s %s\n", (*i.val)->name.str, (*i.val)->last.str); cvec_pe_del(&vec); @@ -62,7 +62,13 @@ int main() { #define using_cptr(...) c_MACRO_OVERLOAD(using_cptr, __VA_ARGS__) +#define using_cptr_2(X, Value) \ + using_cptr_3(X, Value, c_default_del) + #define using_cptr_3(X, Value, valueDestroy) \ + using_cptr_4(X, Value, valueDestroy, c_default_compare) + +#define using_cptr_4(X, Value, valueDestroy, valueCompare) \ typedef Value cptr_##X##_value_t; \ typedef cptr_##X##_value_t *cptr_##X; \ \ @@ -77,16 +83,12 @@ int main() { cptr_##X##_del(self); \ *self = p; \ } \ - typedef cptr_##X cptr_##X##_t - -#define using_cptr_4(X, Value, valueDestroy, valueCompare) \ - using_cptr_3(X, Value, valueDestroy); \ +\ STC_INLINE int \ cptr_##X##_compare(cptr_##X* x, cptr_##X* y) { \ return valueCompare(*x, *y); \ } \ - typedef int cptr_##X##_dud4 - + typedef cptr_##X cptr_##X##_t @@ -153,16 +155,24 @@ typedef long atomic_count_t; using_csptr_3(X, Value, c_default_del) #define using_csptr_3(X, Value, valueDestroy) \ + using_csptr_4(X, Value, valueDestroy, c_default_compare) + +#define using_csptr_4(X, Value, valueDestroy, valueCompare) \ typedef Value csptr_##X##_value_t; \ typedef struct { csptr_##X##_value_t* get; atomic_count_t* use_count; } csptr_##X; \ \ STC_INLINE csptr_##X \ - csptr_##X##_make(csptr_##X##_value_t* p) { \ + csptr_##X##_from(csptr_##X##_value_t* p) { \ csptr_##X ptr = {p}; \ if (p) *(ptr.use_count = c_new_1(atomic_count_t)) = 1; \ return ptr; \ } \ STC_INLINE csptr_##X \ + csptr_##X##_make(csptr_##X##_value_t val) { \ + csptr_##X ptr = {c_new_1(csptr_##X##_value_t), c_new_1(atomic_count_t)}; \ + *ptr.get = val, *ptr.use_count = 1; return ptr; \ + } \ + STC_INLINE csptr_##X \ csptr_##X##_share(csptr_##X ptr) { \ if (ptr.use_count) atomic_increment(ptr.use_count); \ return ptr; \ @@ -179,20 +189,13 @@ typedef long atomic_count_t; STC_INLINE void \ csptr_##X##_reset(csptr_##X* self, csptr_##X##_value_t* p) { \ csptr_##X##_del(self); \ - *self = csptr_##X##_make(p); \ + *self = csptr_##X##_from(p); \ } \ \ - typedef csptr_##X csptr_##X##_t - - -#define using_csptr_4(X, Value, valueDestroy, valueCompare) \ - using_csptr_3(X, Value, valueDestroy); \ STC_INLINE int \ csptr_##X##_compare(csptr_##X* x, csptr_##X* y) { \ return valueCompare(x->get, y->get); \ } \ - typedef int csptr_##X##_dud4 - + typedef csptr_##X csptr_##X##_t #endif - \ No newline at end of file -- cgit v1.2.3