diff options
author | Flavian Kaufmann <flavian@flaviankaufmann.ch> | 2025-05-21 14:05:27 +0200 |
---|---|---|
committer | Flavian Kaufmann <flavian@flaviankaufmann.ch> | 2025-05-21 14:05:27 +0200 |
commit | 8b6acc85633520f109d348c5e46c8a89521b3932 (patch) | |
tree | 1196ec5c493fd57937e7c84ca6ffb9f2d511b264 /src/hash_map.c | |
parent | 442eba08dba74c3254a8d089ca1961147e59972b (diff) | |
download | imp-8b6acc85633520f109d348c5e46c8a89521b3932.tar.gz imp-8b6acc85633520f109d348c5e46c8a89521b3932.zip |
procedures
Diffstat (limited to 'src/hash_map.c')
-rw-r--r-- | src/hash_map.c | 126 |
1 files changed, 0 insertions, 126 deletions
diff --git a/src/hash_map.c b/src/hash_map.c deleted file mode 100644 index 5f80205..0000000 --- a/src/hash_map.c +++ /dev/null @@ -1,126 +0,0 @@ -#include "hash_map.h" -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <assert.h> - -#define INITIAL_SIZE (16) -#define LOAD_FACTOR_THRESHOLD (0.75) - -typedef struct Pair { - char *key; - int value; - struct Pair *next; -} Pair; - -typedef struct HashMap { - Pair **table; - size_t size; - size_t count; -} HashMap; - -static unsigned int hash(const char *key, size_t size) { - unsigned int hash_value = 0; - while (*key) hash_value = (hash_value * 31) + *key++; - return hash_value % size; -} - -static void resize(HashMap *map) { - size_t new_size = map->size * 2; - Pair **new_table = (Pair**)calloc(new_size, sizeof(Pair*)); - assert(new_table); - for (size_t i = 0; i < map->size; ++i) { - Pair *pair = map->table[i]; - while (pair) { - unsigned int index = hash(pair->key, new_size); - Pair *next = pair->next; - pair->next = new_table[index]; - new_table[index] = pair; - pair = next; - } - } - - free(map->table); - map->table = new_table; - map->size = new_size; -} - -HashMap *hashmap_create(void) { - HashMap *map = (HashMap*)malloc(sizeof(HashMap)); - assert(map); - map->size = INITIAL_SIZE; - map->count = 0; - map->table = (Pair**)calloc(map->size, sizeof(Pair*)); - assert(map->table); - return map; -} - -void hashmap_insert(HashMap *map, const char *key, int value) { - int *old_value = hashmap_get(map, key); - if (old_value) { - *old_value = value; - return; - } - if ((float)map->count / map->size > LOAD_FACTOR_THRESHOLD) resize(map); - unsigned int index = hash(key, map->size); - Pair *new_pair = (Pair*)malloc(sizeof(Pair)); - assert(new_pair); - new_pair->key = strdup(key); - assert(new_pair->key); - new_pair->value = value; - new_pair->next = map->table[index]; - map->table[index] = new_pair; - map->count++; -} - -int *hashmap_get(HashMap *map, const char *key) { - unsigned int index = hash(key, map->size); - Pair *pair = map->table[index]; - while (pair) { - if (strcmp(pair->key, key) == 0) return &pair->value; - pair = pair->next; - } - return NULL; -} - -void hashmap_delete(HashMap *map, const char *key) { - unsigned int index = hash(key, map->size); - Pair *pair = map->table[index]; - Pair *prev = NULL; - while (pair) { - if (strcmp(pair->key, key) == 0) { - if (prev) prev->next = pair->next; - else map->table[index] = pair->next; - free(pair->key); - free(pair); - map->count--; - return; - } - prev = pair; - pair = pair->next; - } -} - -void hashmap_free(HashMap *map) { - for (size_t i = 0; i < map->size; ++i) { - Pair *pair = map->table[i]; - while (pair) { - Pair *temp = pair; - pair = pair->next; - free(temp->key); - free(temp); - } - } - free(map->table); - free(map); -} - -void hashmap_iterate(HashMap *map, void (*callback)(const char *key, int value)) { - for (size_t i = 0; i < map->size; ++i) { - Pair *pair = map->table[i]; - while (pair) { - callback(pair->key, pair->value); - pair = pair->next; - } - } -}
\ No newline at end of file |