From e4c1dadb85e08d88fbc706e49a5d2b18b39fe0ed Mon Sep 17 00:00:00 2001 From: Tyge Løvset Date: Sun, 3 Jan 2021 10:50:41 +0100 Subject: Force template argument *clone* to be specified when *del* is specified for containers. Can be *c_no_clone* if clonable is not required. --- examples/complex.c | 4 ++-- examples/inits.c | 2 +- examples/mapmap.c | 2 +- examples/ptr.c | 6 +++--- examples/share_ptr.c | 4 ++-- examples/share_ptr2.c | 30 ------------------------------ stc/carray.h | 3 --- stc/ccommon.h | 15 ++++++++++----- stc/cdeq.h | 2 -- stc/clist.h | 2 -- stc/cmap.h | 11 ----------- stc/cptr.h | 8 +++----- stc/cvec.h | 2 -- 13 files changed, 22 insertions(+), 69 deletions(-) delete mode 100644 examples/share_ptr2.c 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 #include -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 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 -#include -#include -#include - -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() \ -- cgit v1.2.3