#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 (uint32_t k=0; k<=TT_LLCHT_SIZE; k++) table[k] = NULL; return EXIT_SUCCESS; } void tt_free(void) { tt_entry_t *n, *nn; for (uint32_t 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; }