}
+/// Position::init_new_state() copies from the current state the fields
+/// that will be updated incrementally, skips the fields, like bitboards
+/// that will be recalculated form scratch anyway.
+
+void Position::init_new_state(StateInfo& newSt) {
+
+ newSt.key = st->key;
+ newSt.pawnKey = st->pawnKey;
+ newSt.materialKey = st->materialKey;
+ newSt.castleRights = st->castleRights;
+ newSt.rule50 = st->rule50;
+ newSt.epSquare = st->epSquare;
+ newSt.mgValue = st->mgValue;
+ newSt.egValue = st->egValue;
+ newSt.capture = NO_PIECE_TYPE;
+ newSt.previous = st;
+}
+
+
/// Position::do_move() makes a move, and saves all information necessary
/// to a StateInfo object. The move is assumed to be legal.
/// Pseudo-legal moves should be filtered out before this function is called.
assert(is_ok());
assert(move_is_ok(m));
- // Get now the current (pre-move) dc candidates that we will use
+ // Get now the current (before to move) dc candidates that we will use
// in update_checkers().
Bitboard oldDcCandidates = discovered_check_candidates(side_to_move());
- // Copy the old state to our new StateInfo object (except the
- // captured piece, which is taken care of later.
- // TODO do not copy pinners and checkersBB because are recalculated
- // anyway.
- newSt = *st;
- newSt.capture = NO_PIECE_TYPE;
- newSt.previous = st;
+ // Copy some fields of old state to our new StateInfo object (except the
+ // captured piece, which is taken care of later) and switch state pointer
+ // to point to the new, ready to be updated, state.
+ init_new_state(newSt);
st = &newSt;
// Save the current key to the history[] array, in order to be able to
Key key, pawnKey, materialKey;
int castleRights, rule50;
Square epSquare;
- Move lastMove;
Value mgValue, egValue;
PieceType capture;
StateInfo* previous;
+ Move lastMove;
};
void allow_ooo(Color c);
// Helper functions for doing and undoing moves
+ void init_new_state(StateInfo& newSt);
void do_capture_move(Move m, PieceType capture, Color them, Square to);
void do_castle_move(Move m);
void do_promotion_move(Move m);