summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--examples/csmap_ex.c45
-rw-r--r--stc/csmap.h30
2 files changed, 60 insertions, 15 deletions
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 <stc/csmap.h>
+#include <stc/cstr.h>
+#include <stc/crand.h>
+#include <stdio.h>
+
+//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 <time.h>
+
+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; \
\
@@ -140,15 +140,20 @@ int main(void) {
} 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 *