X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Ftt.h;h=f2928fb9e84b4b754ae9c1ecfb9a1c01b7778a56;hp=9babce8cdc9f10e14500c1f9c4e5cdc6a071d033;hb=0ddf84870ad9f7fb4309e992e1e5eae968577958;hpb=85a7456bd7e8a1a01cdbfa8f4b6fb563d15a37c6 diff --git a/src/tt.h b/src/tt.h index 9babce8c..f2928fb9 100644 --- a/src/tt.h +++ b/src/tt.h @@ -34,6 +34,39 @@ //// Types //// + +/// A simple fixed size hash table used to store pawns and material +/// configurations. It is basically just an array of Entry objects. +/// Without cluster concept or overwrite policy. + +template +class SimpleHash { + + SimpleHash(const SimpleHash&); + SimpleHash& operator=(const SimpleHash&); + +public: + SimpleHash() { + + entries = new Entry[HashSize]; + if (!entries) + { + std::cerr << "Failed to allocate " << HashSize * sizeof(Entry) + << " bytes for material hash table." << std::endl; + exit(EXIT_FAILURE); + } + memset(entries, 0, HashSize * sizeof(Entry)); + } + + ~SimpleHash() { delete [] entries; } + + Entry* find(Key key) const { return entries + unsigned(key & (HashSize - 1)); } + +protected: + Entry* entries; +}; + + /// The TTEntry class is the class of transposition table entries /// /// A TTEntry needs 128 bits to be stored @@ -59,11 +92,12 @@ public: key32 = k; data = (m & 0x1FFFF) | (t << 21) | (g << 23); - value16 = int16_t(v); - depth16 = int16_t(d); - staticValue = int16_t(statV); - staticValueMargin = int16_t(kd); + value16 = (int16_t)v; + depth16 = (int16_t)d; + staticValue = (int16_t)statV; + staticValueMargin = (int16_t)kd; } + void set_generation(int g) { data = move() | (type() << 21) | (g << 23); } uint32_t key() const { return key32; } Depth depth() const { return Depth(depth16); } @@ -114,11 +148,12 @@ public: TTEntry* retrieve(const Key posKey) const; void new_search(); TTEntry* first_entry(const Key posKey) const; + void refresh(const TTEntry* tte) const; private: size_t size; TTCluster* entries; - uint8_t generation; + uint8_t generation; // To properly compare, size must be smaller then TT stored value }; extern TranspositionTable TT; @@ -130,7 +165,16 @@ extern TranspositionTable TT; inline TTEntry* TranspositionTable::first_entry(const Key posKey) const { - return entries[uint32_t(posKey) & (size - 1)].data; + return entries[((uint32_t)posKey) & (size - 1)].data; +} + + +/// TranspositionTable::refresh updates the 'generation' value of the TTEntry +/// to avoid aging. Normally called after a TT hit, before to return. + +inline void TranspositionTable::refresh(const TTEntry* tte) const { + + const_cast(tte)->set_generation(generation); } #endif // !defined(TT_H_INCLUDED)