From e6310b3469b07b6bbecf8d8f75367a655090f22b Mon Sep 17 00:00:00 2001 From: Marco Costalba Date: Tue, 4 Aug 2015 09:00:52 +0200 Subject: [PATCH] Rename Position::list Use Position::square and Position::squares instead. This allow us to remove king_square(), simplify endgames and to have more naming uniformity. Moreover, this is a prerequisite step in case in the future we decide to retire piece lists altoghter and use pop_lsb() to loop across pieces and serialize the moves. In this way we just need to change definition of Position::square to something like: template inline Square Position::square(Color c) const { return lsb(byColorBB[c]); } No functional change. --- src/endgame.cpp | 145 +++++++++++++++++++++++------------------------ src/evaluate.cpp | 22 +++---- src/movegen.cpp | 10 ++-- src/pawns.cpp | 2 +- src/position.cpp | 26 ++++----- src/position.h | 13 +++-- 6 files changed, 109 insertions(+), 109 deletions(-) diff --git a/src/endgame.cpp b/src/endgame.cpp index daef61f2..ee6705aa 100644 --- a/src/endgame.cpp +++ b/src/endgame.cpp @@ -71,7 +71,7 @@ namespace { assert(pos.count(strongSide) == 1); - if (file_of(pos.list(strongSide)[0]) >= FILE_E) + if (file_of(pos.square(strongSide)) >= FILE_E) sq = Square(sq ^ 7); // Mirror SQ_H1 -> SQ_A1 if (strongSide == BLACK) @@ -147,8 +147,8 @@ Value Endgame::operator()(const Position& pos) const { if (pos.side_to_move() == weakSide && !MoveList(pos).size()) return VALUE_DRAW; - Square winnerKSq = pos.king_square(strongSide); - Square loserKSq = pos.king_square(weakSide); + Square winnerKSq = pos.square(strongSide); + Square loserKSq = pos.square(weakSide); Value result = pos.non_pawn_material(strongSide) + pos.count(strongSide) * PawnValueEg @@ -158,8 +158,8 @@ Value Endgame::operator()(const Position& pos) const { if ( pos.count(strongSide) || pos.count(strongSide) ||(pos.count(strongSide) && pos.count(strongSide)) - ||(pos.count(strongSide) > 1 && opposite_colors(pos.list(strongSide)[0], - pos.list(strongSide)[1]))) + ||(pos.count(strongSide) > 1 && opposite_colors(pos.squares(strongSide)[0], + pos.squares(strongSide)[1]))) result += VALUE_KNOWN_WIN; return strongSide == pos.side_to_move() ? result : -result; @@ -174,9 +174,9 @@ Value Endgame::operator()(const Position& pos) const { assert(verify_material(pos, strongSide, KnightValueMg + BishopValueMg, 0)); assert(verify_material(pos, weakSide, VALUE_ZERO, 0)); - Square winnerKSq = pos.king_square(strongSide); - Square loserKSq = pos.king_square(weakSide); - Square bishopSq = pos.list(strongSide)[0]; + Square winnerKSq = pos.square(strongSide); + Square loserKSq = pos.square(weakSide); + Square bishopSq = pos.square(strongSide); // kbnk_mate_table() tries to drive toward corners A1 or H8. If we have a // bishop that cannot reach the above squares, we flip the kings in order @@ -203,9 +203,9 @@ Value Endgame::operator()(const Position& pos) const { assert(verify_material(pos, weakSide, VALUE_ZERO, 0)); // Assume strongSide is white and the pawn is on files A-D - Square wksq = normalize(pos, strongSide, pos.king_square(strongSide)); - Square bksq = normalize(pos, strongSide, pos.king_square(weakSide)); - Square psq = normalize(pos, strongSide, pos.list(strongSide)[0]); + Square wksq = normalize(pos, strongSide, pos.square(strongSide)); + Square bksq = normalize(pos, strongSide, pos.square(weakSide)); + Square psq = normalize(pos, strongSide, pos.square(strongSide)); Color us = strongSide == pos.side_to_move() ? WHITE : BLACK; @@ -228,10 +228,10 @@ Value Endgame::operator()(const Position& pos) const { assert(verify_material(pos, strongSide, RookValueMg, 0)); assert(verify_material(pos, weakSide, VALUE_ZERO, 1)); - Square wksq = relative_square(strongSide, pos.king_square(strongSide)); - Square bksq = relative_square(strongSide, pos.king_square(weakSide)); - Square rsq = relative_square(strongSide, pos.list(strongSide)[0]); - Square psq = relative_square(strongSide, pos.list(weakSide)[0]); + Square wksq = relative_square(strongSide, pos.square(strongSide)); + Square bksq = relative_square(strongSide, pos.square(weakSide)); + Square rsq = relative_square(strongSide, pos.square(strongSide)); + Square psq = relative_square(strongSide, pos.square(weakSide)); Square queeningSq = make_square(file_of(psq), RANK_1); Value result; @@ -271,7 +271,7 @@ Value Endgame::operator()(const Position& pos) const { assert(verify_material(pos, strongSide, RookValueMg, 0)); assert(verify_material(pos, weakSide, BishopValueMg, 0)); - Value result = Value(PushToEdges[pos.king_square(weakSide)]); + Value result = Value(PushToEdges[pos.square(weakSide)]); return strongSide == pos.side_to_move() ? result : -result; } @@ -284,8 +284,8 @@ Value Endgame::operator()(const Position& pos) const { assert(verify_material(pos, strongSide, RookValueMg, 0)); assert(verify_material(pos, weakSide, KnightValueMg, 0)); - Square bksq = pos.king_square(weakSide); - Square bnsq = pos.list(weakSide)[0]; + Square bksq = pos.square(weakSide); + Square bnsq = pos.square(weakSide); Value result = Value(PushToEdges[bksq] + PushAway[distance(bksq, bnsq)]); return strongSide == pos.side_to_move() ? result : -result; } @@ -301,9 +301,9 @@ Value Endgame::operator()(const Position& pos) const { assert(verify_material(pos, strongSide, QueenValueMg, 0)); assert(verify_material(pos, weakSide, VALUE_ZERO, 1)); - Square winnerKSq = pos.king_square(strongSide); - Square loserKSq = pos.king_square(weakSide); - Square pawnSq = pos.list(weakSide)[0]; + Square winnerKSq = pos.square(strongSide); + Square loserKSq = pos.square(weakSide); + Square pawnSq = pos.square(weakSide); Value result = Value(PushClose[distance(winnerKSq, loserKSq)]); @@ -326,8 +326,8 @@ Value Endgame::operator()(const Position& pos) const { assert(verify_material(pos, strongSide, QueenValueMg, 0)); assert(verify_material(pos, weakSide, RookValueMg, 0)); - Square winnerKSq = pos.king_square(strongSide); - Square loserKSq = pos.king_square(weakSide); + Square winnerKSq = pos.square(strongSide); + Square loserKSq = pos.square(weakSide); Value result = QueenValueEg - RookValueEg @@ -356,15 +356,15 @@ ScaleFactor Endgame::operator()(const Position& pos) const { // be detected even when the weaker side has some pawns. Bitboard pawns = pos.pieces(strongSide, PAWN); - File pawnFile = file_of(pos.list(strongSide)[0]); + File pawnsFile = file_of(lsb(pawns)); - // All pawns are on a single rook file ? - if ( (pawnFile == FILE_A || pawnFile == FILE_H) - && !(pawns & ~file_bb(pawnFile))) + // All pawns are on a single rook file? + if ( (pawnsFile == FILE_A || pawnsFile == FILE_H) + && !(pawns & ~file_bb(pawnsFile))) { - Square bishopSq = pos.list(strongSide)[0]; - Square queeningSq = relative_square(strongSide, make_square(pawnFile, RANK_8)); - Square kingSq = pos.king_square(weakSide); + Square bishopSq = pos.square(strongSide); + Square queeningSq = relative_square(strongSide, make_square(pawnsFile, RANK_8)); + Square kingSq = pos.square(weakSide); if ( opposite_colors(queeningSq, bishopSq) && distance(queeningSq, kingSq) <= 1) @@ -372,17 +372,17 @@ ScaleFactor Endgame::operator()(const Position& pos) const { } // If all the pawns are on the same B or G file, then it's potentially a draw - if ( (pawnFile == FILE_B || pawnFile == FILE_G) - && !(pos.pieces(PAWN) & ~file_bb(pawnFile)) + if ( (pawnsFile == FILE_B || pawnsFile == FILE_G) + && !(pos.pieces(PAWN) & ~file_bb(pawnsFile)) && pos.non_pawn_material(weakSide) == 0 && pos.count(weakSide) >= 1) { // Get weakSide pawn that is closest to the home rank Square weakPawnSq = backmost_sq(weakSide, pos.pieces(weakSide, PAWN)); - Square strongKingSq = pos.king_square(strongSide); - Square weakKingSq = pos.king_square(weakSide); - Square bishopSq = pos.list(strongSide)[0]; + Square strongKingSq = pos.square(strongSide); + Square weakKingSq = pos.square(weakSide); + Square bishopSq = pos.square(strongSide); // There's potential for a draw if our pawn is blocked on the 7th rank, // the bishop cannot attack it or they only have one pawn left @@ -419,11 +419,11 @@ ScaleFactor Endgame::operator()(const Position& pos) const { assert(pos.count(weakSide) == 1); assert(pos.count(weakSide) >= 1); - Square kingSq = pos.king_square(weakSide); - Square rsq = pos.list(weakSide)[0]; + Square kingSq = pos.square(weakSide); + Square rsq = pos.square(weakSide); if ( relative_rank(weakSide, kingSq) <= RANK_2 - && relative_rank(weakSide, pos.king_square(strongSide)) >= RANK_4 + && relative_rank(weakSide, pos.square(strongSide)) >= RANK_4 && relative_rank(weakSide, rsq) == RANK_3 && ( pos.pieces(weakSide, PAWN) & pos.attacks_from(kingSq) @@ -447,11 +447,11 @@ ScaleFactor Endgame::operator()(const Position& pos) const { assert(verify_material(pos, weakSide, RookValueMg, 0)); // Assume strongSide is white and the pawn is on files A-D - Square wksq = normalize(pos, strongSide, pos.king_square(strongSide)); - Square bksq = normalize(pos, strongSide, pos.king_square(weakSide)); - Square wrsq = normalize(pos, strongSide, pos.list(strongSide)[0]); - Square wpsq = normalize(pos, strongSide, pos.list(strongSide)[0]); - Square brsq = normalize(pos, strongSide, pos.list(weakSide)[0]); + Square wksq = normalize(pos, strongSide, pos.square(strongSide)); + Square bksq = normalize(pos, strongSide, pos.square(weakSide)); + Square wrsq = normalize(pos, strongSide, pos.square(strongSide)); + Square wpsq = normalize(pos, strongSide, pos.square(strongSide)); + Square brsq = normalize(pos, strongSide, pos.square(weakSide)); File f = file_of(wpsq); Rank r = rank_of(wpsq); @@ -543,9 +543,9 @@ ScaleFactor Endgame::operator()(const Position& pos) const { // Test for a rook pawn if (pos.pieces(PAWN) & (FileABB | FileHBB)) { - Square ksq = pos.king_square(weakSide); - Square bsq = pos.list(weakSide)[0]; - Square psq = pos.list(strongSide)[0]; + Square ksq = pos.square(weakSide); + Square bsq = pos.square(weakSide); + Square psq = pos.square(strongSide); Rank rk = relative_rank(strongSide, psq); Square push = pawn_push(strongSide); @@ -558,7 +558,7 @@ ScaleFactor Endgame::operator()(const Position& pos) const { { int d = distance(psq + 3 * push, ksq); - if (d <= 2 && !(d == 0 && ksq == pos.king_square(strongSide) + 2 * push)) + if (d <= 2 && !(d == 0 && ksq == pos.square(strongSide) + 2 * push)) return ScaleFactor(24); else return ScaleFactor(48); @@ -586,9 +586,9 @@ ScaleFactor Endgame::operator()(const Position& pos) const { assert(verify_material(pos, strongSide, RookValueMg, 2)); assert(verify_material(pos, weakSide, RookValueMg, 1)); - Square wpsq1 = pos.list(strongSide)[0]; - Square wpsq2 = pos.list(strongSide)[1]; - Square bksq = pos.king_square(weakSide); + Square wpsq1 = pos.squares(strongSide)[0]; + Square wpsq2 = pos.squares(strongSide)[1]; + Square bksq = pos.square(weakSide); // Does the stronger side have a passed pawn? if (pos.pawn_passed(strongSide, wpsq1) || pos.pawn_passed(strongSide, wpsq2)) @@ -622,15 +622,14 @@ ScaleFactor Endgame::operator()(const Position& pos) const { assert(pos.count(strongSide) >= 2); assert(verify_material(pos, weakSide, VALUE_ZERO, 0)); - Square ksq = pos.king_square(weakSide); + Square ksq = pos.square(weakSide); Bitboard pawns = pos.pieces(strongSide, PAWN); - Square psq = pos.list(strongSide)[0]; // If all pawns are ahead of the king, on a single rook file and // the king is within one file of the pawns, it's a draw. if ( !(pawns & ~in_front_bb(weakSide, rank_of(ksq))) && !((pawns & ~FileABB) && (pawns & ~FileHBB)) - && distance(ksq, psq) <= 1) + && distance(ksq, lsb(pawns)) <= 1) return SCALE_FACTOR_DRAW; return SCALE_FACTOR_NONE; @@ -647,10 +646,10 @@ ScaleFactor Endgame::operator()(const Position& pos) const { assert(verify_material(pos, strongSide, BishopValueMg, 1)); assert(verify_material(pos, weakSide, BishopValueMg, 0)); - Square pawnSq = pos.list(strongSide)[0]; - Square strongBishopSq = pos.list(strongSide)[0]; - Square weakBishopSq = pos.list(weakSide)[0]; - Square weakKingSq = pos.king_square(weakSide); + Square pawnSq = pos.square(strongSide); + Square strongBishopSq = pos.square(strongSide); + Square weakBishopSq = pos.square(weakSide); + Square weakKingSq = pos.square(weakSide); // Case 1: Defending king blocks the pawn, and cannot be driven away if ( file_of(weakKingSq) == file_of(pawnSq) @@ -697,15 +696,15 @@ ScaleFactor Endgame::operator()(const Position& pos) const { assert(verify_material(pos, strongSide, BishopValueMg, 2)); assert(verify_material(pos, weakSide, BishopValueMg, 0)); - Square wbsq = pos.list(strongSide)[0]; - Square bbsq = pos.list(weakSide)[0]; + Square wbsq = pos.square(strongSide); + Square bbsq = pos.square(weakSide); if (!opposite_colors(wbsq, bbsq)) return SCALE_FACTOR_NONE; - Square ksq = pos.king_square(weakSide); - Square psq1 = pos.list(strongSide)[0]; - Square psq2 = pos.list(strongSide)[1]; + Square ksq = pos.square(weakSide); + Square psq1 = pos.squares(strongSide)[0]; + Square psq2 = pos.squares(strongSide)[1]; Rank r1 = rank_of(psq1); Rank r2 = rank_of(psq2); Square blockSq1, blockSq2; @@ -768,9 +767,9 @@ ScaleFactor Endgame::operator()(const Position& pos) const { assert(verify_material(pos, strongSide, BishopValueMg, 1)); assert(verify_material(pos, weakSide, KnightValueMg, 0)); - Square pawnSq = pos.list(strongSide)[0]; - Square strongBishopSq = pos.list(strongSide)[0]; - Square weakKingSq = pos.king_square(weakSide); + Square pawnSq = pos.square(strongSide); + Square strongBishopSq = pos.square(strongSide); + Square weakKingSq = pos.square(weakSide); if ( file_of(weakKingSq) == file_of(pawnSq) && relative_rank(strongSide, pawnSq) < relative_rank(strongSide, weakKingSq) @@ -791,8 +790,8 @@ ScaleFactor Endgame::operator()(const Position& pos) const { assert(verify_material(pos, weakSide, VALUE_ZERO, 0)); // Assume strongSide is white and the pawn is on files A-D - Square pawnSq = normalize(pos, strongSide, pos.list(strongSide)[0]); - Square weakKingSq = normalize(pos, strongSide, pos.king_square(weakSide)); + Square pawnSq = normalize(pos, strongSide, pos.square(strongSide)); + Square weakKingSq = normalize(pos, strongSide, pos.square(weakSide)); if (pawnSq == SQ_A7 && distance(SQ_A8, weakKingSq) <= 1) return SCALE_FACTOR_DRAW; @@ -806,9 +805,9 @@ ScaleFactor Endgame::operator()(const Position& pos) const { template<> ScaleFactor Endgame::operator()(const Position& pos) const { - Square pawnSq = pos.list(strongSide)[0]; - Square bishopSq = pos.list(weakSide)[0]; - Square weakKingSq = pos.king_square(weakSide); + Square pawnSq = pos.square(strongSide); + Square bishopSq = pos.square(weakSide); + Square weakKingSq = pos.square(weakSide); // King needs to get close to promoting pawn to prevent knight from blocking. // Rules for this are very tricky, so just approximate. @@ -831,9 +830,9 @@ ScaleFactor Endgame::operator()(const Position& pos) const { assert(verify_material(pos, weakSide, VALUE_ZERO, 1)); // Assume strongSide is white and the pawn is on files A-D - Square wksq = normalize(pos, strongSide, pos.king_square(strongSide)); - Square bksq = normalize(pos, strongSide, pos.king_square(weakSide)); - Square psq = normalize(pos, strongSide, pos.list(strongSide)[0]); + Square wksq = normalize(pos, strongSide, pos.square(strongSide)); + Square bksq = normalize(pos, strongSide, pos.square(weakSide)); + Square psq = normalize(pos, strongSide, pos.square(strongSide)); Color us = strongSide == pos.side_to_move() ? WHITE : BLACK; diff --git a/src/evaluate.cpp b/src/evaluate.cpp index 37cdce99..a1a12043 100644 --- a/src/evaluate.cpp +++ b/src/evaluate.cpp @@ -208,7 +208,7 @@ namespace { ei.pinnedPieces[Us] = pos.pinned_pieces(Us); ei.attackedBy[Us][ALL_PIECES] = ei.attackedBy[Us][PAWN] = ei.pi->pawn_attacks(Us); - Bitboard b = ei.attackedBy[Them][KING] = pos.attacks_from(pos.king_square(Them)); + Bitboard b = ei.attackedBy[Them][KING] = pos.attacks_from(pos.square(Them)); // Init king safety tables only if we are going to use them if (pos.non_pawn_material(Us) >= QueenValueMg) @@ -234,7 +234,7 @@ namespace { const PieceType NextPt = (Us == WHITE ? Pt : PieceType(Pt + 1)); const Color Them = (Us == WHITE ? BLACK : WHITE); - const Square* pl = pos.list(Us); + const Square* pl = pos.squares(Us); ei.attackedBy[Us][Pt] = 0; @@ -246,7 +246,7 @@ namespace { : pos.attacks_from(s); if (ei.pinnedPieces[Us] & s) - b &= LineBB[pos.king_square(Us)][s]; + b &= LineBB[pos.square(Us)][s]; ei.attackedBy[Us][ALL_PIECES] |= ei.attackedBy[Us][Pt] |= b; @@ -316,7 +316,7 @@ namespace { // Penalize when trapped by the king, even more if king cannot castle if (mob <= 3 && !ei.pi->semiopen_file(Us, file_of(s))) { - Square ksq = pos.king_square(Us); + Square ksq = pos.square(Us); if ( ((file_of(ksq) < FILE_E) == (file_of(s) < file_of(ksq))) && (rank_of(ksq) == rank_of(s) || relative_rank(Us, ksq) == RANK_1) @@ -348,7 +348,7 @@ namespace { Bitboard undefended, b, b1, b2, safe; int attackUnits; - const Square ksq = pos.king_square(Us); + const Square ksq = pos.square(Us); // King shelter and enemy pawns storm Score score = ei.pi->king_safety(pos, ksq); @@ -575,12 +575,12 @@ namespace { Square blockSq = s + pawn_push(Us); // Adjust bonus based on the king's proximity - ebonus += distance(pos.king_square(Them), blockSq) * 5 * rr - - distance(pos.king_square(Us ), blockSq) * 2 * rr; + ebonus += distance(pos.square(Them), blockSq) * 5 * rr + - distance(pos.square(Us ), blockSq) * 2 * rr; // If blockSq is not the queening square then consider also a second push if (relative_rank(Us, blockSq) != RANK_8) - ebonus -= distance(pos.king_square(Us), blockSq + pawn_push(Us)) * rr; + ebonus -= distance(pos.square(Us), blockSq + pawn_push(Us)) * rr; // If the pawn is free to advance, then increase the bonus if (pos.empty(blockSq)) @@ -710,8 +710,8 @@ namespace { // Do not include in mobility squares protected by enemy pawns, or occupied // by our blocked pawns or king. Bitboard mobilityArea[] = { - ~(ei.attackedBy[BLACK][PAWN] | blockedPawns[WHITE] | pos.king_square(WHITE)), - ~(ei.attackedBy[WHITE][PAWN] | blockedPawns[BLACK] | pos.king_square(BLACK)) + ~(ei.attackedBy[BLACK][PAWN] | blockedPawns[WHITE] | pos.square(WHITE)), + ~(ei.attackedBy[WHITE][PAWN] | blockedPawns[BLACK] | pos.square(BLACK)) }; // Evaluate pieces and mobility @@ -772,7 +772,7 @@ namespace { // pawns are drawish. else if ( abs(eg_value(score)) <= BishopValueEg && ei.pi->pawn_span(strongSide) <= 1 - && !pos.pawn_passed(~strongSide, pos.king_square(~strongSide))) + && !pos.pawn_passed(~strongSide, pos.square(~strongSide))) sf = ei.pi->pawn_span(strongSide) ? ScaleFactor(56) : ScaleFactor(38); } diff --git a/src/movegen.cpp b/src/movegen.cpp index 51adc5b4..11189587 100644 --- a/src/movegen.cpp +++ b/src/movegen.cpp @@ -34,7 +34,7 @@ namespace { // After castling, the rook and king final positions are the same in Chess960 // as they would be in standard chess. - Square kfrom = pos.king_square(us); + Square kfrom = pos.square(us); Square rfrom = pos.castling_rook_square(Cr); Square kto = relative_square(us, KingSide ? SQ_G1 : SQ_C1); Bitboard enemies = pos.pieces(~us); @@ -225,7 +225,7 @@ namespace { assert(Pt != KING && Pt != PAWN); - const Square* pl = pos.list(us); + const Square* pl = pos.squares(us); for (Square from = *pl; from != SQ_NONE; from = *++pl) { @@ -266,7 +266,7 @@ namespace { if (Type != QUIET_CHECKS && Type != EVASIONS) { - Square ksq = pos.king_square(Us); + Square ksq = pos.square(Us); Bitboard b = pos.attacks_from(ksq) & target; while (b) *moveList++ = make_move(ksq, pop_lsb(&b)); @@ -364,7 +364,7 @@ ExtMove* generate(const Position& pos, ExtMove* moveList) { assert(pos.checkers()); Color us = pos.side_to_move(); - Square ksq = pos.king_square(us); + Square ksq = pos.square(us); Bitboard sliderAttacks = 0; Bitboard sliders = pos.checkers() & ~pos.pieces(KNIGHT, PAWN); @@ -400,7 +400,7 @@ template<> ExtMove* generate(const Position& pos, ExtMove* moveList) { Bitboard pinned = pos.pinned_pieces(pos.side_to_move()); - Square ksq = pos.king_square(pos.side_to_move()); + Square ksq = pos.square(pos.side_to_move()); ExtMove* cur = moveList; moveList = pos.checkers() ? generate(pos, moveList) diff --git a/src/pawns.cpp b/src/pawns.cpp index f3ceadbe..47f74f84 100644 --- a/src/pawns.cpp +++ b/src/pawns.cpp @@ -110,7 +110,7 @@ namespace { Square s; bool passed, isolated, opposed, backward, lever, connected; Score score = SCORE_ZERO; - const Square* pl = pos.list(Us); + const Square* pl = pos.squares(Us); const Bitboard* pawnAttacksBB = StepAttacksBB[make_piece(Us, PAWN)]; Bitboard ourPawns = pos.pieces(Us , PAWN); diff --git a/src/position.cpp b/src/position.cpp index 9306965c..50d1f170 100644 --- a/src/position.cpp +++ b/src/position.cpp @@ -89,7 +89,7 @@ PieceType min_attacker(const Bitboard*, const Square&, const Bitboard&, Bi CheckInfo::CheckInfo(const Position& pos) { Color them = ~pos.side_to_move(); - ksq = pos.king_square(them); + ksq = pos.square(them); pinned = pos.pinned_pieces(pos.side_to_move()); dcCandidates = pos.discovered_check_candidates(); @@ -315,7 +315,7 @@ void Position::set(const string& fenStr, bool isChess960, Thread* th) { void Position::set_castling_right(Color c, Square rfrom) { - Square kfrom = king_square(c); + Square kfrom = square(c); CastlingSide cs = kfrom < rfrom ? KING_SIDE : QUEEN_SIDE; CastlingRight cr = (c | cs); @@ -348,7 +348,7 @@ void Position::set_state(StateInfo* si) const { si->nonPawnMaterial[WHITE] = si->nonPawnMaterial[BLACK] = VALUE_ZERO; si->psq = SCORE_ZERO; - si->checkersBB = attackers_to(king_square(sideToMove)) & pieces(~sideToMove); + si->checkersBB = attackers_to(square(sideToMove)) & pieces(~sideToMove); for (Bitboard b = pieces(); b; ) { @@ -456,7 +456,7 @@ Phase Position::game_phase() const { Bitboard Position::check_blockers(Color c, Color kingColor) const { Bitboard b, pinners, result = 0; - Square ksq = king_square(kingColor); + Square ksq = square(kingColor); // Pinners are sliders that give check when a pinned piece is removed pinners = ( (pieces( ROOK, QUEEN) & PseudoAttacks[ROOK ][ksq]) @@ -498,14 +498,14 @@ bool Position::legal(Move m, Bitboard pinned) const { Square from = from_sq(m); assert(color_of(moved_piece(m)) == us); - assert(piece_on(king_square(us)) == make_piece(us, KING)); + assert(piece_on(square(us)) == make_piece(us, KING)); // 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. if (type_of(m) == ENPASSANT) { - Square ksq = king_square(us); + Square ksq = square(us); Square to = to_sq(m); Square capsq = to - pawn_push(us); Bitboard occupied = (pieces() ^ from ^ capsq) | to; @@ -529,7 +529,7 @@ bool Position::legal(Move m, Bitboard pinned) const { // is moving along the ray towards or away from the king. return !pinned || !(pinned & from) - || aligned(from, to_sq(m), king_square(us)); + || aligned(from, to_sq(m), square(us)); } @@ -592,7 +592,7 @@ bool Position::pseudo_legal(const Move m) const { return false; // Our move must be a blocking evasion or a capture of the checking piece - if (!((between_bb(lsb(checkers()), king_square(us)) | checkers()) & to)) + if (!((between_bb(lsb(checkers()), square(us)) | checkers()) & to)) return false; } // In case of king moves under check we have to remove king so as to catch @@ -826,7 +826,7 @@ void Position::do_move(Move m, StateInfo& newSt, bool givesCheck) { st->key = k; // Calculate checkers bitboard (if move gives check) - st->checkersBB = givesCheck ? attackers_to(king_square(them)) & pieces(us) : 0; + st->checkersBB = givesCheck ? attackers_to(square(them)) & pieces(us) : 0; sideToMove = ~sideToMove; @@ -1133,8 +1133,8 @@ bool Position::pos_is_ok(int* failedStep) const { if (step == Default) if ( (sideToMove != WHITE && sideToMove != BLACK) - || piece_on(king_square(WHITE)) != W_KING - || piece_on(king_square(BLACK)) != B_KING + || piece_on(square(WHITE)) != W_KING + || piece_on(square(BLACK)) != B_KING || ( ep_square() != SQ_NONE && relative_rank(sideToMove, ep_square()) != RANK_6)) return false; @@ -1142,7 +1142,7 @@ bool Position::pos_is_ok(int* failedStep) const { if (step == King) if ( std::count(board, board + SQUARE_NB, W_KING) != 1 || std::count(board, board + SQUARE_NB, B_KING) != 1 - || attackers_to(king_square(~sideToMove)) & pieces(sideToMove)) + || attackers_to(square(~sideToMove)) & pieces(sideToMove)) return false; if (step == Bitboards) @@ -1187,7 +1187,7 @@ bool Position::pos_is_ok(int* failedStep) const { if ( piece_on(castlingRookSquare[c | s]) != make_piece(c, ROOK) || castlingRightsMask[castlingRookSquare[c | s]] != (c | s) - ||(castlingRightsMask[king_square(c)] & (c | s)) != (c | s)) + ||(castlingRightsMask[square(c)] & (c | s)) != (c | s)) return false; } } diff --git a/src/position.h b/src/position.h index 6378d0ba..0b2a0cca 100644 --- a/src/position.h +++ b/src/position.h @@ -105,11 +105,11 @@ public: Bitboard pieces(Color c, PieceType pt) const; Bitboard pieces(Color c, PieceType pt1, PieceType pt2) const; Piece piece_on(Square s) const; - Square king_square(Color c) const; Square ep_square() const; bool empty(Square s) const; template int count(Color c) const; - template const Square* list(Color c) const; + template const Square* squares(Color c) const; + template Square square(Color c) const; // Castling int can_castle(Color c) const; @@ -254,12 +254,13 @@ template inline int Position::count(Color c) const { return pieceCount[c][Pt]; } -template inline const Square* Position::list(Color c) const { +template inline const Square* Position::squares(Color c) const { return pieceList[c][Pt]; } -inline Square Position::king_square(Color c) const { - return pieceList[c][KING][0]; +template inline Square Position::square(Color c) const { + assert(pieceCount[c][Pt] == 1); + return pieceList[c][Pt][0]; } inline Square Position::ep_square() const { @@ -362,7 +363,7 @@ inline void Position::set_nodes_searched(uint64_t n) { inline bool Position::opposite_bishops() const { return pieceCount[WHITE][BISHOP] == 1 && pieceCount[BLACK][BISHOP] == 1 - && opposite_colors(pieceList[WHITE][BISHOP][0], pieceList[BLACK][BISHOP][0]); + && opposite_colors(square(WHITE), square(BLACK)); } inline bool Position::is_chess960() const { -- 2.39.2