From b01e087c85bfd7c999328e150f5a6cb9d4ba9bae Mon Sep 17 00:00:00 2001 From: jun <83899451+zeichensystem@users.noreply.github.com> Date: Wed, 19 Mar 2025 16:16:41 +0100 Subject: [PATCH] Fix GUF_DICT_64_BIT_IDX and guf_dict_max_capacity() --- src/guf_dict.h | 16 +++++++++------- src/test/guf_dict_impl.c | 4 +++- src/test/guf_dict_impl.h | 3 +++ src/test/test.cpp | 3 +++ todo.txt | 2 ++ 5 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/guf_dict.h b/src/guf_dict.h index 3d51d72..f6c4eb7 100755 --- a/src/guf_dict.h +++ b/src/guf_dict.h @@ -51,7 +51,7 @@ #if GUF_DICT_HASH_T_MAX == UINT64_MAX #define GUF_DICT_HASH_T_GET_HASHFRAG(HASH) ( (HASH) & GUF_DICT_KV_META_HASHFRAG_MASK ) #elif GUF_DICT_HASH_T_MAX == UINT32_MAX - #define GUF_DICT_HASH_T_GET_HASHFRAG(HASH) ( (((uint64_t)(HASH)) << 32) & GUF_DICT_HASH_T_HASHFRAG_MASK ) + #define GUF_DICT_HASH_T_GET_HASHFRAG(HASH) ( (((uint64_t)(HASH)) << 32) & GUF_DICT_KV_META_HASHFRAG_MASK ) #else #error "guf_dict: invalid hash size (should not happen)" #endif @@ -170,7 +170,7 @@ GUF_DICT_KWRDS ptrdiff_t GUF_CAT(GUF_DICT_NAME, _iter_to_idx)(const GUF_DICT_NAM GUF_DICT_KWRDS bool GUF_CAT(GUF_DICT_NAME, _debug_valid_size)(const GUF_DICT_NAME *ht); GUF_DICT_KWRDS bool GUF_CAT(GUF_DICT_NAME, _valid)(const GUF_DICT_NAME *ht); -GUF_DICT_KWRDS bool GUF_CAT(GUF_DICT_NAME, _max_capacity)(void); +GUF_DICT_KWRDS ptrdiff_t GUF_CAT(GUF_DICT_NAME, _max_capacity)(void); // #define GUF_DICT_IMPL /* DEBUGGGGGGGGG */ @@ -258,20 +258,20 @@ GUF_DICT_KWRDS bool GUF_CAT(GUF_DICT_NAME, _valid)(const GUF_DICT_NAME *ht) return kv_dbuf_valid && kv_meta_buf_valid && count_valid; } -GUF_DICT_KWRDS bool GUF_CAT(GUF_DICT_NAME, _max_capacity)(void) +GUF_DICT_KWRDS ptrdiff_t GUF_CAT(GUF_DICT_NAME, _max_capacity)(void) { const size_t max_cap_kv_elems = GUF_MIN(GUF_DICT_KV_META_IDX_MAX + 1, GUF_ALLOC_MAX_CAPACITY(GUF_DICT_KV_NAME)); - + const size_t max_cap_kv_indices = GUF_ALLOC_MAX_CAPACITY(GUF_DICT_KV_META_T); // Find next power of two (capacities must be powers of two). size_t pow2_cap = 1; - const size_t max_pow2 = SIZE_T_MAX & ~(SIZE_T_MAX >> 1); - while ((pow2_cap < max_pow2) && ((pow2_cap << 1) < max_cap_kv_indices) ) { + const size_t MAX_SIZE_POW2 = SIZE_T_MAX & ~(SIZE_T_MAX >> 1); + while ((pow2_cap < MAX_SIZE_POW2) && ((pow2_cap << 1) < max_cap_kv_indices) ) { pow2_cap <<= 1; } GUF_ASSERT(guf_is_pow2_size_t(pow2_cap) && pow2_cap <= max_cap_kv_indices && pow2_cap > 1); - return GUF_MIN(max_cap_kv_elems, pow2_cap); + return GUF_MIN(GUF_MIN(max_cap_kv_elems, pow2_cap), PTRDIFF_MAX); } @@ -819,6 +819,8 @@ GUF_DICT_KWRDS GUF_CAT(GUF_DICT_NAME, _iter) GUF_CAT(GUF_DICT_NAME, _find_val_if #endif /* end GUF_IMPL/GUF_IMPL_STATIC */ #undef GUF_DICT_KV_META_T +#undef GUF_DICT_HASH_T +#undef GUF_DICT_HASH_T_MAX #undef GUF_DICT_32_BIT_HASH #undef GUF_DICT_64_BIT_HASH diff --git a/src/test/guf_dict_impl.c b/src/test/guf_dict_impl.c index 68df3bf..9d82f57 100644 --- a/src/test/guf_dict_impl.c +++ b/src/test/guf_dict_impl.c @@ -15,8 +15,10 @@ #define GUF_DICT_VAL_T int32_t #define GUF_DICT_VAL_T_IS_INTEGRAL_TYPE #define GUF_DICT_NAME dict_sv_i32 -// #define GUF_DICT_PROBE_LINEAR #define GUF_DICT_IMPL +// #define GUF_DICT_64_BIT_IDX +// #define GUF_DICT_PROBE_LINEAR +// #define GUF_DICT_32_BIT_HASH #include "guf_dict.h" #define GUF_DICT_KEY_T int32_t diff --git a/src/test/guf_dict_impl.h b/src/test/guf_dict_impl.h index 865b764..d16fd37 100644 --- a/src/test/guf_dict_impl.h +++ b/src/test/guf_dict_impl.h @@ -21,6 +21,9 @@ #define GUF_DICT_VAL_T int32_t #define GUF_DICT_VAL_T_IS_INTEGRAL_TYPE #define GUF_DICT_NAME dict_sv_i32 +// #define GUF_DICT_64_BIT_IDX +// #define GUF_DICT_PROBE_LINEAR +// #define GUF_DICT_32_BIT_HASH #include "guf_dict.h" static inline guf_hash_size_t int32_hash(const int32_t *a) diff --git a/src/test/test.cpp b/src/test/test.cpp index ce45b52..2646288 100644 --- a/src/test/test.cpp +++ b/src/test/test.cpp @@ -39,6 +39,9 @@ int main() std::cout << "Running " << g_tests.size() << " tests...\n"; + // std::cout << "max cap 1:" << dict_sv_i32_max_capacity() << "\n"; + // std::cout << "max cap 2:" << dict_cstr_int_max_capacity() << "\n"; + size_t num_passed = 0; for (auto &test : g_tests) { Test *tst = test.get(); diff --git a/todo.txt b/todo.txt index b07c12c..6b52f06 100644 --- a/todo.txt +++ b/todo.txt @@ -1,5 +1,7 @@ - sort: add cpp #ifdef to remove restrict from declaration +- tests for guf_dict with GUF_DICT_64_BIT_IDX (and also hash32/hash64) + - guf_stack, guf_queue, guf_dqueue, guf_prio_queue (using a heap), guf_ringbuf - guf_dict: maybe put key_hash into kv_elem; maybe change order of key and val in kv_elem depending on size of key and val.