X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fmovegen.cpp;h=76a27d9f4936320165c0378f2b59225038b0abbe;hp=cb221d95e178e1833c00fb414e183561b02a9924;hb=59d32f8eddf4fc8138f419777fbabf58080f1caa;hpb=ad2a0e356e395038a08324f9ff0afee7fc98b8e9 diff --git a/src/movegen.cpp b/src/movegen.cpp index cb221d95..76a27d9f 100644 --- a/src/movegen.cpp +++ b/src/movegen.cpp @@ -2,7 +2,7 @@ Stockfish, a UCI chess playing engine derived from Glaurung 2.1 Copyright (C) 2004-2008 Tord Romstad (Glaurung author) Copyright (C) 2008-2015 Marco Costalba, Joona Kiiski, Tord Romstad - Copyright (C) 2015-2018 Marco Costalba, Joona Kiiski, Gary Linscott, Tord Romstad + Copyright (C) 2015-2019 Marco Costalba, Joona Kiiski, Gary Linscott, Tord Romstad Stockfish is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -25,34 +25,35 @@ namespace { - template - ExtMove* generate_castling(const Position& pos, ExtMove* moveList, Color us) { + template + ExtMove* generate_castling(const Position& pos, ExtMove* moveList) { - static const bool KingSide = (Cr == WHITE_OO || Cr == BLACK_OO); + constexpr CastlingRight Cr = Us | Cs; + constexpr bool KingSide = (Cs == KING_SIDE); if (pos.castling_impeded(Cr) || !pos.can_castle(Cr)) return moveList; // After castling, the rook and king final positions are the same in Chess960 // as they would be in standard chess. - Square kfrom = pos.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); + Square kto = relative_square(Us, KingSide ? SQ_G1 : SQ_C1); + Bitboard enemies = pos.pieces(~Us); assert(!pos.checkers()); - const Direction K = Chess960 ? kto > kfrom ? WEST : EAST - : KingSide ? WEST : EAST; + const Direction step = Chess960 ? kto > kfrom ? WEST : EAST + : KingSide ? WEST : EAST; - for (Square s = kto; s != kfrom; s += K) + for (Square s = kto; s != kfrom; s += step) if (pos.attackers_to(s) & enemies) return moveList; // Because we generate only legal castling moves we need to verify that // when moving the castling rook we do not discover some hidden checker. // For instance an enemy queen in SQ_A1 when castling rook is in SQ_B1. - if (Chess960 && (attacks_bb(kto, pos.pieces() ^ rfrom) & pos.pieces(~us, ROOK, QUEEN))) + if (Chess960 && (attacks_bb(kto, pos.pieces() ^ rfrom) & pos.pieces(~Us, ROOK, QUEEN))) return moveList; Move m = make(kfrom, rfrom); @@ -94,13 +95,13 @@ namespace { // Compute our parametrized parameters at compile time, named according to // the point of view of white side. - const Color Them = (Us == WHITE ? BLACK : WHITE); - const Bitboard TRank8BB = (Us == WHITE ? Rank8BB : Rank1BB); - const Bitboard TRank7BB = (Us == WHITE ? Rank7BB : Rank2BB); - const Bitboard TRank3BB = (Us == WHITE ? Rank3BB : Rank6BB); - const Direction Up = (Us == WHITE ? NORTH : SOUTH); - const Direction UpRight = (Us == WHITE ? NORTH_EAST : SOUTH_WEST); - const Direction UpLeft = (Us == WHITE ? NORTH_WEST : SOUTH_EAST); + constexpr Color Them = (Us == WHITE ? BLACK : WHITE); + constexpr Bitboard TRank8BB = (Us == WHITE ? Rank8BB : Rank1BB); + constexpr Bitboard TRank7BB = (Us == WHITE ? Rank7BB : Rank2BB); + constexpr Bitboard TRank3BB = (Us == WHITE ? Rank3BB : Rank6BB); + constexpr Direction Up = (Us == WHITE ? NORTH : SOUTH); + constexpr Direction UpRight = (Us == WHITE ? NORTH_EAST : SOUTH_WEST); + constexpr Direction UpLeft = (Us == WHITE ? NORTH_WEST : SOUTH_EAST); Bitboard emptySquares; @@ -261,7 +262,7 @@ namespace { template ExtMove* generate_all(const Position& pos, ExtMove* moveList, Bitboard target) { - const bool Checks = Type == QUIET_CHECKS; + constexpr bool Checks = Type == QUIET_CHECKS; moveList = generate_pawn_moves(pos, moveList, target); moveList = generate_moves(pos, moveList, Us, target); @@ -277,17 +278,17 @@ namespace { *moveList++ = make_move(ksq, pop_lsb(&b)); } - if (Type != CAPTURES && Type != EVASIONS && pos.can_castle(Us)) + if (Type != CAPTURES && Type != EVASIONS && pos.castling_rights(Us)) { if (pos.is_chess960()) { - moveList = generate_castling::right, Checks, true>(pos, moveList, Us); - moveList = generate_castling::right, Checks, true>(pos, moveList, Us); + moveList = generate_castling(pos, moveList); + moveList = generate_castling(pos, moveList); } else { - moveList = generate_castling::right, Checks, false>(pos, moveList, Us); - moveList = generate_castling::right, Checks, false>(pos, moveList, Us); + moveList = generate_castling(pos, moveList); + moveList = generate_castling(pos, moveList); } }