/* * Tiny hashmap implementation. * Copyright (c) 2023-2024, Quinn Stephens and the OSMORA team. * Provided under the BSD 3-Clause license. */ #include #include #include "hashmap.h" void hashmap_add(struct hashmap *map, struct hashmap_entry *entry) { list_prepend(&map->rows[entry->hash % map->n_rows], &entry->list_entry); } struct hashmap_entry * hashmap_find(struct hashmap *map, hash_t hash) { struct hashmap_entry *head, *entry; entry = head = (struct hashmap_entry*)(map->rows[hash % map->n_rows].head); do { if (entry->hash == hash) { return entry; } entry = (struct hashmap_entry*)(entry->list_entry.next); } while (entry != head); return NULL; } void hashmap_free_entries(struct hashmap *map) { struct hashmap_entry *ent, *next; for (size_t r = 0; r < map->n_rows; r++) { ent = (struct hashmap_entry*)map->rows[r].head; while (ent != (struct hashmap_entry*)&map->rows[r]) { next = (struct hashmap_entry*)ent->list_entry.next; free(ent); ent = next; } } } void hashmap_init(struct hashmap *map) { for (size_t r = 0; r < map->n_rows; r++) { list_init(&map->rows[r]); } }