/* This file is part of ctak. 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 ctak. If not, see . */ #include "tt.h" #include // =================================================================== // Variables // =================================================================== static tt_entry_t table[TT_SIZE + 1]; static uint16_t tt_gen = 0; // =================================================================== // Exported functions // =================================================================== int tt_init(void) { tt_gen++; if (tt_gen == 0) memset(table, 0, sizeof(table)); return EXIT_SUCCESS; } tt_entry_t *tt_seek(const uint64_t key) { tt_entry_t *e = &table[key & TT_SIZE]; if (e->gen == tt_gen && e->key == key) return e; return NULL; } 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 *e = &table[key & TT_SIZE]; // Replacement scheme: keep a stale-but-deeper entry over a shallower new one. if (e->gen == tt_gen && e->depth > depth) return EXIT_SUCCESS; e->key = key; e->value = value; e->action = action; e->gen = tt_gen; e->flag = flag; e->depth = depth; return EXIT_SUCCESS; }