From 7472580ee0159d7164bf2a219c292cd060b904a2 Mon Sep 17 00:00:00 2001 From: Tyge Løvset Date: Sat, 22 May 2021 15:20:32 +0200 Subject: Added *_value_toraw() methods to base containers. --- docs/cdeq_api.md | 1 + docs/clist_api.md | 3 ++- docs/cmap_api.md | 1 + docs/csmap_api.md | 2 ++ docs/cvec_api.md | 1 + examples/csmap_erase.c | 10 ++++------ include/stc/cdeq.h | 1 + include/stc/clist.h | 4 ++-- include/stc/cmap.h | 6 ++++++ include/stc/csmap.h | 5 +++++ include/stc/cvec.h | 5 +++-- 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 #include #include @@ -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 @@ -208,6 +208,12 @@ STC_INLINE uint64_t c_default_hash64(const void* data, size_t ignored) *(CX##_key_t*) KEY_REF_##C(_dst) = keyFromRaw(keyToRaw(KEY_REF_##C(_val))); \ 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) { \ 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) \ -- cgit v1.2.3