diff options
| author | Mistivia <i@mistivia.com> | 2025-06-09 01:42:18 +0800 |
|---|---|---|
| committer | Mistivia <i@mistivia.com> | 2025-06-09 01:42:52 +0800 |
| commit | 12eeb35015aba138a4e543c28c2ecee58d532440 (patch) | |
| tree | 11a7776977c661f5f5a7c013bed290ba96fa2c23 /src/hash_table.h | |
| parent | 55f3a89f40a676fca7fb820037457c74cbdebb92 (diff) | |
pass by value in basic traits
Diffstat (limited to 'src/hash_table.h')
| -rw-r--r-- | src/hash_table.h | 34 |
1 files changed, 21 insertions, 13 deletions
diff --git a/src/hash_table.h b/src/hash_table.h index 429142c..ba42628 100644 --- a/src/hash_table.h +++ b/src/hash_table.h @@ -26,30 +26,38 @@ typedef struct hash_table HashTable; HashTable ht; \ } K##2##V##HashTable; \ void K##2##V##HashTable_init(K##2##V##HashTable *self); \ - bool K##2##V##HashTable_insert(K##2##V##HashTable *self, K *key, V *value); \ + bool K##2##V##HashTable_insert(K##2##V##HashTable *self, K key, V value); \ void K##2##V##HashTable_remove(K##2##V##HashTable *ht, K##2##V##HashTableIter iter); \ - V* K##2##V##HashTable_get(K##2##V##HashTable *self, K *key); \ - K##2##V##HashTableIter K##2##V##HashTable_find(K##2##V##HashTable *self, K *key); \ + V* K##2##V##HashTable_get(K##2##V##HashTable *self, K key); \ + K##2##V##HashTableIter K##2##V##HashTable_find(K##2##V##HashTable *self, K key); \ K##2##V##HashTableIter K##2##V##HashTable_begin(K##2##V##HashTable *self); \ K##2##V##HashTableIter K##2##V##HashTable_next(K##2##V##HashTable *self, K##2##V##HashTableIter iter); \ void K##2##V##HashTable_free(K##2##V##HashTable *self); \ K##2##V##HashTable K##2##V##HashTable_move(K##2##V##HashTable *self); \ #define HASH_TABLE_IMPL(K, V) \ + static uint64_t K##2##V##HashTable_hash(void *vk) { \ + K *k = vk; \ + return K##_hash(*k); \ + } \ + static bool K##2##V##HashTable_eq(void *vk1, void *vk2) { \ + K *k1 = vk1, *k2 = vk2; \ + return K##_eq(*k1, *k2); \ + } \ void K##2##V##HashTable_init(K##2##V##HashTable *self) { \ init_hash_table(&self->ht, sizeof(K##2##V##HashTableEntry), 16); \ } \ - bool K##2##V##HashTable_insert(K##2##V##HashTable *self, K *key, V *value) { \ + bool K##2##V##HashTable_insert(K##2##V##HashTable *self, K key, V value) { \ K##2##V##HashTableEntry entry; \ - memcpy(&entry.key, key, sizeof(K)); \ - memcpy(&entry.val, value, sizeof(K)); \ - return hash_table_insert(&self->ht, &entry, (VoidHashFn)K##_hash, (VoidEqFn)K##_eq); \ + entry.key = key; \ + entry.val = value; \ + return hash_table_insert(&self->ht, &entry, K##2##V##HashTable_hash, K##2##V##HashTable_eq); \ } \ - K##2##V##HashTableIter K##2##V##HashTable_find(K##2##V##HashTable *self, K *key) { \ - return hash_table_find(&self->ht, key, (VoidHashFn)K##_hash, (VoidEqFn)K##_eq); \ + K##2##V##HashTableIter K##2##V##HashTable_find(K##2##V##HashTable *self, K key) { \ + return hash_table_find(&self->ht, &key, K##2##V##HashTable_hash, K##2##V##HashTable_eq); \ } \ - V* K##2##V##HashTable_get(K##2##V##HashTable *self, K *key) { \ - K##2##V##HashTableEntry* entry = hash_table_find(&self->ht, key, (VoidHashFn)K##_hash, (VoidEqFn)K##_eq); \ + V* K##2##V##HashTable_get(K##2##V##HashTable *self, K key) { \ + K##2##V##HashTableEntry* entry = hash_table_find(&self->ht, &key, K##2##V##HashTable_hash, K##2##V##HashTable_eq); \ if (entry == NULL) return NULL; \ return &(entry->val); \ } \ @@ -86,9 +94,9 @@ HASH_TABLE_DEF(VoidPtr, Int); HASH_TABLE_DEF(VoidPtr, String); void init_hash_table(HashTable *ht, int64_t elemsz, int64_t cap); -bool hash_table_insert(HashTable *ht, void *elem, VoidHashFn hash, VoidEqFn eq); +bool hash_table_insert(HashTable *ht, void *elem, uint64_t (*hash)(void*), bool (*eq)(void*, void*)); void hash_table_remove(HashTable *ht, void *iter); -void *hash_table_find(HashTable *ht, void *elem, VoidHashFn hash, VoidEqFn eq); +void *hash_table_find(HashTable *ht, void *elem, uint64_t (*hash)(void*), bool (*eq)(void*, void*)); void *hash_table_begin(HashTable *ht); void *hash_table_next(HashTable *ht, void *iter); void destroy_hash_table(HashTable *ht); |
