diff options
Diffstat (limited to 'hashtable.c')
-rw-r--r-- | hashtable.c | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/hashtable.c b/hashtable.c index 020d281..322e69c 100644 --- a/hashtable.c +++ b/hashtable.c @@ -1,4 +1,5 @@ #include <limits.h> +#include <assert.h> #include "hashtable.h" @@ -72,7 +73,7 @@ static void ht_grow(struct hashtable *ht) { *ht = newht; } -struct hashtable* ht_alloc() { +struct hashtable* ht_alloc(void) { struct hashtable *ht = malloc(1, struct hashtable); ht->modulus_index = 0; ht->modulus = doubling_primes[ht->modulus_index]; @@ -90,8 +91,18 @@ void ht_free(struct hashtable *ht) { } void ht_insert(struct hashtable *ht, u64 key, void *value) { + assert(value != NULL); + struct bucket *bucket = &ht->table[key % ht->modulus]; + // If key already exists, overwrite that + for (int i = 0; i < bucket->len; i++) { + if (bucket->pairs[i].key == key) { + bucket->pairs[i].value = value; + return; + } + } + if (bucket->cap == 0) { bucket->cap = 1; bucket->pairs = malloc(bucket->cap, struct keyvalue); |