aboutsummaryrefslogtreecommitdiff
path: root/hashtable.c
diff options
context:
space:
mode:
Diffstat (limited to 'hashtable.c')
-rw-r--r--hashtable.c13
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);