From: Marco Costalba Date: Tue, 10 Feb 2009 15:58:02 +0000 (+0100) Subject: Simplify generate_evasions() X-Git-Url: https://git.sesse.net/?p=stockfish;a=commitdiff_plain;h=3e20c6c07ddfe2d5f04cf268727ae466e3b36128 Simplify generate_evasions() No functional change. Signed-off-by: Marco Costalba --- diff --git a/src/movegen.cpp b/src/movegen.cpp index a9683825..129738a9 100644 --- a/src/movegen.cpp +++ b/src/movegen.cpp @@ -43,9 +43,14 @@ namespace { // Function bool castling_is_check(const Position&, CastlingSide); - // Template + // Templates template MoveStack* generate_castle_moves(const Position&, MoveStack*); + template + MoveStack* generate_piece_checks(const Position&, MoveStack*, Color us, Bitboard, Square); + template + MoveStack* do_generate_pawn_blocking_evasions(const Position& pos, Bitboard not_pinned, + Bitboard blockSquares, MoveStack* mlist); // Template generate_pawn_captures() with specializations template @@ -73,19 +78,6 @@ namespace { return do_generate_pawn_noncaptures(p, m); } - // Template generate_pawn_blocking_evasions() with specializations - template - MoveStack* do_generate_pawn_blocking_evasions(const Position& pos, Bitboard not_pinned, - Bitboard blockSquares, MoveStack* mlist); - template - inline MoveStack* generate_pawn_blocking_evasions(const Position& p, MoveStack* m, Bitboard np, Bitboard bs) { - return do_generate_pawn_blocking_evasions(p, np, bs, m); - } - template<> - inline MoveStack* generate_pawn_blocking_evasions(const Position& p, MoveStack* m, Bitboard np, Bitboard bs) { - return do_generate_pawn_blocking_evasions(p, np, bs, m); - } - // Template generate_pawn_checks() with specializations template MoveStack* do_generate_pawn_checks(const Position&, Bitboard, Square, MoveStack*); @@ -99,17 +91,17 @@ namespace { return do_generate_pawn_checks(p, dc, ksq, m); } - // non-pawn templates + // Template generate_piece_moves() with specializations template MoveStack* generate_piece_moves(const Position&, MoveStack*, Color us, Bitboard); template<> MoveStack* generate_piece_moves(const Position& pos, MoveStack* mlist, Color us, Bitboard target); + // Template generate_piece_blocking_evasions() with specializations template - MoveStack* generate_piece_checks(const Position&, MoveStack*, Color us, Bitboard, Square); - - template - MoveStack* generate_piece_blocking_evasions(const Position&, MoveStack*, Bitboard, Bitboard); + MoveStack* generate_piece_blocking_evasions(const Position&, MoveStack*, Color us, Bitboard, Bitboard); + template<> + MoveStack* generate_piece_blocking_evasions(const Position& p, MoveStack* m, Color us, Bitboard np, Bitboard bs); } @@ -323,29 +315,12 @@ int generate_evasions(const Position& pos, MoveStack* mlist) { assert((pos.occupied_squares() & blockSquares) == EmptyBoardBB); - // Pawn moves. Because a blocking evasion can never be a capture, we - // only generate pawn pushes. - if (us == WHITE) - mlist = generate_pawn_blocking_evasions(pos, mlist, not_pinned, blockSquares); - else - mlist = generate_pawn_blocking_evasions(pos, mlist, not_pinned, blockSquares); - // Pieces moves - b1 = pos.knights(us) & not_pinned; - if (b1) - mlist = generate_piece_blocking_evasions(pos, mlist, b1, blockSquares); - - b1 = pos.bishops(us) & not_pinned; - if (b1) - mlist = generate_piece_blocking_evasions(pos, mlist, b1, blockSquares); - - b1 = pos.rooks(us) & not_pinned; - if (b1) - mlist = generate_piece_blocking_evasions(pos, mlist, b1, blockSquares); - - b1 = pos.queens(us) & not_pinned; - if (b1) - mlist = generate_piece_blocking_evasions(pos, mlist, b1, blockSquares); + mlist = generate_piece_blocking_evasions(pos, mlist, us, not_pinned, blockSquares); + mlist = generate_piece_blocking_evasions(pos, mlist, us, not_pinned, blockSquares); + mlist = generate_piece_blocking_evasions(pos, mlist, us, not_pinned, blockSquares); + mlist = generate_piece_blocking_evasions(pos, mlist, us, not_pinned, blockSquares); + mlist = generate_piece_blocking_evasions(pos, mlist, us, not_pinned, blockSquares); } // Finally, the ugly special case of en passant captures. An en passant @@ -621,8 +596,10 @@ namespace { } template - MoveStack* generate_piece_blocking_evasions(const Position& pos, MoveStack* mlist, - Bitboard b, Bitboard blockSquares) { + MoveStack* generate_piece_blocking_evasions(const Position& pos, MoveStack* mlist, Color us, + Bitboard not_pinned, Bitboard blockSquares) { + + Bitboard b = pos.pieces_of_color_and_type(us, Piece) & not_pinned; while (b) { Square from = pop_1st_bit(&b); @@ -632,6 +609,14 @@ namespace { return mlist; } + template<> + MoveStack* generate_piece_blocking_evasions(const Position& p, MoveStack* m, Color us, + Bitboard np, Bitboard bs) { + if (us == WHITE) + return do_generate_pawn_blocking_evasions(p, np, bs, m); + else + return do_generate_pawn_blocking_evasions(p, np, bs, m); + } template