|
|
@@ -108,8 +108,8 @@ hash_table_clear(struct hash_table *ht) |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void * |
|
|
|
hash_table_find(struct hash_table *ht, const void *key) |
|
|
|
static struct hash_node * |
|
|
|
get_node(struct hash_table *ht, const void *key) |
|
|
|
{ |
|
|
|
const unsigned hash_value = (*ht->hash)(key); |
|
|
|
const unsigned bucket = hash_value % ht->num_buckets; |
|
|
@@ -119,13 +119,20 @@ hash_table_find(struct hash_table *ht, const void *key) |
|
|
|
struct hash_node *hn = (struct hash_node *) node; |
|
|
|
|
|
|
|
if ((*ht->compare)(hn->key, key) == 0) { |
|
|
|
return hn->data; |
|
|
|
return hn; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
return NULL; |
|
|
|
} |
|
|
|
|
|
|
|
void * |
|
|
|
hash_table_find(struct hash_table *ht, const void *key) |
|
|
|
{ |
|
|
|
struct hash_node *hn = get_node(ht, key); |
|
|
|
|
|
|
|
return (hn == NULL) ? NULL : hn->data; |
|
|
|
} |
|
|
|
|
|
|
|
void |
|
|
|
hash_table_insert(struct hash_table *ht, void *data, const void *key) |
|
|
@@ -145,19 +152,12 @@ hash_table_insert(struct hash_table *ht, void *data, const void *key) |
|
|
|
void |
|
|
|
hash_table_remove(struct hash_table *ht, const void *key) |
|
|
|
{ |
|
|
|
const unsigned hash_value = (*ht->hash)(key); |
|
|
|
const unsigned bucket = hash_value % ht->num_buckets; |
|
|
|
struct node *node; |
|
|
|
|
|
|
|
foreach(node, & ht->buckets[bucket]) { |
|
|
|
struct hash_node *hn = (struct hash_node *) node; |
|
|
|
|
|
|
|
if ((*ht->compare)(hn->key, key) == 0) { |
|
|
|
remove_from_list(node); |
|
|
|
free(node); |
|
|
|
return; |
|
|
|
} |
|
|
|
} |
|
|
|
struct node *node = (struct node *) get_node(ht, key); |
|
|
|
if (node != NULL) { |
|
|
|
remove_from_list(node); |
|
|
|
free(node); |
|
|
|
return; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void |