X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fmovegen.cpp;h=12260e3b9dd99fd3b67bddce75dc9498bcd81499;hb=9d044cf4ee933257c65cbd8c01589dd88778a1dd;hp=129738a95e009b883fbf56e52b7d67f8e688cd4d;hpb=3e20c6c07ddfe2d5f04cf268727ae466e3b36128;p=stockfish diff --git a/src/movegen.cpp b/src/movegen.cpp index 129738a9..12260e3b 100644 --- a/src/movegen.cpp +++ b/src/movegen.cpp @@ -40,68 +40,74 @@ namespace { QUEEN_SIDE }; - // Function + const bool CAPTURE = true; + const bool NON_CAPTURE = false; + + // Functions bool castling_is_check(const Position&, CastlingSide); - // Templates + // Helper templates template - MoveStack* generate_castle_moves(const Position&, MoveStack*); - template - MoveStack* generate_piece_checks(const Position&, MoveStack*, Color us, Bitboard, Square); + MoveStack* generate_castle_moves(const Position& pos, MoveStack* mlist); + template - MoveStack* do_generate_pawn_blocking_evasions(const Position& pos, Bitboard not_pinned, - Bitboard blockSquares, MoveStack* mlist); + MoveStack* generate_pawn_blocking_evasions(const Position&, Bitboard, Bitboard, MoveStack*); - // Template generate_pawn_captures() with specializations template - MoveStack* do_generate_pawn_captures(const Position& pos, MoveStack* mlist); + MoveStack* generate_pawn_captures(const Position& pos, MoveStack* mlist); - template - inline MoveStack* generate_pawn_captures(const Position& p, MoveStack* m) { - return do_generate_pawn_captures(p, m); - } - template<> - inline MoveStack* generate_pawn_captures(const Position& p, MoveStack* m) { - return do_generate_pawn_captures(p, m); - } - - // Template generate_pawn_noncaptures() with specializations template - MoveStack* do_generate_pawn_noncaptures(const Position& pos, MoveStack* mlist); - - template - inline MoveStack* generate_pawn_noncaptures(const Position& p, MoveStack* m) { - return do_generate_pawn_noncaptures(p, m); - } - template<> - inline MoveStack* generate_pawn_noncaptures(const Position& p, MoveStack* m) { - return do_generate_pawn_noncaptures(p, m); - } + MoveStack* generate_pawn_noncaptures(const Position& pos, MoveStack* mlist); - // Template generate_pawn_checks() with specializations template - MoveStack* do_generate_pawn_checks(const Position&, Bitboard, Square, MoveStack*); + MoveStack* generate_pawn_checks(const Position&, Bitboard, Square, MoveStack*); + + // Template generate_piece_checks() with specializations + template + MoveStack* generate_piece_checks(const Position&, MoveStack*, Color, Bitboard, Square); - template - inline MoveStack* generate_pawn_checks(const Position& p, MoveStack* m, Bitboard dc, Square ksq) { - return do_generate_pawn_checks(p, dc, ksq, m); - } template<> - inline MoveStack* generate_pawn_checks(const Position& p, MoveStack* m, Bitboard dc, Square ksq) { - return do_generate_pawn_checks(p, dc, ksq, m); + inline MoveStack* generate_piece_checks(const Position& p, MoveStack* m, Color us, Bitboard dc, Square ksq) { + + if (us == WHITE) + return generate_pawn_checks(p, dc, ksq, m); + else + return generate_pawn_checks(p, dc, ksq, m); + } // 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 + inline MoveStack* generate_piece_moves(const Position& p, MoveStack* m, Color us) { + + assert(Piece == PAWN); + + if (Capture) + return (us == WHITE ? generate_pawn_captures(p, m) + : generate_pawn_captures(p, m)); + else + return (us == WHITE ? generate_pawn_noncaptures(p, m) + : generate_pawn_noncaptures(p, m)); + } + // Template generate_piece_blocking_evasions() with specializations template 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); + inline MoveStack* generate_piece_blocking_evasions(const Position& p, MoveStack* m, Color us, + Bitboard np, Bitboard bs) { + if (us == WHITE) + return generate_pawn_blocking_evasions(p, np, bs, m); + else + return generate_pawn_blocking_evasions(p, np, bs, m); + } } @@ -126,12 +132,7 @@ int generate_captures(const Position& pos, MoveStack* mlist) { mlist = generate_piece_moves(pos, mlist, us, target); mlist = generate_piece_moves(pos, mlist, us, target); mlist = generate_piece_moves(pos, mlist, us, target); - - if (us == WHITE) - mlist = generate_pawn_captures(pos, mlist); - else - mlist = generate_pawn_captures(pos, mlist); - + mlist = generate_piece_moves(pos, mlist, us); mlist = generate_piece_moves(pos, mlist, us, target); return int(mlist - mlist_start); } @@ -149,11 +150,7 @@ int generate_noncaptures(const Position& pos, MoveStack* mlist) { Bitboard target = pos.empty_squares(); MoveStack* mlist_start = mlist; - if (us == WHITE) - mlist = generate_pawn_noncaptures(pos, mlist); - else - mlist = generate_pawn_noncaptures(pos, mlist); - + mlist = generate_piece_moves(pos, mlist, us); mlist = generate_piece_moves(pos, mlist, us, target); mlist = generate_piece_moves(pos, mlist, us, target); mlist = generate_piece_moves(pos, mlist, us, target); @@ -179,13 +176,8 @@ int generate_checks(const Position& pos, MoveStack* mlist, Bitboard dc) { assert(pos.piece_on(ksq) == king_of_color(opposite_color(us))); - // Pawn moves - if (us == WHITE) - mlist = generate_pawn_checks(pos, mlist, dc, ksq); - else - mlist = generate_pawn_checks(pos, mlist, dc, ksq); - // Pieces moves + mlist = generate_piece_checks(pos, mlist, us, dc, ksq); mlist = generate_piece_checks(pos, mlist, us, dc, ksq); mlist = generate_piece_checks(pos, mlist, us, dc, ksq); mlist = generate_piece_checks(pos, mlist, us, dc, ksq); @@ -609,19 +601,10 @@ 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 - MoveStack* do_generate_pawn_captures(const Position& pos, MoveStack* mlist) { + MoveStack* generate_pawn_captures(const Position& pos, MoveStack* mlist) { Square to; Bitboard pawns = pos.pawns(Us); @@ -694,7 +677,7 @@ namespace { template - MoveStack* do_generate_pawn_noncaptures(const Position& pos, MoveStack* mlist) { + MoveStack* generate_pawn_noncaptures(const Position& pos, MoveStack* mlist) { Bitboard pawns = pos.pawns(Us); Bitboard enemyPieces = pos.pieces_of_color(Them); @@ -751,7 +734,7 @@ namespace { template - MoveStack* do_generate_pawn_checks(const Position& pos, Bitboard dc, Square ksq, MoveStack* mlist) + MoveStack* generate_pawn_checks(const Position& pos, Bitboard dc, Square ksq, MoveStack* mlist) { // Find all friendly pawns not on the enemy king's file Bitboard b1, b2, b3; @@ -840,8 +823,8 @@ namespace { } template - MoveStack* do_generate_pawn_blocking_evasions(const Position& pos, Bitboard not_pinned, - Bitboard blockSquares, MoveStack* mlist) { + MoveStack* generate_pawn_blocking_evasions(const Position& pos, Bitboard not_pinned, + Bitboard blockSquares, MoveStack* mlist) { Square to; // Find non-pinned pawns