else
(void)ksq; // Silence a warning under MSVC
}
+
return mlist;
}
template<Color Us, MoveType Type>
- MoveStack* generate_pawn_moves(const Position& pos, MoveStack* mlist, Bitboard target, Square ksq) {
+ MoveStack* generate_pawn_moves(const Position& pos, MoveStack* mlist, Bitboard target, Square ksq = SQ_NONE) {
// Calculate our parametrized parameters at compile time, named according to
// the point of view of white side.
Color us, const CheckInfo& ci) {
assert(Pt != KING && Pt != PAWN);
- Bitboard checkSqs, b;
Square from;
const Square* pl = pos.piece_list(us, Pt);
if ((from = *pl++) == SQ_NONE)
return mlist;
- checkSqs = ci.checkSq[Pt] & pos.empty_squares();
+ Bitboard checkSqs = ci.checkSq[Pt] & pos.empty_squares();
do
{
if (ci.dcCandidates && bit_is_set(ci.dcCandidates, from))
continue;
- b = pos.attacks_from<Pt>(from) & checkSqs;
+ Bitboard b = pos.attacks_from<Pt>(from) & checkSqs;
SERIALIZE(b);
} while ((from = *pl++) != SQ_NONE);
}
- template<>
- FORCE_INLINE MoveStack* generate_direct_checks<PAWN>(const Position& p, MoveStack* m,
- Color us, const CheckInfo& ci) {
-
- return us == WHITE ? generate_pawn_moves<WHITE, MV_NON_CAPTURE_CHECK>(p, m, ci.dcCandidates, ci.ksq)
- : generate_pawn_moves<BLACK, MV_NON_CAPTURE_CHECK>(p, m, ci.dcCandidates, ci.ksq);
- }
-
-
- template<PieceType Pt, MoveType Type>
- FORCE_INLINE MoveStack* generate_piece_moves(const Position& p, MoveStack* m, Color us, Bitboard t) {
-
- assert(Pt == PAWN);
- return us == WHITE ? generate_pawn_moves<WHITE, Type>(p, m, t, SQ_NONE)
- : generate_pawn_moves<BLACK, Type>(p, m, t, SQ_NONE);
- }
-
-
template<PieceType Pt>
FORCE_INLINE MoveStack* generate_piece_moves(const Position& pos, MoveStack* mlist, Color us, Bitboard target) {
SERIALIZE(b);
} while (*++pl != SQ_NONE);
}
+
return mlist;
}
else if (Type == MV_NON_EVASION)
target = pos.pieces(~us) | pos.empty_squares();
- mlist = generate_piece_moves<PAWN, Type>(pos, mlist, us, target);
+ mlist = (us == WHITE ? generate_pawn_moves<WHITE, Type>(pos, mlist, target)
+ : generate_pawn_moves<BLACK, Type>(pos, mlist, target));
+
mlist = generate_piece_moves<KNIGHT>(pos, mlist, us, target);
mlist = generate_piece_moves<BISHOP>(pos, mlist, us, target);
mlist = generate_piece_moves<ROOK>(pos, mlist, us, target);
SERIALIZE(b);
}
- mlist = generate_direct_checks<PAWN>(pos, mlist, us, ci);
+ mlist = (us == WHITE ? generate_pawn_moves<WHITE, MV_NON_CAPTURE_CHECK>(pos, mlist, ci.dcCandidates, ci.ksq)
+ : generate_pawn_moves<BLACK, MV_NON_CAPTURE_CHECK>(pos, mlist, ci.dcCandidates, ci.ksq));
+
mlist = generate_direct_checks<KNIGHT>(pos, mlist, us, ci);
mlist = generate_direct_checks<BISHOP>(pos, mlist, us, ci);
mlist = generate_direct_checks<ROOK>(pos, mlist, us, ci);
// Blocking evasions or captures of the checking piece
target = squares_between(checksq, ksq) | checkers;
- mlist = generate_piece_moves<PAWN, MV_EVASION>(pos, mlist, us, target);
+ mlist = (us == WHITE ? generate_pawn_moves<WHITE, MV_EVASION>(pos, mlist, target)
+ : generate_pawn_moves<BLACK, MV_EVASION>(pos, mlist, target));
+
mlist = generate_piece_moves<KNIGHT>(pos, mlist, us, target);
mlist = generate_piece_moves<BISHOP>(pos, mlist, us, target);
mlist = generate_piece_moves<ROOK>(pos, mlist, us, target);
return castleRookSquare[f];
}
-template<>
-inline Bitboard Position::attacks_from<PAWN>(Square s, Color c) const {
- return StepAttacksBB[make_piece(c, PAWN)][s];
-}
-
-template<PieceType Piece> // Knight and King and white pawns
+template<PieceType Pt>
inline Bitboard Position::attacks_from(Square s) const {
- return StepAttacksBB[Piece][s];
+ return Pt == BISHOP ? bishop_attacks_bb(s, occupied_squares())
+ : Pt == ROOK ? rook_attacks_bb(s, occupied_squares())
+ : Pt == QUEEN ? attacks_from<ROOK>(s) | attacks_from<BISHOP>(s)
+ : StepAttacksBB[Pt][s];
}
template<>
-inline Bitboard Position::attacks_from<BISHOP>(Square s) const {
- return bishop_attacks_bb(s, occupied_squares());
-}
-
-template<>
-inline Bitboard Position::attacks_from<ROOK>(Square s) const {
- return rook_attacks_bb(s, occupied_squares());
-}
-
-template<>
-inline Bitboard Position::attacks_from<QUEEN>(Square s) const {
- return attacks_from<ROOK>(s) | attacks_from<BISHOP>(s);
+inline Bitboard Position::attacks_from<PAWN>(Square s, Color c) const {
+ return StepAttacksBB[make_piece(c, PAWN)][s];
}
inline Bitboard Position::attacks_from(Piece p, Square s) const {