summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorTyge Løvset <[email protected]>2021-01-04 20:03:51 +0100
committerTyge Løvset <[email protected]>2021-01-04 20:03:51 +0100
commit36097d97ec2c446732daa2cb8c88b5e10717452c (patch)
treece297bcabcf43a7348783d52b9db7a4ca06d5da9
parenta285bfb891ea00df8ab5cbb21f899ce9ced5f460 (diff)
downloadSTC-modified-36097d97ec2c446732daa2cb8c88b5e10717452c.tar.gz
STC-modified-36097d97ec2c446732daa2cb8c88b5e10717452c.zip
Added cmap_X_value_del() and added convert.c example.
-rw-r--r--docs/cdeq_api.md4
-rw-r--r--docs/clist_api.md2
-rw-r--r--docs/cmap_api.md5
-rw-r--r--docs/cpque_api.md4
-rw-r--r--docs/cqueue_api.md2
-rw-r--r--docs/cset_api.md4
-rw-r--r--docs/cvec_api.md2
-rw-r--r--examples/convert.c46
-rw-r--r--stc/ccommon.h4
-rw-r--r--stc/cmap.h5
10 files changed, 67 insertions, 11 deletions
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 <stdio.h>
+
+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 \