From d07526887f0ef4352ed2dacadfcd2b57713c06f2 Mon Sep 17 00:00:00 2001 From: Tyge Løvset Date: Sun, 17 Jan 2021 00:06:13 +0100 Subject: Fixed a small issue. Added example. --- examples/csmap_ex.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ stc/csmap.h | 30 +++++++++++++++--------------- 2 files changed, 60 insertions(+), 15 deletions(-) create mode 100644 examples/csmap_ex.c diff --git a/examples/csmap_ex.c b/examples/csmap_ex.c new file mode 100644 index 00000000..b750aa82 --- /dev/null +++ b/examples/csmap_ex.c @@ -0,0 +1,45 @@ +#include +#include +#include +#include + +//using_csset(i, int); +//using_csmap(s, cstr, cstr, cstr_del, cstr_clone, cstr_compare_ref, cstr_del, cstr_clone); + +using_csmap(i, int, int); + +#include + +int main(int argc, char **argv) +{ + csmap_i map = csmap_i_init(); + time_t seed = time(NULL); + + size_t n = 1000000; + uint64_t mask = (1ull << 20) - 1; + stc64_srandom(seed); + for (size_t i = 0; i < n; ++i) { + csmap_i_emplace(&map, stc64_random() & mask, i); + } + puts("inserted"); + stc64_srandom(seed); + for (unsigned int i = 0; i < n - 50; ++i) { + csmap_i_erase(&map, stc64_random() & mask); + } + + csmap_i_emplace(&map, 500000, 5); + + c_foreach (i, csmap_i, map) + printf("-- %d: %d\n", i.ref->first, i.ref->second); + puts(""); + + csmap_i_iter_t it; + printf("min/max: %d -- %d: %d\n\n", csmap_i_front(&map)->first, csmap_i_back(&map)->first, csmap_i_find(&map, 500000, &it) != NULL); + + c_foreach (i, csmap_i, it, csmap_i_end(&map)) + printf("-- %d: %d\n", i.ref->first, i.ref->second); + + csmap_i_del(&map); + puts("done"); + return 0; +} diff --git a/stc/csmap.h b/stc/csmap.h index da980519..a16a220b 100644 --- a/stc/csmap.h +++ b/stc/csmap.h @@ -124,7 +124,7 @@ int main(void) { #define KEY_REF_csset(vp) (vp) #define KEY_REF_csmap(vp) (&(vp)->first) -#define _using_CBST_types(X, C, Key, Mapped, RawKey, RawMapped) \ +#define _using_CBST_types(X, C, Key, Mapped) \ typedef Key C##_##X##_key_t; \ typedef Mapped C##_##X##_mapped_t; \ \ @@ -138,17 +138,22 @@ int main(void) { intptr_t level; \ C##_##X##_value_t value; \ } C##_##X##_node_t; \ -\ - typedef struct { \ - C##_##X##_node_t* root; \ - size_t size; \ - } C##_##X; \ \ typedef struct { \ C##_##X##_value_t *ref; \ int top; \ C##_##X##_node_t *tn, *stk[34]; \ - } C##_##X##_iter_t; \ + } C##_##X##_iter_t + + +#define _using_CBST(X, C, Key, Mapped, mappedDel, keyCompareRaw, keyDel, \ + keyFromRaw, keyToRaw, RawKey, mappedFromRaw, mappedToRaw, RawMapped) \ + _using_CBST_types(X, C, Key, Mapped); \ +\ + typedef struct { \ + C##_##X##_node_t* root; \ + size_t size; \ + } C##_##X; \ \ typedef RawKey C##_##X##_rawkey_t; \ typedef RawMapped C##_##X##_rawmapped_t; \ @@ -160,12 +165,7 @@ int main(void) { typedef struct { \ C##_##X##_value_t *first; \ bool second; \ - } C##_##X##_result_t - - -#define _using_CBST(X, C, Key, Mapped, mappedDel, keyCompareRaw, keyDel, \ - keyFromRaw, keyToRaw, RawKey, mappedFromRaw, mappedToRaw, RawMapped) \ - _using_CBST_types(X, C, Key, Mapped, RawKey, RawMapped); \ + } C##_##X##_result_t; \ \ STC_INLINE C##_##X \ C##_##X##_init(void) {C##_##X m = {(C##_##X##_node_t *) &cbst_nil, 0}; return m;} \ @@ -254,7 +254,7 @@ int main(void) { STC_INLINE C##_##X##_mapped_t* \ C##_##X##_at(const C##_##X* self, RawKey rkey) { \ C##_##X##_iter_t it; \ - return C##_##X##_find_r_(self->root, &rkey, &it)->second; \ + return &C##_##X##_find_r_(self->root, &rkey, &it)->second; \ }) \ \ STC_INLINE C##_##X##_value_t* \ @@ -414,7 +414,7 @@ int main(void) { return clone; \ } -_using_CBST_types(_, csmap, int, int, int, int); +_using_CBST_types(_, csmap, int, int); static csmap___node_t cbst_nil = {&cbst_nil, &cbst_nil, 0}; STC_DEF csmap___node_t * -- cgit v1.2.3