mirror of
https://github.com/HChaZZY/Stockfish.git
synced 2025-12-24 19:16:49 +08:00
Use a trivially copyable struct for TBTables::Entry instead of a tuple.
fixes https://github.com/official-stockfish/Stockfish/issues/2673 which is a warning issued by recent gcc (10.1) closes https://github.com/official-stockfish/Stockfish/pull/2674 No functional change
This commit is contained in:
committed by
Joost VandeVondele
parent
66ed8b6c47
commit
86ee4eb84d
@@ -60,7 +60,7 @@ namespace {
|
||||
constexpr int TBPIECES = 7; // Max number of supported pieces
|
||||
|
||||
enum { BigEndian, LittleEndian };
|
||||
enum TBType { KEY, WDL, DTZ }; // Used as template parameter
|
||||
enum TBType { WDL, DTZ }; // Used as template parameter
|
||||
|
||||
// Each table has a set of flags: all of them refer to DTZ tables, the last one to WDL tables
|
||||
enum TBFlag { STM = 1, Mapped = 2, WinPlies = 4, LossPlies = 8, Wide = 16, SingleValue = 128 };
|
||||
@@ -403,7 +403,18 @@ TBTable<DTZ>::TBTable(const TBTable<WDL>& wdl) : TBTable() {
|
||||
// at init time, accessed at probe time.
|
||||
class TBTables {
|
||||
|
||||
typedef std::tuple<Key, TBTable<WDL>*, TBTable<DTZ>*> Entry;
|
||||
struct Entry
|
||||
{
|
||||
Key key;
|
||||
TBTable<WDL>* wdl;
|
||||
TBTable<DTZ>* dtz;
|
||||
|
||||
template <TBType Type>
|
||||
TBTable<Type>* get() const {
|
||||
return (TBTable<Type>*)(Type == WDL ? (void*)wdl : (void*)dtz);
|
||||
}
|
||||
};
|
||||
static_assert(std::is_trivially_copyable<Entry>::value, "");
|
||||
|
||||
static constexpr int Size = 1 << 12; // 4K table, indexed by key's 12 lsb
|
||||
static constexpr int Overflow = 1; // Number of elements allowed to map to the last bucket
|
||||
@@ -415,12 +426,12 @@ class TBTables {
|
||||
|
||||
void insert(Key key, TBTable<WDL>* wdl, TBTable<DTZ>* dtz) {
|
||||
uint32_t homeBucket = (uint32_t)key & (Size - 1);
|
||||
Entry entry = std::make_tuple(key, wdl, dtz);
|
||||
Entry entry{ key, wdl, dtz };
|
||||
|
||||
// Ensure last element is empty to avoid overflow when looking up
|
||||
for (uint32_t bucket = homeBucket; bucket < Size + Overflow - 1; ++bucket) {
|
||||
Key otherKey = std::get<KEY>(hashTable[bucket]);
|
||||
if (otherKey == key || !std::get<WDL>(hashTable[bucket])) {
|
||||
Key otherKey = hashTable[bucket].key;
|
||||
if (otherKey == key || !hashTable[bucket].get<WDL>()) {
|
||||
hashTable[bucket] = entry;
|
||||
return;
|
||||
}
|
||||
@@ -429,7 +440,7 @@ class TBTables {
|
||||
// insert here and search for a new spot for the other element instead.
|
||||
uint32_t otherHomeBucket = (uint32_t)otherKey & (Size - 1);
|
||||
if (otherHomeBucket > homeBucket) {
|
||||
swap(entry, hashTable[bucket]);
|
||||
std::swap(entry, hashTable[bucket]);
|
||||
key = otherKey;
|
||||
homeBucket = otherHomeBucket;
|
||||
}
|
||||
@@ -442,8 +453,8 @@ public:
|
||||
template<TBType Type>
|
||||
TBTable<Type>* get(Key key) {
|
||||
for (const Entry* entry = &hashTable[(uint32_t)key & (Size - 1)]; ; ++entry) {
|
||||
if (std::get<KEY>(*entry) == key || !std::get<Type>(*entry))
|
||||
return std::get<Type>(*entry);
|
||||
if (entry->key == key || !entry->get<Type>())
|
||||
return entry->get<Type>();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user