#ifndef TTABLE_H #define TTABLE_H #include "engine/moves.h" #include "bitboard.h" #include #define TABLE_BITS 24 #define TABLE_SIZE (1ULL << TABLE_BITS) #define TT_MASK (TABLE_SIZE - 1) #define TT_BUCKET_SIZE 4 static struct zobrist_keys { u64 piece[PIECE_TYPE_COUNT][64]; u64 castle[CASTLE_COUNT]; u64 turn[TURN_COUNT]; u64 en_passant[64]; } zobrist_keys; void zobrist_init(); u64 zobrist_hash(position_t position); enum { TT_EXACT, TT_LOWERBOUND, TT_UPPERBOUND }; typedef struct { atomic_uint_fast64_t key; move_t best_move; i16 score; // depth analysed i16 eval; // non-depth analysed u16 depth; u16 generation; u8 flag; } tentry_t; typedef struct { tentry_t entries[TT_BUCKET_SIZE]; int items_filled; } tbucket_t; typedef tbucket_t* ttable_t; struct ttable_insert_args { u64 key; move_t move; i16 score; i16 eval; u16 depth; u16 generation; u8 flag; }; void ttable_init(ttable_t *table); void ttable_deinit(ttable_t table); void __ttable_insert(ttable_t table, struct ttable_insert_args args); tentry_t *ttable_find(ttable_t table, u64 key); #define ttable_insert(ttable, ...) __ttable_insert( \ ttable, \ (struct ttable_insert_args) { __VA_ARGS__ } \ ) #endif // TTABLE_H