#include "types.h"
class Position;
-struct Thread;
+class Thread;
-/// CheckInfo struct is initialized at c'tor time and keeps info used to detect
-/// if a move gives check.
+namespace PSQT {
+
+ extern Score psq[COLOR_NB][PIECE_TYPE_NB][SQUARE_NB];
+
+ void init();
+}
+
+/// CheckInfo struct is initialized at constructor time and keeps info used to
+/// detect if a move gives check.
struct CheckInfo {
Bitboard dcCandidates;
Bitboard pinned;
- Bitboard checkSq[PIECE_TYPE_NB];
+ Bitboard checkSquares[PIECE_TYPE_NB];
Square ksq;
};
class Position {
- friend std::ostream& operator<<(std::ostream&, const Position&);
-
public:
static void init();
Bitboard pieces(Color c, PieceType pt) const;
Bitboard pieces(Color c, PieceType pt1, PieceType pt2) const;
Piece piece_on(Square s) const;
- Square king_square(Color c) const;
Square ep_square() const;
bool empty(Square s) const;
template<PieceType Pt> int count(Color c) const;
- template<PieceType Pt> const Square* list(Color c) const;
+ template<PieceType Pt> const Square* squares(Color c) const;
+ template<PieceType Pt> Square square(Color c) const;
// Castling
int can_castle(Color c) const;
// Piece specific
bool pawn_passed(Color c, Square s) const;
- bool pawn_on_7th(Color c) const;
bool opposite_bishops() const;
// Doing and undoing moves
bool chess960;
};
+extern std::ostream& operator<<(std::ostream& os, const Position& pos);
+
inline Color Position::side_to_move() const {
return sideToMove;
}
return pieceCount[c][Pt];
}
-template<PieceType Pt> inline const Square* Position::list(Color c) const {
+template<PieceType Pt> inline const Square* Position::squares(Color c) const {
return pieceList[c][Pt];
}
-inline Square Position::king_square(Color c) const {
- return pieceList[c][KING][0];
+template<PieceType Pt> inline Square Position::square(Color c) const {
+ assert(pieceCount[c][Pt] == 1);
+ return pieceList[c][Pt][0];
}
inline Square Position::ep_square() const {
inline bool Position::opposite_bishops() const {
return pieceCount[WHITE][BISHOP] == 1
&& pieceCount[BLACK][BISHOP] == 1
- && opposite_colors(pieceList[WHITE][BISHOP][0], pieceList[BLACK][BISHOP][0]);
-}
-
-inline bool Position::pawn_on_7th(Color c) const {
- return pieces(c, PAWN) & rank_bb(relative_rank(c, RANK_7));
+ && opposite_colors(square<BISHOP>(WHITE), square<BISHOP>(BLACK));
}
inline bool Position::is_chess960() const {