+ key = pos.set(code, WHITE, &st).material_key();
+ pieceCount = popcount(pos.pieces());
+ hasPawns = pos.pieces(PAWN);
+
+ hasUniquePieces = false;
+ for (Color c = WHITE; c <= BLACK; ++c)
+ for (PieceType pt = PAWN; pt < KING; ++pt)
+ if (popcount(pos.pieces(c, pt)) == 1)
+ hasUniquePieces = true;
+
+ if (hasPawns) {
+ // Set the leading color. In case both sides have pawns the leading color
+ // is the side with less pawns because this leads to better compression.
+ bool c = !pos.count<PAWN>(BLACK)
+ || ( pos.count<PAWN>(WHITE)
+ && pos.count<PAWN>(BLACK) >= pos.count<PAWN>(WHITE));
+
+ pawnCount[0] = pos.count<PAWN>(c ? WHITE : BLACK);
+ pawnCount[1] = pos.count<PAWN>(c ? BLACK : WHITE);
+ }
+
+ key2 = pos.set(code, BLACK, &st).material_key();
+}
+
+template<>
+TBEntry<DTZ>::TBEntry(const TBEntry<WDL>& wdl) : TBEntry() {
+
+ key = wdl.key;
+ key2 = wdl.key2;
+ pieceCount = wdl.pieceCount;
+ hasPawns = wdl.hasPawns;
+ hasUniquePieces = wdl.hasUniquePieces;
+
+ if (hasPawns) {
+ pawnCount[0] = wdl.pawnCount[0];
+ pawnCount[1] = wdl.pawnCount[1];
+ }
+}