-inline Square Position::initial_kr_square(Color c) const {
- return relative_square(c, make_square(initialKRFile, RANK_1));
-}
-
-inline Square Position::initial_qr_square(Color c) const {
- return relative_square(c, make_square(initialQRFile, RANK_1));
-}
-
-inline Bitboard Position::pawn_attacks_from(Square s, Color c) const {
- return StepAttackBB[piece_of_color_and_type(c, PAWN)][s];
-}
-
-template<PieceType Piece> // Knight and King
-inline Bitboard Position::piece_attacks_from(Square s) const {
- return StepAttackBB[Piece][s];
-}
-
-template<>
-inline Bitboard Position::piece_attacks_from<PAWN>(Square s) const {
- return StepAttackBB[WP][s] | StepAttackBB[BP][s];
+template<PieceType Pt>
+inline Bitboard Position::attacks_from(Square s) const {
+ return Pt == BISHOP || Pt == ROOK ? attacks_bb<Pt>(s, occupied_squares())
+ : Pt == QUEEN ? attacks_from<ROOK>(s) | attacks_from<BISHOP>(s)
+ : StepAttacksBB[Pt][s];