aboutsummaryrefslogtreecommitdiff
path: root/src/hash_table.h
diff options
context:
space:
mode:
authorMistivia <i@mistivia.com>2025-07-22 15:28:30 +0800
committerMistivia <i@mistivia.com>2025-07-22 15:28:45 +0800
commit999fcf0f7655c03265c222cc67617f0f510979bf (patch)
treedd51680ffda411239e37460c834a996dc934dc63 /src/hash_table.h
parenta8764a20f355fd8fb7b03978d754d1cbd48d0a88 (diff)
change dir structure
Diffstat (limited to 'src/hash_table.h')
-rw-r--r--src/hash_table.h105
1 files changed, 0 insertions, 105 deletions
diff --git a/src/hash_table.h b/src/hash_table.h
deleted file mode 100644
index 9b45dff..0000000
--- a/src/hash_table.h
+++ /dev/null
@@ -1,105 +0,0 @@
-#ifndef HTABLE_H_
-#define HTABLE_H_
-
-#include <stdbool.h>
-#include <stdint.h>
-
-#include "type_alias.h"
-
-struct hash_table {
- void *buf;
- char *flagbuf;
- int64_t size;
- int64_t cap;
- int64_t taken;
- int64_t elemsz;
-};
-typedef struct hash_table HashTable;
-
-#define HASH_TABLE_DEF(K, V) \
- typedef struct { \
- K key; \
- V val; \
- } K##2##V##HashTableEntry; \
- typedef K##2##V##HashTableEntry *K##2##V##HashTableIter; \
- typedef struct { \
- 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); \
- 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); \
- 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) { \
- K##2##V##HashTableEntry entry; \
- 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, 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, K##2##V##HashTable_hash, K##2##V##HashTable_eq); \
- if (entry == NULL) return NULL; \
- return &(entry->val); \
- } \
- void K##2##V##HashTable_remove(K##2##V##HashTable *self, K##2##V##HashTableIter iter) { \
- hash_table_remove(&self->ht, iter); \
- } \
- K##2##V##HashTableIter K##2##V##HashTable_begin(K##2##V##HashTable *self) { \
- return hash_table_begin(&self->ht); \
- } \
- K##2##V##HashTableIter K##2##V##HashTable_next(K##2##V##HashTable *self, K##2##V##HashTableIter iter) { \
- return hash_table_next(&self->ht, iter); \
- } \
- void K##2##V##HashTable_free(K##2##V##HashTable *self) { \
- destroy_hash_table(&self->ht); \
- } \
- K##2##V##HashTable K##2##V##HashTable_move(K##2##V##HashTable *self) { \
- K##2##V##HashTable dup; \
- dup.ht = self->ht; \
- self->ht.buf = NULL; \
- self->ht.flagbuf = NULL; \
- self->ht.size = 0; \
- self->ht.cap = 0; \
- self->ht.taken = 0; \
- return dup; \
- } \
-
-HASH_TABLE_DEF(String, Int);
-HASH_TABLE_DEF(String, String);
-HASH_TABLE_DEF(String, Double);
-HASH_TABLE_DEF(String, VoidPtr);
-HASH_TABLE_DEF(Int, Int);
-HASH_TABLE_DEF(Int, Double);
-HASH_TABLE_DEF(VoidPtr, Int);
-HASH_TABLE_DEF(VoidPtr, String);
-HASH_TABLE_DEF(VoidPtr, VoidPtr);
-
-void init_hash_table(HashTable *ht, int64_t elemsz, int64_t cap);
-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, 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);
-
-#endif