From 996286ceea95b8e7ee5a6acd9fa79875ba381f16 Mon Sep 17 00:00:00 2001 From: Tyge Løvset Date: Tue, 30 Mar 2021 23:42:03 +0200 Subject: Moved cset and csset definitions to cset.h and csset.h. Updated docs. --- docs/cdeq_api.md | 2 +- docs/clist_api.md | 2 +- docs/cmap_api.md | 6 +++--- docs/cset_api.md | 2 +- docs/csset_api.md | 2 +- docs/cvec_api.md | 2 +- examples/demos.c | 1 + examples/phonebook.c | 59 ++++++++++++++++++++++++++-------------------------- stc/cmap.h | 40 +++++++---------------------------- stc/cset.h | 42 +++++++++++++++++++++++++++++++++++++ stc/csmap.h | 48 +++++++++++++----------------------------- stc/csset.h | 44 +++++++++++++++++++++++++++++++++++++++ 12 files changed, 147 insertions(+), 103 deletions(-) diff --git a/docs/cdeq_api.md b/docs/cdeq_api.md index a5920c6d..21f8b5c8 100644 --- a/docs/cdeq_api.md +++ b/docs/cdeq_api.md @@ -12,7 +12,7 @@ See the c++ class [std::deque](https://en.cppreference.com/w/cpp/container/deque using_cdeq(X, Value); using_cdeq(X, Value, valueCompare); -using_cdeq(X, Value, valueCompare, valueDel, valueClone); +using_cdeq(X, Value, valueCompare, valueDel, valueClone = c_no_clone); using_cdeq(X, Value, valueCompareRaw, valueDel, valueFromRaw, valueToRaw, RawValue); using_cdeq_str(); diff --git a/docs/clist_api.md b/docs/clist_api.md index afc20fdf..ed4ca21b 100644 --- a/docs/clist_api.md +++ b/docs/clist_api.md @@ -21,7 +21,7 @@ See the c++ class [std::forward_list](https://en.cppreference.com/w/cpp/containe using_clist(X, Value); using_clist(X, Value, valueCompare); -using_clist(X, Value, valueCompare, valueDel, valueClone); +using_clist(X, Value, valueCompare, valueDel, valueClone = c_no_clone); using_clist(X, Value, valueCompareRaw, valueDel, valueFromRaw, valueToRaw, RawValue); using_clist_str() // using_clist(str, cstr, ...) diff --git a/docs/cmap_api.md b/docs/cmap_api.md index 9c5bcf48..77c8d765 100644 --- a/docs/cmap_api.md +++ b/docs/cmap_api.md @@ -13,7 +13,7 @@ See the c++ class [std::unordered_map](https://en.cppreference.com/w/cpp/contain using_cmap(X, Key, Mapped); using_cmap(X, Key, Mapped, keyEquals, keyHash); -using_cmap(X, Key, Mapped, keyEquals, keyHash, mappedDel, mappedClone); +using_cmap(X, Key, Mapped, keyEquals, keyHash, mappedDel, mappedClone = c_no_clone); using_cmap(X, Key, Mapped, keyEquals, keyHash, mappedDel, mappedFromRaw, mappedToRaw, RawMapped); using_cmap(X, Key, Mapped, keyEqualsRaw, keyHashRaw, mappedDel, mappedFromRaw, mappedToRaw, RawMapped, keyDel, keyFromRaw, keyToRaw, RawKey); @@ -21,12 +21,12 @@ using_cmap_keydef(X, Key, Mapped, keyEquals, keyHash, keyDel, keyClone); using_cmap_keydef(X, Key, Mapped, keyEqualsRaw, keyHashRaw, keyDel, keyFromRaw, keyToRaw, RawKey); using_cmap_strkey(X, Mapped); // using_cmap(X, cstr, Mapped, ...) -using_cmap_strkey(X, Mapped, mappedDel, mappedClone); +using_cmap_strkey(X, Mapped, mappedDel, mappedClone = c_no_clone); using_cmap_strkey(X, Mapped, mappedDel, mappedFromRaw, mappedToRaw, RawMapped); using_cmap_strval(X, Key); // using_cmap(X, Key, cstr, ...) using_cmap_strval(X, Key, keyEquals, keyHash); -using_cmap_strval(X, Key, keyEquals, keyHash, keyDel, keyClone); +using_cmap_strval(X, Key, keyEquals, keyHash, keyDel, keyClone = c_no_clone); using_cmap_strval(X, Key, keyEqualsRaw, keyHashRaw, keyDel, keyFromRaw, keyToRaw, RawKey); using_cmap_str() // using_cmap(str, cstr, cstr, ...) diff --git a/docs/cset_api.md b/docs/cset_api.md index fe35c56c..26515a11 100644 --- a/docs/cset_api.md +++ b/docs/cset_api.md @@ -11,7 +11,7 @@ A **cset** is an associative container that contains a set of unique objects of using_cset(X, Key); using_cset(X, Key, keyEquals, keyHash); -using_cset(X, Key, keyEquals, keyHash, keyDel, keyClone); +using_cset(X, Key, keyEquals, keyHash, keyDel, keyClone = c_no_clone); using_cset(X, Key, keyEqualsRaw, keyHashRaw, keyDel, keyFromRaw, keyToRaw, RawKey); using_cset_str(); // using_cset(str, cstr, ...) diff --git a/docs/csset_api.md b/docs/csset_api.md index fc425292..accc81d9 100644 --- a/docs/csset_api.md +++ b/docs/csset_api.md @@ -12,7 +12,7 @@ See the c++ class [std::set](https://en.cppreference.com/w/cpp/container/set) fo using_csset(X, Key); using_csset(X, Key, keyCompare); -using_csset(X, Key, keyCompare, keyDel, keyClone); +using_csset(X, Key, keyCompare, keyDel, keyClone = c_no_clone); using_csset(X, Key, keyCompareRaw, keyDel, keyFromRaw, keyToRaw, RawKey); using_csset_str(); // using_csset(str, cstr, ...) diff --git a/docs/cvec_api.md b/docs/cvec_api.md index d1a23695..50223e00 100644 --- a/docs/cvec_api.md +++ b/docs/cvec_api.md @@ -16,7 +16,7 @@ See the c++ class [std::vector](https://en.cppreference.com/w/cpp/container/vect using_cvec(X, Value); using_cvec(X, Value, valueCompare); -using_cvec(X, Value, valueCompare, valueDel, valueClone); +using_cvec(X, Value, valueCompare, valueDel, valueClone = c_no_clone); using_cvec(X, Value, valueCompareRaw, valueDel, valueFromRaw, valueToRaw, RawValue); using_cvec_str(); // using_cvec(str, cstr, ...) diff --git a/examples/demos.c b/examples/demos.c index 9d7f894c..d8228b4e 100644 --- a/examples/demos.c +++ b/examples/demos.c @@ -1,6 +1,7 @@ #include #include #include +#include #include #include diff --git a/examples/phonebook.c b/examples/phonebook.c index 6b2ec687..72ce11f2 100644 --- a/examples/phonebook.c +++ b/examples/phonebook.c @@ -22,6 +22,7 @@ // Program to emulates the phone book. #include +#include #include #include @@ -30,48 +31,48 @@ using_cset_str(); void print_phone_book(cmap_str phone_book) { - c_foreach (i, cmap_str, phone_book) - printf("%s\t- %s\n", i.ref->first.str, i.ref->second.str); + c_foreach (i, cmap_str, phone_book) + printf("%s\t- %s\n", i.ref->first.str, i.ref->second.str); } int main(int argc, char **argv) { - c_static_assert(3 == 3, "hello"); + c_static_assert(3 == 3, "hello"); - c_init (cset_str, names, {"Hello", "Cool", "True"}); - c_foreach (i, cset_str, names) printf("set: %s\n", i.ref->str); + c_init (cset_str, names, {"Hello", "Cool", "True"}); + c_foreach (i, cset_str, names) printf("set: %s\n", i.ref->str); - bool erased; - c_init (cmap_str, phone_book, { - {"Lilia Friedman", "(892) 670-4739"}, - {"Tariq Beltran", "(489) 600-7575"}, - {"Laiba Juarez", "(303) 885-5692"}, - {"Elliott Mooney", "(945) 616-4482"}, - }); + bool erased; + c_init (cmap_str, phone_book, { + {"Lilia Friedman", "(892) 670-4739"}, + {"Tariq Beltran", "(489) 600-7575"}, + {"Laiba Juarez", "(303) 885-5692"}, + {"Elliott Mooney", "(945) 616-4482"}, + }); - printf("Phone book:\n"); - print_phone_book(phone_book); + printf("Phone book:\n"); + print_phone_book(phone_book); - cmap_str_emplace(&phone_book, "Zak Byers", "(551) 396-1880"); - cmap_str_emplace(&phone_book, "Zak Byers", "(551) 396-1990"); + cmap_str_emplace(&phone_book, "Zak Byers", "(551) 396-1880"); + cmap_str_emplace(&phone_book, "Zak Byers", "(551) 396-1990"); - printf("\nPhone book after adding Zak Byers:\n"); - print_phone_book(phone_book); + printf("\nPhone book after adding Zak Byers:\n"); + print_phone_book(phone_book); - if (cmap_str_find(&phone_book, "Tariq Beltran").ref != NULL) - printf("\nTariq Beltran is in phone book\n"); + if (cmap_str_find(&phone_book, "Tariq Beltran").ref != NULL) + printf("\nTariq Beltran is in phone book\n"); - erased = cmap_str_erase(&phone_book, "Tariq Beltran"); - erased = cmap_str_erase(&phone_book, "Elliott Mooney"); + erased = cmap_str_erase(&phone_book, "Tariq Beltran"); + erased = cmap_str_erase(&phone_book, "Elliott Mooney"); - printf("\nPhone book after erasing Tariq and Elliott:\n"); - print_phone_book(phone_book); + printf("\nPhone book after erasing Tariq and Elliott:\n"); + print_phone_book(phone_book); - cmap_str_emplace_or_assign(&phone_book, "Zak Byers", "(555) 396-188"); + cmap_str_emplace_or_assign(&phone_book, "Zak Byers", "(555) 396-188"); - printf("\nPhone book after update phone of Zak Byers:\n"); - print_phone_book(phone_book); + printf("\nPhone book after update phone of Zak Byers:\n"); + print_phone_book(phone_book); - cmap_str_del(&phone_book); - puts("done"); + cmap_str_del(&phone_book); + puts("done"); } \ No newline at end of file diff --git a/stc/cmap.h b/stc/cmap.h index f17ed995..59acc1a6 100644 --- a/stc/cmap.h +++ b/stc/cmap.h @@ -25,27 +25,22 @@ // Unordered set/map - implemented as closed hashing with linear probing and no tombstones. /* -#include #include -using_cset(sx, int); // Set of int +#include + using_cmap(mx, int, char); // Map of int -> char int main(void) { - cset_sx s = cset_sx_init(); - cset_sx_insert(&s, 5); - cset_sx_insert(&s, 8); - c_foreach (i, cset_sx, s) - printf("set %d\n", *i.ref); - cset_sx_del(&s); - cmap_mx m = cmap_mx_init(); cmap_mx_emplace(&m, 5, 'a'); cmap_mx_emplace(&m, 8, 'b'); cmap_mx_emplace(&m, 12, 'c'); + cmap_mx_iter_t it = cmap_mx_find(&m, 10); // none char val = cmap_mx_find(&m, 5).ref->second; cmap_mx_emplace_or_assign(&m, 5, 'd'); // update cmap_mx_erase(&m, 8); + c_foreach (i, cmap_mx, m) printf("map %d: %c\n", i.ref->first, i.ref->second); cmap_mx_del(&m); @@ -86,36 +81,18 @@ typedef struct {size_t idx; uint_fast8_t hx;} chash_bucket_t; keyDel, keyFromRaw, keyToRaw, RawKey) #define using_cmap_keydef(...) c_MACRO_OVERLOAD(using_cmap_keydef, __VA_ARGS__) + #define using_cmap_keydef_7(X, Key, Mapped, keyEquals, keyHash, keyDel, keyClone) \ using_cmap_keydef_9(X, Key, Mapped, keyEquals, keyHash, \ keyDel, keyClone, c_trivial_toraw, Key) + #define using_cmap_keydef_9(X, Key, Mapped, keyEqualsRaw, keyHashRaw, \ keyDel, keyFromRaw, keyToRaw, RawKey) \ _using_CHASH(X, cmap_, Key, Mapped, keyEqualsRaw, keyHashRaw, \ c_trivial_del, c_trivial_fromraw, c_trivial_toraw, Mapped, \ keyDel, keyFromRaw, keyToRaw, RawKey) -/* cset: */ -#define using_cset(...) \ - c_MACRO_OVERLOAD(using_cset, __VA_ARGS__) - -#define using_cset_2(X, Key) \ - using_cset_4(X, Key, c_default_equals, c_default_hash) -#define using_cset_4(X, Key, keyEquals, keyHash) \ - using_cset_6(X, Key, keyEquals, keyHash, c_trivial_del, c_trivial_fromraw) -#define using_cset_5(X, Key, keyEquals, keyHash, keyDel) \ - using_cset_6(X, Key, keyEquals, keyHash, keyDel, c_no_clone) -#define using_cset_6(X, Key, keyEquals, keyHash, keyDel, keyClone) \ - using_cset_8(X, Key, keyEquals, keyHash, keyDel, keyClone, c_trivial_toraw, Key) - -#define using_cset_8(X, Key, keyEqualsRaw, keyHashRaw, keyDel, keyFromRaw, keyToRaw, RawKey) \ - _using_CHASH(X, cset_, Key, Key, keyEqualsRaw, keyHashRaw, \ - @@, @@, @@, void, \ - keyDel, keyFromRaw, keyToRaw, RawKey) - -/* cset_str, cmap_str, cmap_strkey, cmap_strval: */ -#define using_cset_str() \ - _using_CHASH_strkey(str, cset_, cstr_t, @@, @@, @@, void) +/* cmap_str, cmap_strkey, cmap_strval: */ #define using_cmap_str() \ _using_CHASH(str, cmap_, cstr_t, cstr_t, cstr_equals_raw, cstr_hash_raw, \ cstr_del, cstr_from, cstr_c_str, const char*, \ @@ -155,11 +132,8 @@ typedef struct {size_t idx; uint_fast8_t hx;} chash_bucket_t; cstr_del, cstr_from, cstr_c_str, const char*, \ keyDel, keyFromRaw, keyToRaw, RawKey) -#define SET_ONLY_cset_(...) __VA_ARGS__ #define SET_ONLY_cmap_(...) -#define MAP_ONLY_cset_(...) #define MAP_ONLY_cmap_(...) __VA_ARGS__ -#define KEY_REF_cset_(vp) (vp) #define KEY_REF_cmap_(vp) (&(vp)->first) #ifndef CMAP_SIZE_T #define CMAP_SIZE_T uint32_t diff --git a/stc/cset.h b/stc/cset.h index 9cbe6c9e..b4d411a5 100644 --- a/stc/cset.h +++ b/stc/cset.h @@ -24,7 +24,49 @@ #define CSET_H_INCLUDED // Unordered set - implemented as closed hashing with linear probing and no tombstones. +/* +#include +#include + +using_cset(sx, int); // Set of int + +int main(void) { + cset_sx s = cset_sx_init(); + cset_sx_insert(&s, 5); + cset_sx_insert(&s, 8); + + c_foreach (i, cset_sx, s) + printf("set %d\n", *i.ref); + cset_sx_del(&s); +} +*/ #include "cmap.h" +/* cset: */ +#define using_cset(...) \ + c_MACRO_OVERLOAD(using_cset, __VA_ARGS__) + +#define using_cset_2(X, Key) \ + using_cset_4(X, Key, c_default_equals, c_default_hash) +#define using_cset_4(X, Key, keyEquals, keyHash) \ + using_cset_6(X, Key, keyEquals, keyHash, c_trivial_del, c_trivial_fromraw) +#define using_cset_5(X, Key, keyEquals, keyHash, keyDel) \ + using_cset_6(X, Key, keyEquals, keyHash, keyDel, c_no_clone) +#define using_cset_6(X, Key, keyEquals, keyHash, keyDel, keyClone) \ + using_cset_8(X, Key, keyEquals, keyHash, keyDel, keyClone, c_trivial_toraw, Key) + +#define using_cset_8(X, Key, keyEqualsRaw, keyHashRaw, keyDel, keyFromRaw, keyToRaw, RawKey) \ + _using_CHASH(X, cset_, Key, Key, keyEqualsRaw, keyHashRaw, \ + @@, @@, @@, void, \ + keyDel, keyFromRaw, keyToRaw, RawKey) + +/* cset_str: */ +#define using_cset_str() \ + _using_CHASH_strkey(str, cset_, cstr_t, @@, @@, @@, void) + +#define SET_ONLY_cset_(...) __VA_ARGS__ +#define MAP_ONLY_cset_(...) +#define KEY_REF_cset_(vp) (vp) + #endif diff --git a/stc/csmap.h b/stc/csmap.h index a6185ef7..39f1c0a9 100644 --- a/stc/csmap.h +++ b/stc/csmap.h @@ -27,17 +27,22 @@ /* #include #include -using_csset(i, int); // Set of int +using_csmap(mx, int, char); // Sorted map int main(void) { - csset_i s = csset_i_init(); - csset_i_insert(&s, 5); - csset_i_insert(&s, 8); - csset_i_insert(&s, 3); - csset_i_insert(&s, 5); - c_foreach (k, csset_i, s) - printf("set %d\n", *k.ref); - csset_i_del(&s); + csmap_mx m = csmap_mx_init(); + csmap_mx_emplace(&m, 5, 'a'); + csmap_mx_emplace(&m, 8, 'b'); + csmap_mx_emplace(&m, 12, 'c'); + + csmap_mx_iter_t it = csmap_mx_find(&m, 10); // none + char val = csmap_mx_find(&m, 5).ref->second; + csmap_mx_emplace_or_assign(&m, 5, 'd'); // update + csmap_mx_erase(&m, 8); + + c_foreach (i, csmap_mx, m) + printf("map %d: %c\n", i.ref->first, i.ref->second); + csmap_mx_del(&m); } */ #include "ccommon.h" @@ -77,27 +82,7 @@ int main(void) { c_trivial_del, c_trivial_fromraw, c_trivial_toraw, Mapped, \ keyDel, keyFromRaw, keyToRaw, RawKey) -/* csset: */ -#define using_csset(...) \ - c_MACRO_OVERLOAD(using_csset, __VA_ARGS__) - -#define using_csset_2(X, Key) \ - using_csset_3(X, Key, c_default_compare) -#define using_csset_3(X, Key, keyCompare) \ - using_csset_5(X, Key, keyCompare, c_trivial_del, c_trivial_fromraw) -#define using_csset_4(X, Key, keyCompare, keyDel) \ - using_csset_5(X, Key, keyCompare, keyDel, c_no_clone) -#define using_csset_5(X, Key, keyCompare, keyDel, keyClone) \ - using_csset_7(X, Key, keyCompare, keyDel, keyClone, c_trivial_toraw, Key) - -#define using_csset_7(X, Key, keyCompareRaw, keyDel, keyFromRaw, keyToRaw, RawKey) \ - _using_AATREE(X, csset_, Key, Key, keyCompareRaw, \ - @@, @@, @@, void, \ - keyDel, keyFromRaw, keyToRaw, RawKey) - -/* csset_str, csmap_str, csmap_strkey, csmap_strval: */ -#define using_csset_str() \ - _using_AATREE_strkey(str, csset_, cstr_t, @@, @@, @@, void) +/* csmap_str, csmap_strkey, csmap_strval: */ #define using_csmap_str() \ _using_AATREE(str, csmap_, cstr_t, cstr_t, cstr_compare_raw, \ cstr_del, cstr_from, cstr_c_str, const char*, \ @@ -137,11 +122,8 @@ int main(void) { cstr_del, cstr_from, cstr_c_str, const char*, \ keyDel, keyFromRaw, keyToRaw, RawKey) -#define SET_ONLY_csset_(...) __VA_ARGS__ #define SET_ONLY_csmap_(...) -#define MAP_ONLY_csset_(...) #define MAP_ONLY_csmap_(...) __VA_ARGS__ -#define KEY_REF_csset_(vp) (vp) #define KEY_REF_csmap_(vp) (&(vp)->first) #ifndef CSMAP_SIZE_T #define CSMAP_SIZE_T uint32_t diff --git a/stc/csset.h b/stc/csset.h index 24150d52..9f2711c3 100644 --- a/stc/csset.h +++ b/stc/csset.h @@ -24,7 +24,51 @@ #define CSSET_H_INCLUDED // Sorted set - implemented as an AA-tree (balanced binary tree). +/* +#include +#include + +using_csset(i, int); // sorted set of int + +int main(void) { + csset_i s = csset_i_init(); + csset_i_insert(&s, 5); + csset_i_insert(&s, 8); + csset_i_insert(&s, 3); + csset_i_insert(&s, 5); + + c_foreach (k, csset_i, s) + printf("set %d\n", *k.ref); + csset_i_del(&s); +} +*/ #include "csmap.h" +/* csset: */ +#define using_csset(...) \ + c_MACRO_OVERLOAD(using_csset, __VA_ARGS__) + +#define using_csset_2(X, Key) \ + using_csset_3(X, Key, c_default_compare) +#define using_csset_3(X, Key, keyCompare) \ + using_csset_5(X, Key, keyCompare, c_trivial_del, c_trivial_fromraw) +#define using_csset_4(X, Key, keyCompare, keyDel) \ + using_csset_5(X, Key, keyCompare, keyDel, c_no_clone) +#define using_csset_5(X, Key, keyCompare, keyDel, keyClone) \ + using_csset_7(X, Key, keyCompare, keyDel, keyClone, c_trivial_toraw, Key) + +#define using_csset_7(X, Key, keyCompareRaw, keyDel, keyFromRaw, keyToRaw, RawKey) \ + _using_AATREE(X, csset_, Key, Key, keyCompareRaw, \ + @@, @@, @@, void, \ + keyDel, keyFromRaw, keyToRaw, RawKey) + +/* csset_str: */ +#define using_csset_str() \ + _using_AATREE_strkey(str, csset_, cstr_t, @@, @@, @@, void) + +#define SET_ONLY_csset_(...) __VA_ARGS__ +#define MAP_ONLY_csset_(...) +#define KEY_REF_csset_(vp) (vp) + #endif -- cgit v1.2.3