Build out CK hs functions

This commit is contained in:
Justin Ethier 2021-01-09 07:43:43 -08:00
parent e0b11d2f43
commit c23041781b
2 changed files with 48 additions and 26 deletions

View file

@ -36,12 +36,38 @@ bool ck_hs_init(ck_hs_t *hs, unsigned int mode, ck_hs_hash_cb_t *hash_func,
return true; return true;
} }
void *ck_hs_get(ck_hs_t *hs, unsigned long hash, const void *key) void *ck_hs_get(ck_hs_t *_hs, unsigned long hash, const void *key)
{ {
void *result = NULL;
int index = -1;
simple_hashset_t set = (*_hs).hs;
pthread_mutex_lock(&((*_hs).lock));
index = simple_hashset_is_member(set, (symbol_type *)key);
if (index > 0) {
result = (void *)(set->items[index].item);
}
pthread_mutex_unlock(&((*_hs).lock));
return result;
} }
bool ck_hs_put(ck_hs_t *hs, unsigned long hash, const void *key) bool ck_hs_put(ck_hs_t *_hs, unsigned long hash, const void *key)
{ {
bool result = false;
int rv;
simple_hashset_t hs = (*_hs).hs;
pthread_mutex_lock(&((*_hs).lock));
rv = simple_hashset_add(hs, (symbol_type *)key);
if (rv >= 0) {
result = true;
}
pthread_mutex_unlock(&((*_hs).lock));
return result;
} }
// CK Array section // CK Array section
@ -218,23 +244,6 @@ ck_pr_load_8(const uint8_t *target)
static const size_t prime_1 = 73; static const size_t prime_1 = 73;
static const size_t prime_2 = 5009; static const size_t prime_2 = 5009;
struct simple_hashset_item_st {
size_t hash;
symbol_type* item;
};
struct simple_hashset_st {
size_t nbits;
size_t mask;
size_t capacity;
struct simple_hashset_item_st *items;
size_t nitems;
size_t n_deleted_items;
hash_func_t hash_func;
};
size_t hash_function(const char* p, size_t len) size_t hash_function(const char* p, size_t len)
{ {
size_t hash = 0; size_t hash = 0;
@ -325,9 +334,7 @@ static void set_maybe_rehash(simple_hashset_t set)
int simple_hashset_add(simple_hashset_t set, symbol_type* key) int simple_hashset_add(simple_hashset_t set, symbol_type* key)
{ {
// TODO: get from symbol type:, size_t key_len) size_t key_len = strlen(key->desc);
size_t key_len = strlen(key->desc);
size_t hash = set->hash_func(key->desc, key_len); size_t hash = set->hash_func(key->desc, key_len);
int rv = simple_hashset_add_member(set, key, hash); int rv = simple_hashset_add_member(set, key, hash);
set_maybe_rehash(set); set_maybe_rehash(set);
@ -336,9 +343,7 @@ size_t key_len = strlen(key->desc);
int simple_hashset_is_member(simple_hashset_t set, symbol_type* key) int simple_hashset_is_member(simple_hashset_t set, symbol_type* key)
{ {
// TODO: get from symbol type, size_t key_len) size_t key_len = strlen(key->desc);
size_t key_len = strlen(key->desc);
size_t hash = set->hash_func(key->desc, key_len); size_t hash = set->hash_func(key->desc, key_len);
size_t index = set->mask & (prime_1 * hash); size_t index = set->mask & (prime_1 * hash);

View file

@ -19,9 +19,26 @@ struct ck_malloc {
/* hash function */ /* hash function */
typedef size_t(*hash_func_t)(const char*, size_t); typedef size_t(*hash_func_t)(const char*, size_t);
struct simple_hashset_st; struct simple_hashset_item_st {
size_t hash;
symbol_type* item;
};
struct simple_hashset_st {
size_t nbits;
size_t mask;
size_t capacity;
struct simple_hashset_item_st *items;
size_t nitems;
size_t n_deleted_items;
hash_func_t hash_func;
};
// struct simple_hashset_st;
typedef struct simple_hashset_st *simple_hashset_t; typedef struct simple_hashset_st *simple_hashset_t;
struct hashmap_st; struct hashmap_st;
typedef struct hashmap_st *hashmap_t; typedef struct hashmap_st *hashmap_t;