From 7dc20b4709b4c641372aedfb3661341e139ac63c Mon Sep 17 00:00:00 2001 From: tslil Date: Mon, 8 Feb 2021 13:44:45 -0500 Subject: Working on caching move generation --- include/hashtable.c | 86 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 include/hashtable.c (limited to 'include/hashtable.c') diff --git a/include/hashtable.c b/include/hashtable.c new file mode 100644 index 0000000..179b029 --- /dev/null +++ b/include/hashtable.c @@ -0,0 +1,86 @@ +/* + This file is part of ct. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Takwrap. If not, see . +*/ + +#include "hashtable.h" + +// =================================================================== +// Helper declarations +// =================================================================== + +ht_entry_t * new_ll_node(const uint64_t key, void *data); + +// =================================================================== +// Exported functions +// =================================================================== + +hashtable_t *ht_init(void) { + hashtable_t *table = malloc(sizeof(struct hashtable_s)); + table->num_entries = 0; + for (uint32_t k=0; k<=HASHTABLE_SIZE; k++) + table->entries[k] = NULL; + return EXIT_SUCCESS; +} + +void ht_free(void *data_free(void*), hashtable_t *table) { + ht_entry_t *n, *nn; + for (uint32_t k=0; k<=HASHTABLE_SIZE; k++) { + n = table->entries[k]; + while (n) { + nn = n->next; + data_free(n->data); + free(n); + n = nn; + } + } +} + +ht_entry_t *ht_seek(const uint64_t key, hashtable_t *table) { + ht_entry_t *lookup = table->entries[key & HASHTABLE_SIZE]; + while (lookup && lookup->key != key) + lookup = lookup->next; + return lookup; +} + +int ht_insert(const uint64_t key, void *data, hashtable_t *table) { + ht_entry_t *new = new_ll_node(key, data), *n; + // TODO: trap + + const uint32_t idx = key & HASHTABLE_SIZE; + if ((n = table->entries[idx]) != NULL) { + for (; n->next != NULL; n = n->next); + n->next = new; + } else { + table->entries[idx] = new; + } + + table->num_entries++; + + return EXIT_SUCCESS; +} + +// =================================================================== +// Helper function implementations +// =================================================================== + +ht_entry_t *new_ll_node(const uint64_t key, void *data) { + ht_entry_t *new = malloc(sizeof(struct ht_node_s)); + // TODO: trap errno + new->key = key; + new->next = NULL; + new->data = data; + return new; +} -- cgit v1.2.3