diff --git a/src/guf_dict.h b/src/guf_dict.h index bf2cacb..27aafa2 100755 --- a/src/guf_dict.h +++ b/src/guf_dict.h @@ -167,10 +167,12 @@ GUF_DICT_KWRDS ptrdiff_t GUF_CAT(GUF_DICT_NAME, _iter_to_idx)(const GUF_DICT_NAM GUF_DICT_KWRDS GUF_CAT(GUF_DICT_NAME, _iter) GUF_CAT(GUF_DICT_NAME, _find_val_if)(GUF_DICT_NAME *ht, GUF_CAT(GUF_DICT_NAME, _iter) begin, GUF_CAT(GUF_DICT_NAME, _iter) end, bool (*predicate)(const GUF_DICT_VAL_T *)); #endif -GUF_DICT_KWRDS bool GUF_CAT(GUF_DICT_NAME, _debug_valid_size)(const GUF_DICT_NAME *ht); +GUF_DICT_KWRDS ptrdiff_t GUF_CAT(GUF_DICT_NAME, _max_capacity)(void); +GUF_DICT_KWRDS size_t GUF_CAT(GUF_DICT_NAME, _memory_usage)(const GUF_DICT_NAME *ht); GUF_DICT_KWRDS bool GUF_CAT(GUF_DICT_NAME, _valid)(const GUF_DICT_NAME *ht); -GUF_DICT_KWRDS ptrdiff_t GUF_CAT(GUF_DICT_NAME, _max_capacity)(void); +GUF_DICT_KWRDS bool GUF_CAT(GUF_DICT_NAME, _debug_valid_size)(const GUF_DICT_NAME *ht); + // #define GUF_DICT_IMPL /* DEBUGGGGGGGGG */ @@ -274,6 +276,15 @@ GUF_DICT_KWRDS ptrdiff_t GUF_CAT(GUF_DICT_NAME, _max_capacity)(void) return GUF_MIN(GUF_MIN(max_cap_kv_elems, pow2_cap), PTRDIFF_MAX); } +GUF_DICT_KWRDS size_t GUF_CAT(GUF_DICT_NAME, _memory_usage)(const GUF_DICT_NAME *ht) +{ + GUF_ASSERT_RELEASE(GUF_CAT(GUF_DICT_NAME, _valid)(ht)); + const size_t mem_kv_indices = (size_t)ht->kv_indices_cap * sizeof(GUF_DICT_KV_META_T); + const size_t mem_kv_elems = (size_t)ht->kv_elems.capacity * sizeof(GUF_DICT_KV_NAME); + return mem_kv_indices + mem_kv_elems; +} + + GUF_DICT_KWRDS void GUF_CAT(GUF_DICT_NAME, _free)(GUF_DICT_NAME *ht, void *ctx) { @@ -401,11 +412,11 @@ static void GUF_CAT(GUF_DICT_NAME, _try_grow_if_necessary)(GUF_DICT_NAME *ht, gu const size_t MAX_SIZE_BYTES = (size_t)GUF_ALLOC_MAX_BYTES(GUF_DICT_KV_META_T); const size_t new_size_bytes_test = (size_t)old_size_bytes * (size_t)KV_META_GROWTH_FAC; - if (guf_mul_is_overflow_size_t(old_size_bytes, KV_META_GROWTH_FAC) || new_size_bytes_test > MAX_SIZE_BYTES) { // Handle overflow. + if (guf_mul_is_overflow_size_t(old_size_bytes, KV_META_GROWTH_FAC) || new_size_bytes_test > MAX_SIZE_BYTES) { // Handle overflow (Remember: capacities have to be powers of two) guf_err_set_or_panic(err, GUF_ERR_ALLOC_FAIL, GUF_ERR_MSG("in function dict_try_insert: New kv_indices_capacity would overflow)")); return; } else { - GUF_ASSERT(new_size_bytes_test <= PTRDIFF_MAX && guf_is_pow2_size_t(new_size_bytes_test)); + GUF_ASSERT(new_size_bytes_test <= PTRDIFF_MAX); new_size_bytes = (ptrdiff_t)new_size_bytes_test; } GUF_ASSERT_RELEASE(new_size_bytes > old_size_bytes); @@ -421,6 +432,7 @@ static void GUF_CAT(GUF_DICT_NAME, _try_grow_if_necessary)(GUF_DICT_NAME *ht, gu ht->kv_indices = new_kv_indices; ht->kv_indices_cap = ht->kv_indices_cap * KV_META_GROWTH_FAC;; GUF_ASSERT(guf_is_pow2_size_t(ht->kv_indices_cap)); + GUF_ASSERT(new_size_bytes / sizeof(GUF_DICT_KV_META_T) == ht->kv_indices_cap); ht->num_tombstones = 0; // ht->max_probelen = 0; diff --git a/src/test/test_dict.hpp b/src/test/test_dict.hpp index 7d78430..33d524c 100644 --- a/src/test/test_dict.hpp +++ b/src/test/test_dict.hpp @@ -85,11 +85,11 @@ struct DictSvToIntTest : public Test TEST_CHECK(i == std::ssize(word_cnt_map)); TEST_CHECK(dict_sv_i32_debug_valid_size(&word_cnt_dict)); - // std::cout << "load fac: " << dict_sv_i32_load_factor(&word_cnt_dict) << ", cap: " << word_cnt_dict.kv_indices_cap << "\n"; + // std::cout << "load fac: " << dict_sv_i32_load_factor(&word_cnt_dict) << ", cap: " << word_cnt_dict.kv_indices_cap << " elem cap: " << word_cnt_dict.kv_elems.capacity << "\n"; // std::cout << "size: " << dict_sv_i32_size(&word_cnt_dict) << ", max probelen: " << word_cnt_dict.max_probelen << "\n"; + // std::cout << "mem usage: " << dict_sv_i32_memory_usage(&word_cnt_dict) << "\n"; // Erase tests: - const double load_fac_before_erase = dict_sv_i32_load_factor(&word_cnt_dict); const ptrdiff_t size_before_erase = dict_sv_i32_size(&word_cnt_dict); ptrdiff_t num_del = 0; diff --git a/todo.txt b/todo.txt index deba8e1..5eca62f 100644 --- a/todo.txt +++ b/todo.txt @@ -1,6 +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); maybe pass kv_type to insert to avoid copy +- dict elems shrink to fit; allow to pass GUF_DBUF_USE_GROWTH_FAC_ONE_POINT_FIVE - guf_stack, guf_queue, guf_dqueue, guf_prio_queue (using a heap), guf_ringbuf