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
|
#if GUF_DICT_HASH_T_MAX == UINT64_MAX
|
||||||
#define GUF_DICT_HASH_T_GET_HASHFRAG(HASH) ( (HASH) & GUF_DICT_KV_META_HASHFRAG_MASK )
|
#define GUF_DICT_HASH_T_GET_HASHFRAG(HASH) ( (HASH) & GUF_DICT_KV_META_HASHFRAG_MASK )
|
||||||
#elif GUF_DICT_HASH_T_MAX == UINT32_MAX
|
#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
|
#else
|
||||||
#error "guf_dict: invalid hash size (should not happen)"
|
#error "guf_dict: invalid hash size (should not happen)"
|
||||||
#endif
|
#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, _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, _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 */
|
// #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;
|
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_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);
|
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).
|
// Find next power of two (capacities must be powers of two).
|
||||||
size_t pow2_cap = 1;
|
size_t pow2_cap = 1;
|
||||||
const size_t max_pow2 = SIZE_T_MAX & ~(SIZE_T_MAX >> 1);
|
const size_t MAX_SIZE_POW2 = SIZE_T_MAX & ~(SIZE_T_MAX >> 1);
|
||||||
while ((pow2_cap < max_pow2) && ((pow2_cap << 1) < max_cap_kv_indices) ) {
|
while ((pow2_cap < MAX_SIZE_POW2) && ((pow2_cap << 1) < max_cap_kv_indices) ) {
|
||||||
pow2_cap <<= 1;
|
pow2_cap <<= 1;
|
||||||
}
|
}
|
||||||
GUF_ASSERT(guf_is_pow2_size_t(pow2_cap) && pow2_cap <= 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 */
|
#endif /* end GUF_IMPL/GUF_IMPL_STATIC */
|
||||||
|
|
||||||
#undef GUF_DICT_KV_META_T
|
#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_32_BIT_HASH
|
||||||
#undef GUF_DICT_64_BIT_HASH
|
#undef GUF_DICT_64_BIT_HASH
|
||||||
|
|||||||
@ -15,8 +15,10 @@
|
|||||||
#define GUF_DICT_VAL_T int32_t
|
#define GUF_DICT_VAL_T int32_t
|
||||||
#define GUF_DICT_VAL_T_IS_INTEGRAL_TYPE
|
#define GUF_DICT_VAL_T_IS_INTEGRAL_TYPE
|
||||||
#define GUF_DICT_NAME dict_sv_i32
|
#define GUF_DICT_NAME dict_sv_i32
|
||||||
// #define GUF_DICT_PROBE_LINEAR
|
|
||||||
#define GUF_DICT_IMPL
|
#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"
|
#include "guf_dict.h"
|
||||||
|
|
||||||
#define GUF_DICT_KEY_T int32_t
|
#define GUF_DICT_KEY_T int32_t
|
||||||
|
|||||||
@ -21,6 +21,9 @@
|
|||||||
#define GUF_DICT_VAL_T int32_t
|
#define GUF_DICT_VAL_T int32_t
|
||||||
#define GUF_DICT_VAL_T_IS_INTEGRAL_TYPE
|
#define GUF_DICT_VAL_T_IS_INTEGRAL_TYPE
|
||||||
#define GUF_DICT_NAME dict_sv_i32
|
#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"
|
#include "guf_dict.h"
|
||||||
|
|
||||||
static inline guf_hash_size_t int32_hash(const int32_t *a)
|
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 << "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;
|
size_t num_passed = 0;
|
||||||
for (auto &test : g_tests) {
|
for (auto &test : g_tests) {
|
||||||
Test *tst = test.get();
|
Test *tst = test.get();
|
||||||
|
|||||||
2
todo.txt
2
todo.txt
@ -1,5 +1,7 @@
|
|||||||
- sort: add cpp #ifdef to remove restrict from declaration
|
- 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_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.
|
- 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