]> git.sesse.net Git - stockfish/blobdiff - src/position.h
Use a union to fast and simply backup info in do_move()
[stockfish] / src / position.h
index 94b7003373d817fe6f40be5b13701b4197c6fd20..aaed663b79209620a490d276bc6b86a34c879d2f 100644 (file)
@@ -74,17 +74,16 @@ enum CastleRights {
 
 
 /// The UndoInfo struct stores information we need to restore a Position
-/// object to its previous state when we retract a move.  Whenever a move
+/// object to its previous state when we retract a move. Whenever a move
 /// is made on the board (by calling Position::do_move), an UndoInfo object
-/// must be passed as a parameter.  When the move is unmade (by calling
+/// must be passed as a parameter. When the move is unmade (by calling
 /// Position::undo_move), the same UndoInfo object must be passed again.
 
 struct UndoInfo {
-  int castleRights;
-  Square epSquare;
-  Bitboard checkersBB, pinners[2], pinned[2], dcCandidates[2];
+  Bitboard pinners[2], pinned[2], dcCandidates[2], checkersBB;
   Key key, pawnKey, materialKey;
-  int rule50;
+  int castleRights, rule50;
+  Square epSquare;
   Move lastMove;
   Value mgValue, egValue;
   PieceType capture;
@@ -241,8 +240,6 @@ public:
   bool square_is_weak(Square s, Color c) const;
 
   // Doing and undoing moves
-  void backup(UndoInfo &u) const;
-  void restore(const UndoInfo &u);
   void do_move(Move m, UndoInfo &u);
   void undo_move(Move m, const UndoInfo &u);
   void do_null_move(UndoInfo &u);
@@ -326,8 +323,6 @@ private:
 
   // Bitboards
   Bitboard byColorBB[2], byTypeBB[8];
-  Bitboard checkersBB;
-  mutable Bitboard pinners[2], pinned[2], dcCandidates[2];
 
   // Board
   Piece board[64];
@@ -340,16 +335,27 @@ private:
   int index[64];
 
   // Other info
-  Color sideToMove;
-  int castleRights;
-  File initialKFile, initialKRFile, initialQRFile;
-  Square epSquare;
   Square kingSquare[2];
-  Move lastMove;
-  Key key, pawnKey, materialKey, history[MaxGameLength];
-  int rule50, gamePly;
-  Value mgValue, egValue;
+  Color sideToMove;
+  int gamePly;
+  Key history[MaxGameLength];
   Value npMaterial[2];
+  File initialKFile, initialKRFile, initialQRFile;
+
+  // 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];
+          Bitboard checkersBB;
+          Key key, pawnKey, materialKey;
+          int castleRights, rule50;
+          Square epSquare;
+          Move lastMove;
+          Value mgValue, egValue;
+          PieceType capture;
+      };
+  };
 
   // Static variables
   static int castleRightsMask[64];