assert(move_is_ok(m));
assert(pinned == pinned_pieces(side_to_move()));
- // Castling moves are checked for legality during move generation.
- if (move_is_castle(m))
- return true;
-
// En passant captures are a tricky special case. Because they are
// rather uncommon, we do it simply by testing whether the king is attacked
// after the move is made
bool Position::pl_move_is_evasion(Move m, Bitboard pinned) const
{
- assert(is_check());
+ assert(in_check());
Color us = side_to_move();
Square from = move_from(m);
return false;
// The move is pseudo-legal, check if it is also legal
- return is_check() ? pl_move_is_evasion(m, pinned) : pl_move_is_legal(m, pinned);
+ return in_check() ? pl_move_is_evasion(m, pinned) : pl_move_is_legal(m, pinned);
}
-/// Position::move_is_check() tests whether a pseudo-legal move is a check
+/// Position::move_gives_check() tests whether a pseudo-legal move is a check
-bool Position::move_is_check(Move m) const {
+bool Position::move_gives_check(Move m) const {
- return move_is_check(m, CheckInfo(*this));
+ return move_gives_check(m, CheckInfo(*this));
}
-bool Position::move_is_check(Move m, const CheckInfo& ci) const {
+bool Position::move_gives_check(Move m, const CheckInfo& ci) const {
assert(is_ok());
assert(move_is_ok(m));
}
-/// Position::do_setup_move() makes a permanent move on the board.
-/// It should be used when setting up a position on board.
-/// You can't undo the move.
+/// Position::do_setup_move() makes a permanent move on the board. It should
+/// be used when setting up a position on board. You can't undo the move.
void Position::do_setup_move(Move m) {
startPosPlyCounter++;
// Our StateInfo newSt is about going out of scope so copy
- // its content inside pos before it disappears.
+ // its content before it disappears.
detach();
}
+
/// 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.
+/// to a StateInfo object. The move is assumed to be legal. Pseudo-legal
+/// moves should be filtered out before this function is called.
void Position::do_move(Move m, StateInfo& newSt) {
CheckInfo ci(*this);
- do_move(m, newSt, ci, move_is_check(m, ci));
+ do_move(m, newSt, ci, move_gives_check(m, ci));
}
void Position::do_move(Move m, StateInfo& newSt, const CheckInfo& ci, bool moveIsCheck) {
void Position::do_null_move(StateInfo& backupSt) {
assert(is_ok());
- assert(!is_check());
+ assert(!in_check());
// Back up the information necessary to undo the null move to the supplied
// StateInfo object.
void Position::undo_null_move() {
assert(is_ok());
- assert(!is_check());
+ assert(!in_check());
// Restore information from the our backup StateInfo object
StateInfo* backupSt = st->previous;
/// move, and one which takes a 'from' and a 'to' square. The function does
/// not yet understand promotions captures.
-int Position::see(Move m) const {
-
- assert(move_is_ok(m));
- return see(move_from(m), move_to(m));
-}
-
int Position::see_sign(Move m) const {
assert(move_is_ok(m));
if (midgame_value_of_piece_on(to) >= midgame_value_of_piece_on(from))
return 1;
- return see(from, to);
+ return see(m);
}
-int Position::see(Square from, Square to) const {
+int Position::see(Move m) const {
+ Square from, to;
Bitboard occupied, attackers, stmAttackers, b;
int swapList[32], slIndex = 1;
PieceType capturedType, pt;
Color stm;
- assert(square_is_ok(from));
- assert(square_is_ok(to));
+ assert(move_is_ok(m));
+ from = move_from(m);
+ to = move_to(m);
capturedType = type_of_piece_on(to);
-
- // King cannot be recaptured
- if (capturedType == KING)
- return seeValues[capturedType];
-
occupied = occupied_squares();
// Handle en passant moves
bool Position::is_mate() const {
MoveStack moves[MAX_MOVES];
- return is_check() && generate<MV_LEGAL>(*this, moves) == moves;
+ return in_check() && generate<MV_LEGAL>(*this, moves) == moves;
}
}
-/// Position::flipped_copy() makes a copy of the input position, but with
-/// the white and black sides reversed. This is only useful for debugging,
-/// especially for finding evaluation symmetry bugs.
+/// Position::flip() flips position with 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::flip() {
+
+ assert(is_ok());
- assert(pos.is_ok());
+ // Make a copy of current position before to start changing
+ const Position pos(*this, threadID);
clear();
threadID = pos.thread();