summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorTyge Løvset <[email protected]>2020-09-27 22:36:38 +0200
committerTyge Løvset <[email protected]>2020-09-27 22:36:38 +0200
commit40f41d2d717431023c8b835ac48bd6b90e630aa5 (patch)
tree0fde6e304c42d9117be8bcff120b196f1e7da67d
parentfa79e56bce051e43cbd236c96039b528b1f4ae98 (diff)
downloadSTC-modified-40f41d2d717431023c8b835ac48bd6b90e630aa5.tar.gz
STC-modified-40f41d2d717431023c8b835ac48bd6b90e630aa5.zip
Fixed csptr and examples.
-rw-r--r--examples/share_ptr.c14
-rw-r--r--examples/share_ptr2.c10
-rw-r--r--stc/cdefs.h2
-rw-r--r--stc/cptr.h37
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