/// Position::copy() creates a copy of the input position.
-void Position::copy(const Position &pos) {
+void Position::copy(const Position& pos) {
memcpy(this, &pos, sizeof(Position));
+ saveState(); // detach and copy state info
}
}
-/// Position::setStartState() copies the content of the argument
+/// Position::saveState() copies the content of the current state
/// inside startState and makes st point to it. This is needed
/// when the st pointee could become stale, as example because
/// the caller is about to going out of scope.
-void Position::setStartState(const StateInfo& s) {
+void Position::saveState() {
- startState = s;
+ startState = *st;
st = &startState;
+ st->previous = NULL; // as a safe guard
}
/// the white and black sides reversed. This is only useful for debugging,
/// especially for finding evaluation symmetry bugs.
-void Position::flipped_copy(const Position &pos) {
+void Position::flipped_copy(const Position& pos) {
assert(pos.is_ok());
void print(Move m = MOVE_NONE) const;
// Copying
- void copy(const Position &pos);
- void flipped_copy(const Position &pos);
+ void copy(const Position& pos);
+ void flipped_copy(const Position& pos);
// The piece on a given square
Piece piece_on(Square s) const;
bool square_is_weak(Square s, Color c) const;
// Doing and undoing moves
- void setStartState(const StateInfo& st);
+ void saveState();
void do_move(Move m, StateInfo& st);
void do_move(Move m, StateInfo& st, Bitboard dcCandidates);
void undo_move(Move m);
if (RootPosition.rule_50_counter() == 0)
RootPosition.reset_game_ply();
}
- // Our StateInfo st is about going out of scope,
- // so save its content before they disappear.
- RootPosition.setStartState(st);
+ // Our StateInfo st is about going out of scope so copy
+ // its content inside RootPosition before they disappear.
+ RootPosition.saveState();
}
}
}