remove hashtable remnant

This commit is contained in:
FelixKratz 2021-09-03 10:35:05 +02:00
parent d83c698fb8
commit 0d052f668c
2 changed files with 0 additions and 139 deletions

View file

@ -27,9 +27,6 @@
#include "misc/log.h"
#include "misc/helpers.h"
#include "misc/memory_pool.h"
#define HASHTABLE_IMPLEMENTATION
#include "misc/hashtable.h"
#undef HASHTABLE_IMPLEMENTATION
#include "misc/socket.h"
#include "misc/socket.c"

View file

@ -1,136 +0,0 @@
#ifndef HASHTABLE_H
#define HASHTABLE_H
#define TABLE_HASH_FUNC(name) unsigned long name(void *key)
typedef TABLE_HASH_FUNC(table_hash_func);
#define TABLE_COMPARE_FUNC(name) int name(void *key_a, void *key_b)
typedef TABLE_COMPARE_FUNC(table_compare_func);
struct bucket {
void *key;
void *value;
struct bucket *next;
};
struct table {
int count;
int capacity;
float max_load;
table_hash_func *hash;
table_compare_func *cmp;
struct bucket **buckets;
};
void table_init(struct table *table, int capacity, table_hash_func hash, table_compare_func cmp);
void table_free(struct table *table);
#define table_add(table, key, value) _table_add(table, key, sizeof(*key), value)
void _table_add(struct table *table, void *key, int key_size, void *value);
void table_remove(struct table *table, void *key);
void *table_find(struct table *table, void *key);
#endif
#ifdef HASHTABLE_IMPLEMENTATION
void table_init(struct table *table, int capacity, table_hash_func hash, table_compare_func cmp) {
table->count = 0;
table->capacity = capacity;
table->max_load = 0.75f;
table->hash = hash;
table->cmp = cmp;
table->buckets = malloc(sizeof(struct bucket *) * capacity);
memset(table->buckets, 0, sizeof(struct bucket *) * capacity);
}
void table_free(struct table *table) {
for (int i = 0; i < table->capacity; ++i) {
struct bucket *next, *bucket = table->buckets[i];
while (bucket) {
next = bucket->next;
free(bucket->key);
free(bucket);
bucket = next;
}
}
if (table->buckets) {
free(table->buckets);
table->buckets = NULL;
}
}
static struct bucket **table_get_bucket(struct table *table, void *key) {
struct bucket **bucket = table->buckets + (table->hash(key) % table->capacity);
while (*bucket) {
if (table->cmp((*bucket)->key, key)) {
break;
}
bucket = &(*bucket)->next;
}
return bucket;
}
static void table_rehash(struct table *table) {
struct bucket **old_buckets = table->buckets;
int old_capacity = table->capacity;
table->count = 0;
table->capacity = 2 * table->capacity;
table->buckets = malloc(sizeof(struct bucket *) * table->capacity);
memset(table->buckets, 0, sizeof(struct bucket *) * table->capacity);
for (int i = 0; i < old_capacity; ++i) {
struct bucket *next_bucket, *old_bucket = old_buckets[i];
while (old_bucket) {
struct bucket **new_bucket = table_get_bucket(table, old_bucket->key);
*new_bucket = malloc(sizeof(struct bucket));
(*new_bucket)->key = old_bucket->key;
(*new_bucket)->value = old_bucket->value;
(*new_bucket)->next = NULL;
++table->count;
next_bucket = old_bucket->next;
free(old_bucket);
old_bucket = next_bucket;
}
}
free(old_buckets);
}
void _table_add(struct table *table, void *key, int key_size, void *value) {
struct bucket **bucket = table_get_bucket(table, key);
if (*bucket) {
if (!(*bucket)->value) {
(*bucket)->value = value;
}
} else {
*bucket = malloc(sizeof(struct bucket));
(*bucket)->key = malloc(key_size);
(*bucket)->value = value;
memcpy((*bucket)->key, key, key_size);
(*bucket)->next = NULL;
++table->count;
float load = (1.0f * table->count) / table->capacity;
if (load > table->max_load) {
table_rehash(table);
}
}
}
void table_remove(struct table *table, void *key) {
struct bucket *next, **bucket = table_get_bucket(table, key);
if (*bucket) {
free((*bucket)->key);
next = (*bucket)->next;
free(*bucket);
*bucket = next;
--table->count;
}
}
void *table_find(struct table *table, void *key) {
struct bucket *bucket = *table_get_bucket(table, key);
return bucket ? bucket->value : NULL;
}
#endif