//// 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 Entry, int HashSize>
+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
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); }
private:
size_t size;
TTCluster* entries;
- int generation;
+ uint8_t generation; // To properly compare, size must be smaller then TT stored value
};
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;
}