X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fposition.h;h=0099ccd2f8e08f1a6e1b3fb2539da5cdff5b4803;hp=ca233aa31d53d0dc70a715a35420164d345ea615;hb=257689dec7a1d64658cb80d285a78e8d49141619;hpb=3f38cca07203a9424cb7f9406d2da1485c266976 diff --git a/src/position.h b/src/position.h index ca233aa3..0099ccd2 100644 --- a/src/position.h +++ b/src/position.h @@ -194,13 +194,9 @@ public: Bitboard sliding_attacks(Square s, Direction d) const; Bitboard ray_attacks(Square s, SignedDirection d) const; Bitboard pawn_attacks(Color c, Square s) const; - Bitboard white_pawn_attacks(Square s) const; - Bitboard black_pawn_attacks(Square s) const; - Bitboard knight_attacks(Square s) const; - Bitboard bishop_attacks(Square s) const; - Bitboard rook_attacks(Square s) const; - Bitboard queen_attacks(Square s) const; - Bitboard king_attacks(Square s) const; + + template + Bitboard piece_attacks(Square s) const; // Bitboards for pinned pieces and discovered check candidates Bitboard discovered_check_candidates(Color c) const; @@ -209,27 +205,20 @@ public: // Checking pieces Bitboard checkers() const; - // Piece lists: + // Piece lists Square piece_list(Color c, PieceType pt, int index) const; - Square pawn_list(Color c, int index) const; - Square knight_list(Color c, int index) const; - Square bishop_list(Color c, int index) const; - Square rook_list(Color c, int index) const; - Square queen_list(Color c, int index) const; // Attack information for a given square bool square_is_attacked(Square s, Color c) const; Bitboard attacks_to(Square s) const; Bitboard attacks_to(Square s, Color c) const; bool is_check() const; - bool piece_attacks_square(Square f, Square t) const; - bool white_pawn_attacks_square(Square f, Square t) const; - bool black_pawn_attacks_square(Square f, Square t) const; - bool knight_attacks_square(Square f, Square t) const; - bool bishop_attacks_square(Square f, Square t) const; - bool rook_attacks_square(Square f, Square t) const; - bool queen_attacks_square(Square f, Square t) const; - bool king_attacks_square(Square f, Square t) const; + bool pawn_attacks_square(Color c, Square f, Square t) const; + + template + Bitboard piece_attacks_square(Square f, Square t) const; // Dispatch at compile-time + + bool piece_attacks_square(Square f, Square t) const; // Dispatch at run-time // Properties of moves bool move_is_legal(Move m) const; @@ -370,10 +359,6 @@ private: }; -/// An array of member functions to dispatch attacks_square -typedef Bitboard (Position::* Piece_attacks_fn)(Square s) const; -extern const Piece_attacks_fn piece_attacks_fn[]; - //// //// Inline functions //// @@ -530,26 +515,6 @@ inline Square Position::piece_list(Color c, PieceType pt, int index) const { return pieceList[c][pt][index]; } -inline Square Position::pawn_list(Color c, int index) const { - return piece_list(c, PAWN, index); -} - -inline Square Position::knight_list(Color c, int index) const { - return piece_list(c, KNIGHT, index); -} - -inline Square Position::bishop_list(Color c, int index) const { - return piece_list(c, BISHOP, index); -} - -inline Square Position::rook_list(Color c, int index) const { - return piece_list(c, ROOK, index); -} - -inline Square Position::queen_list(Color c, int index) const { - return piece_list(c, QUEEN, index); -} - inline Square Position::ep_square() const { return epSquare; } @@ -582,31 +547,28 @@ inline Bitboard Position::pawn_attacks(Color c, Square s) const { return StepAttackBB[pawn_of_color(c)][s]; } -inline Bitboard Position::white_pawn_attacks(Square s) const { - return pawn_attacks(WHITE, s); -} - -inline Bitboard Position::black_pawn_attacks(Square s) const { - return pawn_attacks(BLACK, s); -} - -inline Bitboard Position::knight_attacks(Square s) const { +template<> +inline Bitboard Position::piece_attacks(Square s) const { return StepAttackBB[KNIGHT][s]; } -inline Bitboard Position::rook_attacks(Square s) const { - return rook_attacks_bb(s, occupied_squares()); +template<> +inline Bitboard Position::piece_attacks(Square s) const { + return bishop_attacks_bb(s, occupied_squares()); } -inline Bitboard Position::bishop_attacks(Square s) const { - return bishop_attacks_bb(s, occupied_squares()); +template<> +inline Bitboard Position::piece_attacks(Square s) const { + return rook_attacks_bb(s, occupied_squares()); } -inline Bitboard Position::queen_attacks(Square s) const { - return rook_attacks(s) | bishop_attacks(s); +template<> +inline Bitboard Position::piece_attacks(Square s) const { + return piece_attacks(s) | piece_attacks(s); } -inline Bitboard Position::king_attacks(Square s) const { +template<> +inline Bitboard Position::piece_attacks(Square s) const { return StepAttackBB[KING][s]; } @@ -618,32 +580,13 @@ inline bool Position::is_check() const { return checkers() != EmptyBoardBB; } -inline bool Position::white_pawn_attacks_square(Square f, Square t) const { - return bit_is_set(white_pawn_attacks(f), t); -} - -inline bool Position::black_pawn_attacks_square(Square f, Square t) const { - return bit_is_set(black_pawn_attacks(f), t); -} - -inline bool Position::knight_attacks_square(Square f, Square t) const { - return bit_is_set(knight_attacks(f), t); -} - -inline bool Position::bishop_attacks_square(Square f, Square t) const { - return bit_is_set(bishop_attacks(f), t); -} - -inline bool Position::rook_attacks_square(Square f, Square t) const { - return bit_is_set(rook_attacks(f), t); -} - -inline bool Position::queen_attacks_square(Square f, Square t) const { - return bit_is_set(queen_attacks(f), t); +inline bool Position::pawn_attacks_square(Color c, Square f, Square t) const { + return bit_is_set(pawn_attacks(c, f), t); } -inline bool Position::king_attacks_square(Square f, Square t) const { - return bit_is_set(king_attacks(f), t); +template +Bitboard Position::piece_attacks_square(Square f, Square t) const { + return bit_is_set(piece_attacks(f), t); } inline bool Position::pawn_is_passed(Color c, Square s) const { @@ -765,8 +708,8 @@ inline int Position::rule_50_counter() const { inline bool Position::opposite_colored_bishops() const { return bishop_count(WHITE) == 1 - && bishop_count(BLACK) == 1 - && square_color(bishop_list(WHITE, 0)) != square_color(bishop_list(BLACK, 0)); + && bishop_count(BLACK) == 1 + && square_color(piece_list(WHITE, BISHOP, 0)) != square_color(piece_list(BLACK, BISHOP, 0)); } inline bool Position::has_pawn_on_7th(Color c) const {