From 1be9fac33c8227564079356c63840d227c88725f Mon Sep 17 00:00:00 2001 From: tslil clingman Date: Thu, 28 Jan 2021 13:53:19 -0500 Subject: Removed treap in favour of linked-list chained hash table --- include/tt_llcht.c | 85 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 include/tt_llcht.c (limited to 'include/tt_llcht.c') diff --git a/include/tt_llcht.c b/include/tt_llcht.c new file mode 100644 index 0000000..03fa6cb --- /dev/null +++ b/include/tt_llcht.c @@ -0,0 +1,85 @@ +#include "tt_llcht.h" + +// =================================================================== +// Variables +// =================================================================== + +uint32_t tt_num_cached; +static tt_entry_t *table[TT_LLCHT_SIZE+1]; + +// =================================================================== +// Helper declarations +// =================================================================== + +tt_entry_t * +new_ll_node(const uint64_t key, const enum TT_FLAG flag, + const uint8_t depth, const float value, + const action_t action); + + +// =================================================================== +// Exported functions +// =================================================================== + +int tt_init(void) { + for (uint k=0; k<=TT_LLCHT_SIZE; k++) + table[k] = NULL; + return EXIT_SUCCESS; +} + +void tt_free(void) { + tt_entry_t *n, *nn; + for (uint k=0; k<=TT_LLCHT_SIZE; k++) { + n = table[k]; + while (n) { + nn = n->next; + free(n); + n = nn; + } + } +} + +tt_entry_t *tt_seek(const uint64_t key) { + tt_entry_t *lookup = table[key & TT_LLCHT_SIZE]; + while (lookup && lookup->key != key) + lookup = lookup->next; + return lookup; +} + +int tt_insert(const uint64_t key, const enum TT_FLAG flag, + const uint8_t depth, const float value, + const action_t action) { + tt_entry_t *new = new_ll_node(key, flag, depth, value, action), *n; + // TODO: trap + + const uint32_t idx = key & TT_LLCHT_SIZE; + if ((n = table[idx]) != NULL) { + for (; n->next != NULL; n = n->next); + n->next = new; + } else { + table[idx] = new; + } + + tt_num_cached++; + + return EXIT_SUCCESS; +} + +// =================================================================== +// Helper function implementations +// =================================================================== + +tt_entry_t * +new_ll_node(const uint64_t key, const enum TT_FLAG flag, + const uint8_t depth, const float value, + const action_t action) { + tt_entry_t *new = malloc(sizeof(struct tt_node_s)); + // TODO: trap errno + new->key = key; + new->next = NULL; + new->flag = flag; + new->depth = depth; + new->value = value; + new->action = action; + return new; +} -- cgit v1.3.1