#if !defined(POSITION_H_INCLUDED)
#define POSITION_H_INCLUDED
-// Disable a silly and noisy warning from MSVC compiler
+// Disable some silly and noisy warning from MSVC compiler
#if defined(_MSC_VER)
// Forcing value to bool 'true' or 'false' (performance warning)
//// Constants
////
-/// FEN string for the initial position:
-const std::string StartPosition =
- "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1";
+/// FEN string for the initial position
+const std::string StartPosition = "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1";
/// Maximum number of plies per game (220 should be enough, because the
/// maximum search depth is 100, and during position setup we reset the
-/// move counter for every non-reversible move):
+/// move counter for every non-reversible move).
const int MaxGameLength = 220;
/// Castle rights, encoded as bit fields
enum CastleRights {
- NO_CASTLES = 0,
- WHITE_OO = 1,
- BLACK_OO = 2,
- WHITE_OOO = 4,
- BLACK_OOO = 8,
+ NO_CASTLES = 0,
+ WHITE_OO = 1,
+ BLACK_OO = 2,
+ WHITE_OOO = 4,
+ BLACK_OOO = 8,
ALL_CASTLES = 15
};
int castleRights, rule50;
Square epSquare;
Value mgValue, egValue;
+ Value npMaterial[2];
PieceType capture;
Bitboard checkersBB;
- Move lastMove;
StateInfo* previous;
};
-/// The position data structure. A position consists of the following data:
+/// The position data structure. A position consists of the following data:
///
/// * For each piece type, a bitboard representing the squares occupied
/// by pieces of that type.
-/// * For each color, a bitboard representing the squares occupiecd by
+/// * For each color, a bitboard representing the squares occupied by
/// pieces of that color.
/// * A bitboard of all occupied squares.
/// * A bitboard of all checking pieces.
/// * A 64-entry array of pieces, indexed by the squares of the board.
/// * The current side to move.
/// * Information about the castling rights for both sides.
-/// * The initial files of the kings and both pairs of rooks. This is
+/// * The initial files of the kings and both pairs of rooks. This is
/// used to implement the Chess960 castling rules.
/// * The en passant square (which is SQ_NONE if no en passant capture is
/// possible).
/// * The squares of the kings for both sides.
-/// * The last move played.
/// * Hash keys for the position itself, the current pawn structure, and
/// the current material situation.
-/// * Hash keys for all previous positions in the game (for detecting
+/// * Hash keys for all previous positions in the game for detecting
/// repetition draws.
/// * A counter for detecting 50 move rule draws.
void print(Move m = MOVE_NONE) const;
// Copying
- void copy(const Position &pos);
- void flipped_copy(const Position &pos);
+ void copy(const Position& pos);
+ void flipped_copy(const Position& pos);
// The piece on a given square
Piece piece_on(Square s) const;
bool square_is_weak(Square s, Color c) const;
// Doing and undoing moves
- void setStartState(const StateInfo& st);
+ void saveState();
void do_move(Move m, StateInfo& st);
void do_move(Move m, StateInfo& st, Bitboard dcCandidates);
void undo_move(Move m);
Color sideToMove;
int gamePly;
Key history[MaxGameLength];
- Value npMaterial[2];
File initialKFile, initialKRFile, initialQRFile;
StateInfo startState;
StateInfo* st;
return bishops_and_queens() & pieces_of_color(c);
}
-inline Bitboard Position::sliders_of_color(Color c) const {
- return sliders() & pieces_of_color(c);
-}
-
inline int Position::piece_count(Color c, PieceType pt) const {
return pieceCount[c][pt];
}
return StepAttackBB[piece_of_color_and_type(c, PAWN)][s];
}
-template<>
-inline Bitboard Position::piece_attacks<PAWN>(Square s) const {
- return StepAttackBB[piece_of_color_and_type(opposite_color(sideToMove), PAWN)][s];
+template<PieceType Piece> // Knight and King
+inline Bitboard Position::piece_attacks(Square s) const {
+ return StepAttackBB[Piece][s];
}
template<>
-inline Bitboard Position::piece_attacks<KNIGHT>(Square s) const {
- return StepAttackBB[KNIGHT][s];
+inline Bitboard Position::piece_attacks<PAWN>(Square s) const {
+ return StepAttackBB[piece_of_color_and_type(opposite_color(sideToMove), PAWN)][s];
}
template<>
return piece_attacks<ROOK>(s) | piece_attacks<BISHOP>(s);
}
-template<>
-inline Bitboard Position::piece_attacks<KING>(Square s) const {
- return StepAttackBB[KING][s];
-}
-
inline Bitboard Position::checkers() const {
return st->checkersBB;
}
}
inline Value Position::non_pawn_material(Color c) const {
- return npMaterial[c];
+ return st->npMaterial[c];
}
inline Phase Position::game_phase() const {