Fix GUF_DICT_64_BIT_IDX and guf_dict_max_capacity()
This commit is contained in:
parent
6a7bd2bd97
commit
b01e087c85
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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();
|
||||
|
||||
2
todo.txt
2
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.
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user