mirror of
https://github.com/sockspls/badfish
synced 2025-07-11 19:49:14 +00:00
Use a union to fast and simply backup info in do_move()
This nice union trick let us optimize the speed and remove the now unuseful backup() and restore() functions. Signed-off-by: Marco Costalba <mcostalba@gmail.com>
This commit is contained in:
parent
95cfc0e306
commit
1dc27f3232
2 changed files with 16 additions and 65 deletions
|
@ -669,60 +669,6 @@ bool Position::move_is_capture(Move m) const {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// Position::backup() is called when making a move. All information
|
|
||||||
/// necessary to restore the position when the move is later unmade
|
|
||||||
/// is saved to an UndoInfo object. The function Position::restore
|
|
||||||
/// does the reverse operation: When one does a backup followed by
|
|
||||||
/// a restore with the same UndoInfo object, the position is restored
|
|
||||||
/// to the state before backup was called.
|
|
||||||
|
|
||||||
void Position::backup(UndoInfo& u) const {
|
|
||||||
|
|
||||||
for (Color c = WHITE; c <= BLACK; c++)
|
|
||||||
{
|
|
||||||
u.pinners[c] = pinners[c];
|
|
||||||
u.pinned[c] = pinned[c];
|
|
||||||
u.dcCandidates[c] = dcCandidates[c];
|
|
||||||
}
|
|
||||||
u.checkersBB = checkersBB;
|
|
||||||
u.key = key;
|
|
||||||
u.pawnKey = pawnKey;
|
|
||||||
u.materialKey = materialKey;
|
|
||||||
u.castleRights = castleRights;
|
|
||||||
u.rule50 = rule50;
|
|
||||||
u.epSquare = epSquare;
|
|
||||||
u.lastMove = lastMove;
|
|
||||||
u.mgValue = mgValue;
|
|
||||||
u.egValue = egValue;
|
|
||||||
u.capture = NO_PIECE_TYPE;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/// Position::restore() is called when unmaking a move. It copies back
|
|
||||||
/// the information backed up during a previous call to Position::backup.
|
|
||||||
|
|
||||||
void Position::restore(const UndoInfo& u) {
|
|
||||||
|
|
||||||
for (Color c = WHITE; c <= BLACK; c++)
|
|
||||||
{
|
|
||||||
pinners[c] = u.pinners[c];
|
|
||||||
pinned[c] = u.pinned[c];
|
|
||||||
dcCandidates[c] = u.dcCandidates[c];
|
|
||||||
}
|
|
||||||
checkersBB = u.checkersBB;
|
|
||||||
key = u.key;
|
|
||||||
pawnKey = u.pawnKey;
|
|
||||||
materialKey = u.materialKey;
|
|
||||||
castleRights = u.castleRights;
|
|
||||||
rule50 = u.rule50;
|
|
||||||
epSquare = u.epSquare;
|
|
||||||
lastMove = u.lastMove;
|
|
||||||
mgValue = u.mgValue;
|
|
||||||
egValue = u.egValue;
|
|
||||||
// u.capture is restored in undo_move()
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/// Position::update_checkers() is a private method to udpate chekers info
|
/// Position::update_checkers() is a private method to udpate chekers info
|
||||||
|
|
||||||
template<PieceType Piece>
|
template<PieceType Piece>
|
||||||
|
@ -758,7 +704,8 @@ void Position::do_move(Move m, UndoInfo& u) {
|
||||||
|
|
||||||
// Back up the necessary information to our UndoInfo object (except the
|
// Back up the necessary information to our UndoInfo object (except the
|
||||||
// captured piece, which is taken care of later.
|
// captured piece, which is taken care of later.
|
||||||
backup(u);
|
u = undoInfoUnion;
|
||||||
|
u.capture = NO_PIECE_TYPE;
|
||||||
|
|
||||||
// Save the current key to the history[] array, in order to be able to
|
// Save the current key to the history[] array, in order to be able to
|
||||||
// detect repetition draws.
|
// detect repetition draws.
|
||||||
|
@ -1219,7 +1166,7 @@ void Position::undo_move(Move m, const UndoInfo &u) {
|
||||||
|
|
||||||
// Restore information from our UndoInfo object (except the captured piece,
|
// Restore information from our UndoInfo object (except the captured piece,
|
||||||
// which is taken care of later)
|
// which is taken care of later)
|
||||||
restore(u);
|
undoInfoUnion = u;
|
||||||
|
|
||||||
if (move_is_castle(m))
|
if (move_is_castle(m))
|
||||||
undo_castle_move(m);
|
undo_castle_move(m);
|
||||||
|
|
|
@ -240,8 +240,6 @@ public:
|
||||||
bool square_is_weak(Square s, Color c) const;
|
bool square_is_weak(Square s, Color c) const;
|
||||||
|
|
||||||
// Doing and undoing moves
|
// Doing and undoing moves
|
||||||
void backup(UndoInfo &u) const;
|
|
||||||
void restore(const UndoInfo &u);
|
|
||||||
void do_move(Move m, UndoInfo &u);
|
void do_move(Move m, UndoInfo &u);
|
||||||
void undo_move(Move m, const UndoInfo &u);
|
void undo_move(Move m, const UndoInfo &u);
|
||||||
void do_null_move(UndoInfo &u);
|
void do_null_move(UndoInfo &u);
|
||||||
|
@ -345,6 +343,9 @@ private:
|
||||||
File initialKFile, initialKRFile, initialQRFile;
|
File initialKFile, initialKRFile, initialQRFile;
|
||||||
|
|
||||||
// Info backed up in do_move()
|
// Info backed up in do_move()
|
||||||
|
union {
|
||||||
|
UndoInfo undoInfoUnion;
|
||||||
|
struct { // Must have the same layout of UndoInfo
|
||||||
mutable Bitboard pinners[2], pinned[2], dcCandidates[2];
|
mutable Bitboard pinners[2], pinned[2], dcCandidates[2];
|
||||||
Bitboard checkersBB;
|
Bitboard checkersBB;
|
||||||
Key key, pawnKey, materialKey;
|
Key key, pawnKey, materialKey;
|
||||||
|
@ -352,6 +353,9 @@ private:
|
||||||
Square epSquare;
|
Square epSquare;
|
||||||
Move lastMove;
|
Move lastMove;
|
||||||
Value mgValue, egValue;
|
Value mgValue, egValue;
|
||||||
|
PieceType capture;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
// Static variables
|
// Static variables
|
||||||
static int castleRightsMask[64];
|
static int castleRightsMask[64];
|
||||||
|
|
Loading…
Add table
Reference in a new issue