incremented after Black's move.
*/
- char col, row, token;
+ unsigned char col, row, token;
size_t idx;
Square sq = SQ_A8;
std::istringstream ss(fenStr);
for (rsq = relative_square(c, SQ_A1); type_of(piece_on(rsq)) != ROOK; ++rsq) {}
else if (token >= 'A' && token <= 'H')
- rsq = File(token - 'A') | relative_rank(c, RANK_1);
+ rsq = make_square(File(token - 'A'), relative_rank(c, RANK_1));
else
continue;
if ( ((ss >> col) && (col >= 'a' && col <= 'h'))
&& ((ss >> row) && (row == '3' || row == '6')))
{
- st->epSquare = File(col - 'a') | Rank(row - '1');
+ st->epSquare = make_square(File(col - 'a'), Rank(row - '1'));
if (!(attackers_to(st->epSquare) & pieces(sideToMove, PAWN)))
st->epSquare = SQ_NONE;
// Convert from fullmove starting from 1 to ply starting from 0,
// handle also common incorrect FEN with fullmove = 0.
- gamePly = std::max(2 * (gamePly - 1), 0) + int(sideToMove == BLACK);
+ gamePly = std::max(2 * (gamePly - 1), 0) + (sideToMove == BLACK);
chess960 = isChess960;
thisThread = th;
int emptyCnt;
std::ostringstream ss;
- for (Rank rank = RANK_8; rank >= RANK_1; --rank)
+ for (Rank r = RANK_8; r >= RANK_1; --r)
{
- for (File file = FILE_A; file <= FILE_H; ++file)
+ for (File f = FILE_A; f <= FILE_H; ++f)
{
- for (emptyCnt = 0; file <= FILE_H && empty(file | rank); ++file)
+ for (emptyCnt = 0; f <= FILE_H && empty(make_square(f, r)); ++f)
++emptyCnt;
if (emptyCnt)
ss << emptyCnt;
- if (file <= FILE_H)
- ss << PieceToChar[piece_on(file | rank)];
+ if (f <= FILE_H)
+ ss << PieceToChar[piece_on(make_square(f, r))];
}
- if (rank > RANK_1)
+ if (r > RANK_1)
ss << '/';
}
ss << '-';
ss << (ep_square() == SQ_NONE ? " - " : " " + to_string(ep_square()) + " ")
- << st->rule50 << " " << 1 + (gamePly - int(sideToMove == BLACK)) / 2;
+ << st->rule50 << " " << 1 + (gamePly - (sideToMove == BLACK)) / 2;
return ss.str();
}
/// Position::pretty() returns an ASCII representation of the position to be
/// printed to the standard output together with the move's san notation.
-const string Position::pretty(Move move) const {
+const string Position::pretty(Move m) const {
- const string dottedLine = "\n+---+---+---+---+---+---+---+---+";
- const string twoRows = dottedLine + "\n| | . | | . | | . | | . |"
- + dottedLine + "\n| . | | . | | . | | . | |";
+ std::ostringstream ss;
- string brd = twoRows + twoRows + twoRows + twoRows + dottedLine;
+ if (m)
+ ss << "\nMove: " << (sideToMove == BLACK ? ".." : "")
+ << move_to_san(*const_cast<Position*>(this), m);
- for (Bitboard b = pieces(); b; )
- {
- Square s = pop_lsb(&b);
- brd[513 - 68 * rank_of(s) + 4 * file_of(s)] = PieceToChar[piece_on(s)];
- }
+ ss << "\n +---+---+---+---+---+---+---+---+\n";
- std::ostringstream ss;
+ for (Rank r = RANK_8; r >= RANK_1; --r)
+ {
+ for (File f = FILE_A; f <= FILE_H; ++f)
+ ss << " | " << PieceToChar[piece_on(make_square(f, r))];
- if (move)
- ss << "\nMove: " << (sideToMove == BLACK ? ".." : "")
- << move_to_san(*const_cast<Position*>(this), move);
+ ss << " |\n +---+---+---+---+---+---+---+---+\n";
+ }
- ss << brd << "\nFen: " << fen() << "\nKey: " << std::hex << std::uppercase
+ ss << "\nFen: " << fen() << "\nKey: " << std::hex << std::uppercase
<< std::setfill('0') << std::setw(16) << st->key << "\nCheckers: ";
for (Bitboard b = checkers(); b; )
// the captured pawn.
case ENPASSANT:
{
- Square capsq = file_of(to) | rank_of(from);
+ Square capsq = make_square(file_of(to), rank_of(from));
Bitboard b = (pieces() ^ from ^ capsq) | to;
return (attacks_bb< ROOK>(ci.ksq, b) & pieces(sideToMove, QUEEN, ROOK))
k ^= Zobrist::enpassant[file_of(st->epSquare)];
}
- if (type_of(m) == PROMOTION)
+ else if (type_of(m) == PROMOTION)
{
PieceType promotion = promotion_type(m);
string f, token;
std::stringstream ss(fen());
- for (Rank rank = RANK_8; rank >= RANK_1; --rank) // Piece placement
+ for (Rank r = RANK_8; r >= RANK_1; --r) // Piece placement
{
- std::getline(ss, token, rank > RANK_1 ? '/' : ' ');
+ std::getline(ss, token, r > RANK_1 ? '/' : ' ');
f.insert(0, token + (f.empty() ? " " : "/"));
}
/// Position::pos_is_ok() performs some consistency checks for the position object.
/// This is meant to be helpful when debugging.
-bool Position::pos_is_ok(int* failedStep) const {
-
- int dummy, *step = failedStep ? failedStep : &dummy;
+bool Position::pos_is_ok(int* step) const {
// Which parts of the position should be verified?
const bool all = false;
const bool testPieceList = all || false;
const bool testCastlingSquares = all || false;
- if (*step = 1, sideToMove != WHITE && sideToMove != BLACK)
- return false;
-
- if ((*step)++, piece_on(king_square(WHITE)) != W_KING)
- return false;
-
- if ((*step)++, piece_on(king_square(BLACK)) != B_KING)
- return false;
+ if (step)
+ *step = 1;
- if ((*step)++, ep_square() != SQ_NONE && relative_rank(sideToMove, ep_square()) != RANK_6)
+ if ( (sideToMove != WHITE && sideToMove != BLACK)
+ || piece_on(king_square(WHITE)) != W_KING
+ || piece_on(king_square(BLACK)) != B_KING
+ || ( ep_square() != SQ_NONE
+ && relative_rank(sideToMove, ep_square()) != RANK_6))
return false;
- if ((*step)++, testBitboards)
+ if (step && ++*step, testBitboards)
{
// The intersection of the white and black pieces must be empty
if (pieces(WHITE) & pieces(BLACK))
return false;
}
- if ((*step)++, testState)
+ if (step && ++*step, testState)
{
StateInfo si;
set_state(&si);
return false;
}
- if ((*step)++, testKingCount)
+ if (step && ++*step, testKingCount)
if ( std::count(board, board + SQUARE_NB, W_KING) != 1
|| std::count(board, board + SQUARE_NB, B_KING) != 1)
return false;
- if ((*step)++, testKingCapture)
+ if (step && ++*step, testKingCapture)
if (attackers_to(king_square(~sideToMove)) & pieces(sideToMove))
return false;
- if ((*step)++, testPieceCounts)
+ if (step && ++*step, testPieceCounts)
for (Color c = WHITE; c <= BLACK; ++c)
for (PieceType pt = PAWN; pt <= KING; ++pt)
if (pieceCount[c][pt] != popcount<Full>(pieces(c, pt)))
return false;
- if ((*step)++, testPieceList)
+ if (step && ++*step, testPieceList)
for (Color c = WHITE; c <= BLACK; ++c)
for (PieceType pt = PAWN; pt <= KING; ++pt)
for (int i = 0; i < pieceCount[c][pt]; ++i)
|| index[pieceList[c][pt][i]] != i)
return false;
- if ((*step)++, testCastlingSquares)
+ if (step && ++*step, testCastlingSquares)
for (Color c = WHITE; c <= BLACK; ++c)
for (CastlingSide s = KING_SIDE; s <= QUEEN_SIDE; s = CastlingSide(s + 1))
{
return false;
}
- *step = 0;
return true;
}