summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorTyge Løvset <[email protected]>2021-01-03 10:50:41 +0100
committerTyge Løvset <[email protected]>2021-01-03 10:50:41 +0100
commite4c1dadb85e08d88fbc706e49a5d2b18b39fe0ed (patch)
tree731d91462d450fb848dd9125efdc8dc77c68d730
parent949c6b61cae7bb4665f47a6f27375dd450a23854 (diff)
downloadSTC-modified-e4c1dadb85e08d88fbc706e49a5d2b18b39fe0ed.tar.gz
STC-modified-e4c1dadb85e08d88fbc706e49a5d2b18b39fe0ed.zip
Force template argument *clone* to be specified when *del* is specified for containers. Can be *c_no_clone* if clonable is not required.
-rw-r--r--examples/complex.c4
-rw-r--r--examples/inits.c2
-rw-r--r--examples/mapmap.c2
-rw-r--r--examples/ptr.c6
-rw-r--r--examples/share_ptr.c4
-rw-r--r--examples/share_ptr2.c30
-rw-r--r--stc/carray.h3
-rw-r--r--stc/ccommon.h15
-rw-r--r--stc/cdeq.h2
-rw-r--r--stc/clist.h2
-rw-r--r--stc/cmap.h11
-rw-r--r--stc/cptr.h8
-rw-r--r--stc/cvec.h2
13 files changed, 22 insertions, 69 deletions
diff --git a/examples/complex.c b/examples/complex.c
index 6f665208..16aa75b7 100644
--- a/examples/complex.c
+++ b/examples/complex.c
@@ -5,8 +5,8 @@
void check_del(float* v) {printf("destroy %g\n", *v);}
-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_carray(f, float, check_del, c_default_clone); // normally omit the last 2 arguments - float type need no destroy.
+using_clist(a, carray2f, c_no_compare, carray2f_del, carray2f_clone);
using_cmap(l, int, clist_a, clist_a_del, clist_a_clone);
using_cmap_strkey(s, cmap_l, cmap_l_del, cmap_l_clone);
diff --git a/examples/inits.c b/examples/inits.c
index 59ed0ad2..320e5b9a 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, cstr_del); // Map of int -> cstr
+using_cmap(id, int, cstr, cstr_del, cstr_clone); // Map of int -> cstr
using_cmap_strkey(cnt, int);
typedef struct {int x, y;} ipair_t;
diff --git a/examples/mapmap.c b/examples/mapmap.c
index 1128387d..a56a30db 100644
--- a/examples/mapmap.c
+++ b/examples/mapmap.c
@@ -4,7 +4,7 @@
#include <stc/cstr.h>
using_cmap_str();
-using_cmap_strkey(cfg, cmap_str, cmap_str_del);
+using_cmap_strkey(cfg, cmap_str, cmap_str_del, cmap_str_clone);
int main(void) {
cmap_cfg config = cmap_inits;
diff --git a/examples/ptr.c b/examples/ptr.c
index 37138952..a7b18ad5 100644
--- a/examples/ptr.c
+++ b/examples/ptr.c
@@ -23,15 +23,15 @@ Person Person_clone(Person p) {
}
// 1. cvec of Person struct
-using_cvec(pe, Person, Person_compare, Person_del);
+using_cvec(pe, Person, Person_compare, Person_del, Person_clone);
// 2. cvec of raw/owned pointers to Person
-using_cptr(pe, Person, Person_compare, Person_del);
+using_cptr(pe, Person, Person_compare, Person_del, Person_clone);
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);
+using_cvec(ps, csptr_pe, csptr_pe_compare, csptr_pe_del, csptr_pe_clone);
const char* names[] = {
"Joe", "Jordan",
diff --git a/examples/share_ptr.c b/examples/share_ptr.c
index 18739d29..9387bd61 100644
--- a/examples/share_ptr.c
+++ b/examples/share_ptr.c
@@ -20,8 +20,8 @@ int Person_compare(const Person* p, const Person* q) {
}
using_csptr(pe, Person, Person_compare, Person_del);
-using_clist(pe, csptr_pe, csptr_pe_compare, csptr_pe_del);
-using_cvec(pe, csptr_pe, csptr_pe_compare, csptr_pe_del);
+using_clist(pe, csptr_pe, csptr_pe_compare, csptr_pe_del, csptr_pe_clone);
+using_cvec(pe, csptr_pe, csptr_pe_compare, csptr_pe_del, csptr_pe_clone);
int main() {
clist_pe queue = clist_pe_init();
diff --git a/examples/share_ptr2.c b/examples/share_ptr2.c
deleted file mode 100644
index 34abcd74..00000000
--- a/examples/share_ptr2.c
+++ /dev/null
@@ -1,30 +0,0 @@
-#include <stc/cptr.h>
-#include <stc/cmap.h>
-#include <stc/cstr.h>
-#include <stdio.h>
-
-typedef struct { cstr_t name, last; } Person;
-
-Person* Person_from(Person* p, cstr_t name, cstr_t last) {
- p->name = name, p->last = last;
- return p;
-}
-void Person_del(Person* p) {
- c_del(cstr, &p->name, &p->last);
-}
-
-using_csptr(ps, Person, c_no_compare, Person_del);
-using_cmap(ps, int, csptr_ps, csptr_ps_del);
-
-
-int main() {
- cmap_ps map = cmap_ps_init();
- c_forrange (i, 20) {
- c_try_emplace(&map, cmap_ps, (i * 7) % 10,
- csptr_ps_from(Person_from(c_new(Person), cstr_from_fmt("Name %d", (i * 7) % 10),
- cstr_from_fmt("Last %d", (i * 9) % 10))));
- }
- c_foreach (i, cmap_ps, map)
- printf(" %d: %s\n", i.ref->first, i.ref->second.get->name.str);
- cmap_ps_del(&map);
-} \ No newline at end of file
diff --git a/stc/carray.h b/stc/carray.h
index 12a97853..5e036b5b 100644
--- a/stc/carray.h
+++ b/stc/carray.h
@@ -50,9 +50,6 @@ int main()
#define using_carray_2(X, Value) \
using_carray_4(X, Value, c_default_del, c_default_clone)
-#define using_carray_3(X, Value, valueDestroy) \
- using_carray_4(X, Value, valueDestroy, Value##_clone)
-
#define using_carray_4(X, Value, valueDestroy, valueClone) \
\
typedef Value carray1##X##_value_t; \
diff --git a/stc/ccommon.h b/stc/ccommon.h
index a2d11729..797180ce 100644
--- a/stc/ccommon.h
+++ b/stc/ccommon.h
@@ -74,16 +74,21 @@
#define c_realloc(p, sz) realloc(p, sz)
#define c_free(p) free(p)
#endif
+
#define c_swap(T, x, y) do { T __t = x; x = y; y = __t; } while (0)
-#define c_no_compare(x, y) (0)
-#define c_mem_equals(x, y) (memcmp(x, y, sizeof *(x)) == 0)
-#define c_default_equals(x, y) (*(x) == *(y))
+
+#define c_default_compare(x, y) c_less_compare(c_default_less, x, y)
#define c_default_less(x, y) (*(x) < *(y))
#define c_less_compare(less, x, y) (less(y, x) - less(x, y))
-#define c_default_compare(x, y) c_less_compare(c_default_less, x, y)
-#define c_default_from_raw(x) (x)
+#define c_no_compare(x, y) (0)
+
+#define c_default_equals(x, y) (*(x) == *(y))
+#define c_mem_equals(x, y) (memcmp(x, y, sizeof *(x)) == 0)
+
#define c_default_clone(x) (x)
+#define c_no_clone(x) (assert(!"c_no_clone"), x)
#define c_default_to_raw(ptr) (*(ptr))
+
#define c_default_del(ptr) ((void) (ptr))
/* Generic algorithms */
diff --git a/stc/cdeq.h b/stc/cdeq.h
index 38445649..3339ac07 100644
--- a/stc/cdeq.h
+++ b/stc/cdeq.h
@@ -34,8 +34,6 @@
using_cdeq_3(X, Value, c_default_compare)
#define using_cdeq_3(X, Value, valueCompare) \
using_cdeq_5(X, Value, valueCompare, c_default_del, c_default_clone)
-#define using_cdeq_4(X, Value, valueCompare, valueDestroy) \
- using_cdeq_5(X, Value, valueCompare, valueDestroy, Value##_clone)
#define using_cdeq_5(X, Value, valueCompare, valueDestroy, valueClone) \
using_cdeq_7(X, Value, valueCompare, valueDestroy, valueClone, c_default_to_raw, Value)
#define using_cdeq_str() \
diff --git a/stc/clist.h b/stc/clist.h
index 7c18b818..5c5a5db5 100644
--- a/stc/clist.h
+++ b/stc/clist.h
@@ -60,8 +60,6 @@
using_clist_3(X, Value, c_default_compare)
#define using_clist_3(X, Value, valueCompare) \
using_clist_5(X, Value, valueCompare, c_default_del, c_default_clone)
-#define using_clist_4(X, Value, valueCompare, valueDestroy) \
- using_clist_5(X, Value, valueCompare, valueDestroy, Value##_clone)
#define using_clist_5(X, Value, valueCompare, valueDestroy, valueClone) \
using_clist_7(X, Value, valueCompare, valueDestroy, valueClone, c_default_to_raw, Value)
#define using_clist_str() \
diff --git a/stc/cmap.h b/stc/cmap.h
index edeacfa9..ea766636 100644
--- a/stc/cmap.h
+++ b/stc/cmap.h
@@ -75,9 +75,6 @@ typedef struct {size_t idx; uint32_t hx;} cmap_bucket_t, cset_bucket_t;
#define using_cmap_3(X, Key, Mapped) \
using_cmap_5(X, Key, Mapped, c_default_del, c_default_clone)
-#define using_cmap_4(X, Key, Mapped, mappedDel) \
- using_cmap_5(X, Key, Mapped, mappedDel, Mapped##_clone)
-
#define using_cmap_5(X, Key, Mapped, mappedDel, mappedClone) \
using_cmap_7(X, Key, Mapped, mappedDel, mappedClone, c_default_equals, c_default_hash)
@@ -108,9 +105,6 @@ typedef struct {size_t idx; uint32_t hx;} cmap_bucket_t, cset_bucket_t;
#define using_cset_4(X, Key, keyEquals, keyHash) \
using_cset_6(X, Key, keyEquals, keyHash, c_default_del, c_default_clone)
-#define using_cset_5(X, Key, keyEquals, keyHash, keyDel) \
- using_cset_6(X, Key, keyEquals, keyHash, keyDel, Key##_clone)
-
#define using_cset_6(X, Key, keyEquals, keyHash, keyDel, keyClone) \
using_cset_8(X, Key, keyEquals, keyHash, keyDel, keyClone, c_default_to_raw, Key)
@@ -129,8 +123,6 @@ typedef struct {size_t idx; uint32_t hx;} cmap_bucket_t, cset_bucket_t;
c_MACRO_OVERLOAD(using_cmap_strkey, __VA_ARGS__)
#define using_cmap_strkey_2(X, Mapped) \
_using_CHASH_strkey(X, cmap, Mapped, c_default_del, c_default_clone)
-#define using_cmap_strkey_3(X, Mapped, mappedDel) \
- _using_CHASH_strkey(X, cmap, Mapped, mappedDel, Mapped##_clone)
#define using_cmap_strkey_4(X, Mapped, mappedDel, mappedClone) \
_using_CHASH_strkey(X, cmap, Mapped, mappedDel, mappedClone)
@@ -143,9 +135,6 @@ typedef struct {size_t idx; uint32_t hx;} cmap_bucket_t, cset_bucket_t;
#define using_cmap_strval_4(X, Key, keyEquals, keyHash) \
using_cmap_strval_6(X, Key, keyEquals, keyHash, c_default_del, c_default_clone)
-#define using_cmap_strval_5(X, Key, keyEquals, keyHash, keyDel) \
- using_cmap_strval_6(X, Key, keyEquals, keyHash, keyDel, Key##_clone)
-
#define using_cmap_strval_6(X, Key, keyEquals, keyHash, keyDel, keyClone) \
using_cmap_strval_8(X, Key, keyEquals, keyHash, keyDel, keyClone, c_default_to_raw, Key)
diff --git a/stc/cptr.h b/stc/cptr.h
index d028977c..41af8810 100644
--- a/stc/cptr.h
+++ b/stc/cptr.h
@@ -67,9 +67,6 @@ int main() {
#define using_cptr_3(X, Value, valueCompare) \
using_cptr_5(X, Value, valueCompare, c_default_del, c_default_clone)
-#define using_cptr_4(X, Value, valueCompare, valueDestroy) \
- using_cptr_5(X, Value, valueCompare, valueDestroy, Value##_clone)
-
#define using_cptr_5(X, Value, valueCompare, valueDestroy, valueClone) \
typedef Value cptr_##X##_value_t; \
typedef cptr_##X##_value_t *cptr_##X; \
@@ -157,8 +154,6 @@ typedef long atomic_count_t;
}
#endif
-#define csptr_pointer_compare(x, y) ((x)->get - (y)->get)
-
#define using_csptr(...) c_MACRO_OVERLOAD(using_csptr, __VA_ARGS__)
#define using_csptr_2(X, Value) \
@@ -167,6 +162,9 @@ typedef long atomic_count_t;
#define using_csptr_3(X, Value, valueCompare) \
using_csptr_4(X, Value, valueCompare, c_default_del)
+#define using_csptr_5(X, Value, valueCompare, valueDestroy, dummyValueClone) \
+ using_csptr_4(X, Value, valueCompare, valueDestroy)
+
#define using_csptr_4(X, Value, valueCompare, valueDestroy) \
typedef Value csptr_##X##_value_t; \
typedef struct { csptr_##X##_value_t* get; atomic_count_t* use_count; } csptr_##X; \
diff --git a/stc/cvec.h b/stc/cvec.h
index 62fc9ea3..0e35145a 100644
--- a/stc/cvec.h
+++ b/stc/cvec.h
@@ -34,8 +34,6 @@
using_cvec_3(X, Value, c_default_compare)
#define using_cvec_3(X, Value, valueCompare) \
using_cvec_5(X, Value, valueCompare, c_default_del, c_default_clone)
-#define using_cvec_4(X, Value, valueCompare, valueDestroy) \
- using_cvec_5(X, Value, valueCompare, valueDestroy, Value##_clone)
#define using_cvec_5(X, Value, valueCompare, valueDestroy, valueClone) \
using_cvec_7(X, Value, valueCompare, valueDestroy, valueClone, c_default_to_raw, Value)
#define using_cvec_str() \