aboutsummaryrefslogtreecommitdiff
path: root/include/tt_llcht.c
diff options
context:
space:
mode:
Diffstat (limited to 'include/tt_llcht.c')
-rw-r--r--include/tt_llcht.c85
1 files changed, 85 insertions, 0 deletions
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;
+}