diff options
| author | Tyge Løvset <[email protected]> | 2021-01-03 10:50:41 +0100 |
|---|---|---|
| committer | Tyge Løvset <[email protected]> | 2021-01-03 10:50:41 +0100 |
| commit | e4c1dadb85e08d88fbc706e49a5d2b18b39fe0ed (patch) | |
| tree | 731d91462d450fb848dd9125efdc8dc77c68d730 | |
| parent | 949c6b61cae7bb4665f47a6f27375dd450a23854 (diff) | |
| download | STC-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.c | 4 | ||||
| -rw-r--r-- | examples/inits.c | 2 | ||||
| -rw-r--r-- | examples/mapmap.c | 2 | ||||
| -rw-r--r-- | examples/ptr.c | 6 | ||||
| -rw-r--r-- | examples/share_ptr.c | 4 | ||||
| -rw-r--r-- | examples/share_ptr2.c | 30 | ||||
| -rw-r--r-- | stc/carray.h | 3 | ||||
| -rw-r--r-- | stc/ccommon.h | 15 | ||||
| -rw-r--r-- | stc/cdeq.h | 2 | ||||
| -rw-r--r-- | stc/clist.h | 2 | ||||
| -rw-r--r-- | stc/cmap.h | 11 | ||||
| -rw-r--r-- | stc/cptr.h | 8 | ||||
| -rw-r--r-- | stc/cvec.h | 2 |
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 */
@@ -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() \
@@ -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)
@@ -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; \
@@ -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() \
|
