From 184e7d8514d38aa8a63fd9624809b1ff1a9e1b8b Mon Sep 17 00:00:00 2001 From: Vftdan Date: Mon, 19 Aug 2024 21:19:04 +0200 Subject: [PATCH] Hashtable entry deletion method --- hash_table.c | 33 +++++++++++++++++++++++++++++++++ hash_table.h | 9 +++++++++ 2 files changed, 42 insertions(+) diff --git a/hash_table.c b/hash_table.c index 471f2fc..849fca5 100644 --- a/hash_table.c +++ b/hash_table.c @@ -325,3 +325,36 @@ hash_table_find_impl(const HashTableDynamicData * ht, const HashTableKey key) return -1; } + +bool +hash_table_delete_at_index_impl(HashTableDynamicData * ht, const HashTableIndex index) +{ + if (!ht) { + return false; + } + + if (index < 0 || (size_t) index > ht->capacity) { + return false; + } + + HashTableKeyEntry *key_entry_ptr = ht->key_array + index; + void *value_ptr = ht->value_array + (ht->value_size * index); + + if (!key_entry_ptr->key.bytes) { + // No entry at index + return false; + } + + // TODO find base_index and reduce its max_collision_offset when provably justified + + hash_table_key_deinit_copied(&key_entry_ptr->key); + ht->length -= 1; + + void (*value_deinit)(void*) = ht->value_deinit; + if (value_deinit) { + value_deinit(value_ptr); + } + memset(value_ptr, 0, ht->value_size); + + return true; +} diff --git a/hash_table.h b/hash_table.h index dc29193..69a8af4 100644 --- a/hash_table.h +++ b/hash_table.h @@ -53,10 +53,19 @@ void hash_table_init_impl(HashTableDynamicData * dyndata, size_t value_size, voi void hash_table_deinit_impl(HashTableDynamicData * dyndata); HashTableIndex hash_table_insert_impl(HashTableDynamicData * dyndata, const HashTableKey key, const void * value_ptr); HashTableIndex hash_table_find_impl(const HashTableDynamicData * dyndata, const HashTableKey key); +bool hash_table_delete_at_index_impl(HashTableDynamicData * dyndata, const HashTableIndex index); + +__attribute__((unused)) inline static bool +hash_table_delete_by_key_impl(HashTableDynamicData * dyndata, const HashTableKey key) +{ + return hash_table_delete_at_index_impl(dyndata, hash_table_find_impl(dyndata, key)); +} #define hash_table_init(ht, value_deinit) hash_table_init_impl(&(ht)->as_HashTableDynamicData, sizeof(*(ht)->value_array), IMPLICIT_CAST(void(void*), void(typeof((ht)->value_array)), value_deinit)) #define hash_table_deinit(ht) hash_table_deinit_impl(&(ht)->as_HashTableDynamicData) #define hash_table_insert(ht, key, value_ptr) hash_table_insert_impl(&(ht)->as_HashTableDynamicData, key, IMPLICIT_CAST(const void, const typeof(*(ht)->value_array), value_ptr)) #define hash_table_find(ht, key) hash_table_find_impl(&(ht)->as_HashTableDynamicData, key) +#define hash_table_delete_at_index(ht, index) hash_table_delete_at_index_impl(&(ht)->as_HashTableDynamicData, index) +#define hash_table_delete_by_key(ht, key) hash_table_delete_by_key_impl(&(ht)->as_HashTableDynamicData, key) #endif /* end of include guard: HASH_TABLE_H_ */