+
+/// 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 (std::nothrow) 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));
+ }
+
+ virtual ~SimpleHash() { delete [] entries; }
+
+ Entry* find(Key key) const { return entries + ((uint32_t)key & (HashSize - 1)); }
+
+protected:
+ Entry* entries;
+};
+
+
+/// The TTEntry class is the class of transposition table entries
+///
+/// A TTEntry needs 128 bits to be stored
+///
+/// bit 0-31: key
+/// bit 32-63: data
+/// bit 64-79: value
+/// bit 80-95: depth
+/// bit 96-111: static value
+/// bit 112-127: margin of static value
+///
+/// the 32 bits of the data field are so defined
+///
+/// bit 0-15: move
+/// bit 16-20: not used
+/// bit 21-22: value type
+/// bit 23-31: generation