void TranspositionTable::set_size(size_t mbSize) {
- size_t newSize = 1ULL << msb((mbSize << 20) / sizeof(TTEntry[ClusterSize]));
+ assert(msb((mbSize << 20) / sizeof(TTEntry)) < 32);
- if (newSize == size)
+ uint32_t size = 1 << msb((mbSize << 20) / sizeof(TTEntry[ClusterSize]));
+
+ if (clusterMask == size - 1)
return;
- size = newSize;
+ clusterMask = size - 1;
delete [] entries;
entries = new (std::nothrow) TTEntry[size * ClusterSize];
void TranspositionTable::clear() {
- memset(entries, 0, size * sizeof(TTEntry[ClusterSize]));
+ memset(entries, 0, (clusterMask + 1) * sizeof(TTEntry[ClusterSize]));
}
void store(const Key key, Value v, Bound type, Depth d, Move m, Value statV, Value kingD);
private:
- size_t size;
+ uint32_t clusterMask;
TTEntry* entries;
uint8_t generation; // Size must be not bigger then TTEntry::generation8
};
inline TTEntry* TranspositionTable::first_entry(const Key key) const {
- return entries + ((uint32_t)key & (size - 1)) * ClusterSize;
+ return entries + ((uint32_t)key & clusterMask) * ClusterSize;
}