summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--docs/cdeq_api.md1
-rw-r--r--docs/clist_api.md3
-rw-r--r--docs/cmap_api.md1
-rw-r--r--docs/csmap_api.md2
-rw-r--r--docs/cvec_api.md1
-rw-r--r--examples/csmap_erase.c10
-rw-r--r--include/stc/cdeq.h1
-rw-r--r--include/stc/clist.h4
-rw-r--r--include/stc/cmap.h6
-rw-r--r--include/stc/csmap.h5
-rw-r--r--include/stc/cvec.h5
11 files changed, 28 insertions, 11 deletions
diff --git a/docs/cdeq_api.md b/docs/cdeq_api.md
index a6ff97c2..42e46240 100644
--- a/docs/cdeq_api.md
+++ b/docs/cdeq_api.md
@@ -85,6 +85,7 @@ cdeq_X_iter_t cdeq_X_begin(const cdeq_X* self);
cdeq_X_iter_t cdeq_X_end(const cdeq_X* self);
void cdeq_X_next(cdeq_X_iter_t* it);
+cdeq_X_rawvalue_t cdeq_X_value_toraw(cdeq_X_value_t* pval);
cdeq_X_value_t cdeq_X_value_clone(cdeq_X_value_t val);
```
diff --git a/docs/clist_api.md b/docs/clist_api.md
index 3048fa35..909a8e54 100644
--- a/docs/clist_api.md
+++ b/docs/clist_api.md
@@ -85,8 +85,9 @@ void clist_X_sort(clist_X* self);
clist_X_iter_t clist_X_begin(const clist_X* self);
clist_X_iter_t clist_X_end(const clist_X* self);
void clist_X_next(clist_X_iter_t* it);
-
clist_X_iter_t clist_X_fwd(clist_X_iter it, size_t n); // return it n elements ahead. End allowed.
+
+clist_X_rawvalue_t clist_X_value_toraw(clist_X_value_t* pval);
clist_X_value_t clist_X_value_clone(clist_X_value_t val);
```
diff --git a/docs/cmap_api.md b/docs/cmap_api.md
index 20c90998..a9481903 100644
--- a/docs/cmap_api.md
+++ b/docs/cmap_api.md
@@ -84,6 +84,7 @@ cmap_X_iter_t cmap_X_end(const cmap_X* self);
void cmap_X_next(cmap_X_iter_t* it);
cmap_X_value_t cmap_X_value_clone(cmap_X_value_t val);
+cmap_X_rawvalue_t cmap_X_value_toraw(cmap_X_value_t* pval);
```
```c
uint64_t c_default_hash(const void *data, size_t len); // key any trivial type
diff --git a/docs/csmap_api.md b/docs/csmap_api.md
index b22e750a..52c2829b 100644
--- a/docs/csmap_api.md
+++ b/docs/csmap_api.md
@@ -76,8 +76,10 @@ csmap_X_iter_t csmap_X_erase_range(csmap_X* self, csmap_X_iter_t it1, csmap
csmap_X_iter_t csmap_X_begin(const csmap_X* self);
csmap_X_iter_t csmap_X_end(const csmap_X* self);
void csmap_X_next(csmap_X_iter_t* iter);
+csmap_X_iter_t csmap_X_fwd(csmap_X_iter_t it, size_t n);
csmap_X_value_t csmap_X_value_clone(csmap_X_value_t val);
+csmap_X_rawvalue_t csmap_X_value_toraw(csmap_X_value_t* pval);
```
## Types
diff --git a/docs/cvec_api.md b/docs/cvec_api.md
index 6c050c6c..016d82e3 100644
--- a/docs/cvec_api.md
+++ b/docs/cvec_api.md
@@ -88,6 +88,7 @@ cvec_X_iter_t cvec_X_begin(const cvec_X* self);
cvec_X_iter_t cvec_X_end(const cvec_X* self);
void cvec_X_next(cvec_X_iter_t* iter);
+cvec_X_rawvalue_t cvec_X_value_toraw(cvec_X_value_t* pval);
cvec_X_value_t cvec_X_value_clone(cvec_X_value_t val);
```
diff --git a/examples/csmap_erase.c b/examples/csmap_erase.c
index eb3700b1..1276bd7b 100644
--- a/examples/csmap_erase.c
+++ b/examples/csmap_erase.c
@@ -1,5 +1,5 @@
// map_erase.c
-// https://docs.microsoft.com/en-us/cpp/standard-library/map-class?view=msvc-160#emplace
+// https://docs.microsoft.com/en-us/cpp/standard-library/map-class?view=msvc-160#example-16
#include <stc/csmap.h>
#include <stc/cstr.h>
#include <stdio.h>
@@ -27,13 +27,12 @@ int main()
puts("Starting data of map m1 is:");
printmap(m1);
// The 1st member function removes an element at a given position
- csmap_my_iter_t it = csmap_my_begin(&m1); csmap_my_next(&it);
- csmap_my_erase_at(&m1, it);
+ csmap_my_erase_at(&m1, csmap_my_fwd(csmap_my_begin(&m1), 1));
puts("After the 2nd element is deleted, the map m1 is:");
printmap(m1);
}
- c_with (csmap_my m2 = csmap_my_init(), csmap_my_del(&m2))
+ c_withvar (csmap_my, m2)
{
// Fill in some data to test with, one at a time, using emplace
c_emplace(csmap_my, m2, {
@@ -55,7 +54,7 @@ int main()
printmap(m2);
}
- c_with (csmap_my m3 = csmap_my_init(), csmap_my_del(&m3))
+ c_withvar (csmap_my, m3)
{
// Fill in some data to test with, one at a time, using emplace
csmap_my_emplace(&m3, 1, "red");
@@ -75,5 +74,4 @@ int main()
puts("After the element with a key of 2 is deleted, the map m3 is:");
printmap(m3);
}
-
} \ No newline at end of file
diff --git a/include/stc/cdeq.h b/include/stc/cdeq.h
index 990c556a..ee0d1c2c 100644
--- a/include/stc/cdeq.h
+++ b/include/stc/cdeq.h
@@ -75,6 +75,7 @@ struct cdeq_rep { size_t size, cap; void* base[]; };
STC_INLINE size_t CX##_capacity(CX cx) {return _cdeq_rep(&cx)->cap;} \
STC_INLINE void CX##_swap(CX* a, CX* b) {c_swap(CX, *a, *b);} \
STC_INLINE Value CX##_value_fromraw(RawValue raw) {return valueFromRaw(raw);} \
+ STC_INLINE RawValue CX##_value_toraw(CX##_value_t* pval) {return valueToRaw(pval);} \
STC_INLINE Value CX##_value_clone(Value val) \
{return valueFromRaw(valueToRaw(&val));} \
STC_INLINE void CX##_emplace_back(CX* self, RawValue raw) \
diff --git a/include/stc/clist.h b/include/stc/clist.h
index 8e23a43e..55ab5bf0 100644
--- a/include/stc/clist.h
+++ b/include/stc/clist.h
@@ -120,10 +120,10 @@ STC_API size_t _clist_count(const clist_VOID* self);
STC_INLINE size_t CX##_count(CX cx) \
{return _clist_count((const clist_VOID*) &cx);} \
STC_INLINE void CX##_clear(CX* self) {CX##_del(self);} \
+ STC_INLINE Value CX##_value_fromraw(RawValue raw) {return valueFromRaw(raw);} \
+ STC_INLINE RawValue CX##_value_toraw(CX##_value_t* pval) {return valueToRaw(pval);} \
STC_INLINE Value CX##_value_clone(Value val) \
{return valueFromRaw(valueToRaw(&val));} \
- STC_INLINE Value CX##_value_fromraw(RawValue raw) \
- {return valueFromRaw(raw);} \
STC_INLINE void CX##_pop_front(CX* self) \
{CX##_erase_after_(self, self->last);} \
STC_INLINE CX##_iter_t CX##_erase(CX* self, CX##_iter_t it) \
diff --git a/include/stc/cmap.h b/include/stc/cmap.h
index 937da0af..efa1ddb9 100644
--- a/include/stc/cmap.h
+++ b/include/stc/cmap.h
@@ -209,6 +209,12 @@ STC_INLINE uint64_t c_default_hash64(const void* data, size_t ignored)
MAP_ONLY_##C( _dst->second = mappedFromRaw(mappedToRaw(&_val->second)); ) \
} \
\
+ STC_INLINE CX##_rawvalue_t \
+ CX##_value_toraw(CX##_value_t* val) { \
+ return SET_ONLY_##C( keyToRaw(val) ) \
+ MAP_ONLY_##C( c_make(CX##_rawvalue_t){keyToRaw(&val->first), mappedToRaw(&val->second)} ); \
+ } \
+\
STC_INLINE void \
CX##_value_del(CX##_value_t* _val) { \
keyDel((CX##_key_t*) KEY_REF_##C(_val)); \
diff --git a/include/stc/csmap.h b/include/stc/csmap.h
index 4a57ee33..91cf3d11 100644
--- a/include/stc/csmap.h
+++ b/include/stc/csmap.h
@@ -206,6 +206,11 @@ struct csmap_rep { size_t root, disp, head, size, cap; void* nodes[]; };
return tree; \
} \
\
+ STC_INLINE CX##_rawvalue_t \
+ CX##_value_toraw(CX##_value_t* val) { \
+ return SET_ONLY_##C( keyToRaw(val) ) \
+ MAP_ONLY_##C( c_make(CX##_rawvalue_t){keyToRaw(&val->first), mappedToRaw(&val->second)} ); \
+ } \
STC_INLINE void \
CX##_value_del(CX##_value_t* val) { \
keyDel((CX##_key_t*) KEY_REF_##C(val)); \
diff --git a/include/stc/cvec.h b/include/stc/cvec.h
index dc090dae..e4feaf8a 100644
--- a/include/stc/cvec.h
+++ b/include/stc/cvec.h
@@ -75,6 +75,9 @@ struct cvec_rep { size_t size, cap; void* data[]; };
STC_INLINE size_t CX##_capacity(CX cx) { return _cvec_rep(&cx)->cap; } \
STC_INLINE bool CX##_empty(CX cx) {return !_cvec_rep(&cx)->size;} \
STC_INLINE Value CX##_value_fromraw(RawValue raw) {return valueFromRaw(raw);} \
+ STC_INLINE RawValue CX##_value_toraw(CX##_value_t* val) {return valueToRaw(val);} \
+ STC_INLINE Value CX##_value_clone(CX##_value_t val) \
+ {return valueFromRaw(valueToRaw(&val));} \
STC_INLINE void CX##_swap(CX* a, CX* b) {c_swap(CX, *a, *b);} \
STC_INLINE CX##_value_t*CX##_front(const CX* self) {return self->data;} \
STC_INLINE CX##_value_t*CX##_back(const CX* self) \
@@ -83,8 +86,6 @@ struct cvec_rep { size_t size, cap; void* data[]; };
{CX##_push_back(self, valueFromRaw(raw));} \
STC_INLINE void CX##_pop_back(CX* self) \
{valueDel(&self->data[--_cvec_rep(self)->size]);} \
- STC_INLINE Value CX##_value_clone(CX##_value_t val) \
- {return valueFromRaw(valueToRaw(&val));} \
STC_INLINE CX##_iter_t CX##_begin(const CX* self) \
{return c_make(CX##_iter_t){self->data};} \
STC_INLINE CX##_iter_t CX##_end(const CX* self) \