19#ifndef TRANSPOSITION_TABLE_HPP
20#define TRANSPOSITION_TABLE_HPP
30constexpr uint64_t med(uint64_t min, uint64_t max) {
31 return (min + max) / 2;
36constexpr bool has_factor(uint64_t n, uint64_t min, uint64_t max) {
37 return min * min > n ? false :
38 min + 1 >= max ? n % min == 0 :
39 has_factor(n, min, med(min, max)) || has_factor(n, med(min, max), max);
44constexpr uint64_t next_prime(uint64_t n) {
45 return has_factor(n, 2, n) ? next_prime(n + 1) : n;
49constexpr unsigned int log2(
unsigned int n) {
50 return n <= 1 ? 0 : log2(n / 2) + 1;
56template<
class key_t,
class value_t>
59 virtual void* getKeys() = 0;
60 virtual void* getValues() = 0;
61 virtual size_t getSize() = 0;
62 virtual int getKeySize() = 0;
63 virtual int getValueSize() = 0;
66 virtual value_t get(key_t key)
const = 0;
69 friend class OpeningBook;
74template<
int S>
using uint_t =
75 typename std::conditional < S <= 8, uint_least8_t,
76 typename std::conditional < S <= 16, uint_least16_t,
77 typename std::conditional<S <= 32, uint_least32_t,
78 uint_least64_t>::type>::type >::type;
93template<
class partial_key_t,
class key_t,
class value_t,
int log_size>
94class TranspositionTable :
public TableGetter<key_t, value_t> {
96 static const size_t size = next_prime(1 << log_size);
100 void* getKeys()
override {
return K;}
101 void* getValues()
override {
return V;}
102 size_t getSize()
override {
return size;}
103 int getKeySize()
override {
return sizeof(partial_key_t);}
104 int getValueSize()
override {
return sizeof(value_t);}
106 size_t index(key_t key)
const {
111 TranspositionTable() {
112 K =
new partial_key_t[size];
113 V =
new value_t[size];
117 ~TranspositionTable() {
126 memset(K, 0, size *
sizeof(partial_key_t));
127 memset(V, 0, size *
sizeof(value_t));
135 void put(key_t key, value_t value) {
136 size_t pos = index(key);
146 value_t
get(key_t key)
const override {
147 size_t pos = index(key);
148 if(K[pos] == (partial_key_t)key)
return V[pos];
value_t get(key_t key) const override
void put(key_t key, value_t value)