From 36097d97ec2c446732daa2cb8c88b5e10717452c Mon Sep 17 00:00:00 2001 From: Tyge Løvset Date: Mon, 4 Jan 2021 20:03:51 +0100 Subject: Added cmap_X_value_del() and added convert.c example. --- docs/cdeq_api.md | 4 ++-- docs/clist_api.md | 2 +- docs/cmap_api.md | 5 +++-- docs/cpque_api.md | 4 +++- docs/cqueue_api.md | 2 ++ docs/cset_api.md | 4 ++-- docs/cvec_api.md | 2 +- examples/convert.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ stc/ccommon.h | 4 ++-- stc/cmap.h | 5 +++++ 10 files changed, 67 insertions(+), 11 deletions(-) create mode 100644 examples/convert.c diff --git a/docs/cdeq_api.md b/docs/cdeq_api.md index 701b5dc8..83c2779e 100644 --- a/docs/cdeq_api.md +++ b/docs/cdeq_api.md @@ -70,7 +70,7 @@ cdeq_X_value_t* cdeq_X_at(cdeq_X* self, size_t idx); cdeq_X_value_t* cdeq_X_front(cdeq_X* self); cdeq_X_value_t* cdeq_X_back(cdeq_X* self); -void cdeq_X_push_n(cdeq_X *self, const cdeq_X_input_t arr[], size_t size); +void cdeq_X_push_n(cdeq_X *self, const cdeq_X_rawvalue_t arr[], size_t size); void cdeq_X_push_front(cdeq_X* self, Value value); void cdeq_X_push_back(cdeq_X* self, Value value); void cdeq_X_emplace_front(cdeq_X* self, RawValue raw); @@ -106,7 +106,7 @@ void cdeq_X_next(cdeq_X_iter_t* it); cdeq_X_value_t* cdeq_X_itval(cdeq_X_iter_t it); size_t cdeq_X_index(const cdeq_X deq, cdeq_X_iter_t it); -Value cdeq_X_value_from_raw(RawValue raw); +cdeq_X_value_t cdeq_X_value_clone(cdeq_X_value_t val); ``` ## Examples diff --git a/docs/clist_api.md b/docs/clist_api.md index f0f85d1b..d608f8c7 100644 --- a/docs/clist_api.md +++ b/docs/clist_api.md @@ -94,7 +94,7 @@ clist_X_iter_t clist_X_end(const clist_X* self); void clist_X_next(clist_X_iter_t* it); clist_X_value_t* clist_X_itval(clist_X_iter_t it); -Value clist_X_value_from_raw(RawValue raw); +clist_X_value_t clist_X_value_clone(clist_X_value_t val); ``` ## Example diff --git a/docs/cmap_api.md b/docs/cmap_api.md index d3b85439..fa55b3a1 100644 --- a/docs/cmap_api.md +++ b/docs/cmap_api.md @@ -99,7 +99,7 @@ size_t cmap_X_capacity(cmap_X m); void cmap_X_push_n(cmap_X* self, const cmap_X_rawvalue_t arr[], size_t size); cmap_X_result_t cmap_X_emplace(cmap_X* self, RawKey rkey, RawMapped rmapped); -cmap_X_result_t cmap_X_insert(cmap_X* self, cmap_X_input_t rval); +cmap_X_result_t cmap_X_insert(cmap_X* self, cmap_X_rawvalue_t rval); cmap_X_result_t cmap_X_insert_or_assign(cmap_X* self, RawKey rkey, RawMapped rmapped); cmap_X_result_t cmap_X_put(cmap_X* self, RawKey rkey, RawMapped rmapped); cmap_X_result_t cmap_X_put_mapped(cmap_X* self, RawKey rkey, Mapped mapped); @@ -117,7 +117,8 @@ cmap_X_iter_t cmap_X_end(cmap_X* self); void cmap_X_next(cmap_X_iter_t* it); cmap_X_mapped_t* cmap_X_itval(cmap_X_iter_t it); -cmap_bucket_t cmap_X_bucket(const cmap_X* self, const cmap_X_rawkey_t* rkeyPtr); +cmap_X_value_t cmap_X_value_clone(cmap_X_value_t val); +void cmap_X_value_del(cmap_X_value_t* val); uint32_t c_default_hash(const void *data, size_t len); uint32_t c_default_hash32(const void* data, size_t len); ``` diff --git a/docs/cpque_api.md b/docs/cpque_api.md index 9ac48ec7..c402ea24 100644 --- a/docs/cpque_api.md +++ b/docs/cpque_api.md @@ -44,11 +44,13 @@ bool cpque_X_empty(cpque_X pq); const cpque_X_value_t* cpque_X_top(const cpque_X* self); -void cpque_X_push_n(cpque_X *self, const cpque_X_input_t arr[], size_t size); +void cpque_X_push_n(cpque_X *self, const cpque_X_rawvalue_t arr[], size_t size); void cpque_X_emplace(cpque_X* self, cpque_X_rawvalue_t raw); void cpque_X_push(cpque_X* self, cpque_X_value_t value); void cpque_X_pop(cpque_X* self); void cpque_X_erase_at(cpque_X* self, size_t idx); + +cpque_X_value_t cpque_X_value_clone(cpque_X_value_t val); ``` ## Example diff --git a/docs/cqueue_api.md b/docs/cqueue_api.md index f5fe3f21..3973eda2 100644 --- a/docs/cqueue_api.md +++ b/docs/cqueue_api.md @@ -52,6 +52,8 @@ cqueue_X_iter_t cqueue_X_begin(cqueue_X* self); cqueue_X_iter_t cqueue_X_end(cqueue_X* self); void cqueue_X_next(cqueue_X_iter_t* it); cqueue_X_value_t* cqueue_X_itval(cqueue_X_iter_t it); + +cqueue_X_value_t cqueue_X_value_clone(cqueue_X_value_t val); ``` ## Examples diff --git a/docs/cset_api.md b/docs/cset_api.md index 31698a87..831b5cdf 100644 --- a/docs/cset_api.md +++ b/docs/cset_api.md @@ -82,8 +82,8 @@ cset_X_iter_t cset_X_end(cset_X* self); void cset_X_next(cset_X_iter_t* it); cset_X_value_t* cset_X_itval(cset_X_iter_t it); -cset_bucket_t cset_X_bucket(const cset_X* self, const cset_X_rawkey_t* rkeyPtr); - +cset_X_value_t cset_X_value_clone(cset_X_value_t val); +void cset_X_value_del(cset_X_value_t* val); uint32_t c_default_hash(const void *data, size_t len); uint32_t c_default_hash32(const void* data, size_t len); ``` diff --git a/docs/cvec_api.md b/docs/cvec_api.md index 9377f08c..53c9e0f2 100644 --- a/docs/cvec_api.md +++ b/docs/cvec_api.md @@ -103,7 +103,7 @@ void cvec_X_next(cvec_X_iter_t* it); cvec_X_value_t* cvec_X_itval(cvec_X_iter_t it); size_t cvec_X_index(const cvec_X vec, cvec_X_iter_t it); -Value cvec_X_value_from_raw(RawValue raw); +cvec_X_value_t cvec_X_value_clone(cvec_X_value_t val); ``` ## Examples diff --git a/examples/convert.c b/examples/convert.c new file mode 100644 index 00000000..c5724b54 --- /dev/null +++ b/examples/convert.c @@ -0,0 +1,46 @@ + +#include "stc/cmap.h" +#include "stc/cvec.h" +#include "stc/clist.h" +#include "stc/cstr.h" +#include + +using_cmap_str(); +using_cvec(ss, cmap_str_value_t, c_no_compare, cmap_str_value_del, cmap_str_value_clone); +using_clist(ss, cmap_str_value_t, c_no_compare, cmap_str_value_del, cmap_str_value_clone); + +int main() +{ + cmap_str map = cmap_inits; + cmap_str_emplace(&map, "green", "#00ff00"); + cmap_str_emplace(&map, "blue", "#0000ff"); + cmap_str_emplace(&map, "yellow", "#ffff00"); + + puts("cmap_str:"); + c_foreach (i, cmap_str, map) + printf(" %s: %s\n", i.ref->first.str, i.ref->second.str); + + cmap_str clone = cmap_str_clone(map); + + puts("\ncmap_str clone:"); + c_foreach (i, cmap_str, clone) + printf(" %s: %s\n", i.ref->first.str, i.ref->second.str); + + cvec_ss vec = cvec_ss_init(); + c_convert(cmap_str, map, cvec_ss, push_back, &vec); + + puts("\nvec_ss:"); + c_foreach (i, cvec_ss, vec) + printf(" %s: %s\n", i.ref->first.str, i.ref->second.str); + + clist_ss list = clist_ss_init(); + c_convert(cmap_str, map, clist_ss, push_back, &list); + + puts("\nclist_ss:"); + c_foreach (i, clist_ss, list) + printf(" %s: %s\n", i.ref->first.str, i.ref->second.str); + + c_del(cmap_str, &map, &clone); + cvec_ss_del(&vec); + clist_ss_del(&list); +} \ No newline at end of file diff --git a/stc/ccommon.h b/stc/ccommon.h index 856ffaf5..f8c32705 100644 --- a/stc/ccommon.h +++ b/stc/ccommon.h @@ -123,8 +123,8 @@ #define c_defcon(ctype, c, ...) \ ctype c = ctype##_init(); c_push_items(&c, ctype, __VA_ARGS__) -#define c_convert(ctype1, c1, ctype2, c2, put) do { \ - ctype2* __c2 = &(c2); \ +#define c_convert(ctype1, c1, ctype2, put, c2ref) do { \ + ctype2* __c2 = c2ref; \ c_foreach_3 (__i, ctype1, c1) \ ctype2##_##put(__c2, ctype2##_value_clone(*__i.ref)); \ } while (0) diff --git a/stc/cmap.h b/stc/cmap.h index 1707fbf2..b03483e5 100644 --- a/stc/cmap.h +++ b/stc/cmap.h @@ -205,6 +205,11 @@ typedef struct {size_t idx; uint32_t hx;} cmap_bucket_t, cset_bucket_t; CMAP_ONLY_##ctype( val.second = mappedFromRaw(mappedToRaw(&val.second)); ) \ return val; \ } \ + STC_INLINE void \ + ctype##_##X##_value_del(ctype##_##X##_value_t* val) { \ + keyDel(&KEY_REF_##ctype(val)); \ + CMAP_ONLY_##ctype( mappedDel(&val->second); ) \ + } \ STC_INLINE size_t \ ctype##_##X##_bucket_count(ctype##_##X m) {return (size_t) m.bucket_count;} \ STC_INLINE size_t \ -- cgit v1.2.3