diff options
-rw-r--r-- | hashtable.c | 13 | ||||
-rw-r--r-- | hashtable.h | 3 |
2 files changed, 14 insertions, 2 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); diff --git a/hashtable.h b/hashtable.h index 21467a8..5147fa5 100644 --- a/hashtable.h +++ b/hashtable.h @@ -5,9 +5,10 @@ struct hashtable; -struct hashtable* ht_alloc(); +struct hashtable* ht_alloc(void); void ht_free(struct hashtable *ht); +// Overwrites if the key already exists in the table. void ht_insert(struct hashtable *ht, u64 key, void *value); // Returns NULL if key is not present in the table. |