mirror of
https://github.com/Mathewnd/Astral.git
synced 2026-10-27 20:58:22 +00:00
42 lines
1.1 KiB
C
42 lines
1.1 KiB
C
#ifndef _HASHTABLE_H
|
|
#define _HASHTABLE_H
|
|
|
|
#include <stdint.h>
|
|
#include <stddef.h>
|
|
#include <stdbool.h>
|
|
|
|
typedef struct hashentry_t {
|
|
struct hashentry_t *next;
|
|
struct hashentry_t *prev;
|
|
uintmax_t hash;
|
|
size_t keysize;
|
|
void *key;
|
|
void *value;
|
|
} hashentry_t;
|
|
|
|
typedef struct {
|
|
size_t entrycount; // for bookkeeping
|
|
size_t capacity;
|
|
hashentry_t **entries;
|
|
} hashtable_t;
|
|
|
|
int hashtable_init(hashtable_t *table, size_t size);
|
|
int hashtable_set(hashtable_t *table, void *value, void *key, size_t keysize, bool allocate);
|
|
int hashtable_get(hashtable_t *table, void **value, void *key, size_t keysize);
|
|
int hashtable_remove(hashtable_t *table, void *key, size_t keysize);
|
|
int hashtable_destroy(hashtable_t *table);
|
|
|
|
#define HASHTABLE_FOREACH(table) \
|
|
for (uintmax_t toffset = 0; toffset < (table)->capacity; ++toffset) \
|
|
for (hashentry_t *entry = (table)->entries[toffset]; entry != NULL; entry = entry->next)
|
|
|
|
#define HASHTABLE_DEFINE_STATIC(name, size) \
|
|
static hashentry_t *entries_ht_##name[size]; \
|
|
static hashtable_t name = { \
|
|
.entrycount = 0, \
|
|
.capacity = size, \
|
|
.entries = entries_ht_##name \
|
|
}
|
|
|
|
#endif
|