class Position {
public:
Position() {}
- Position(const Position& p) { *this = p; }
Position(const Position& p, Thread* t) { *this = p; thisThread = t; }
Position(const std::string& f, bool c960, Thread* t) { from_fen(f, c960, t); }
- void operator=(const Position&);
+ Position& operator=(const Position&);
// Text input/output
void from_fen(const std::string& fen, bool isChess960, Thread* th);
bool pos_is_ok(int* failedStep = NULL) const;
void flip();
- // Global initialization
- static void init();
-
private:
// Initialization helpers (used while setting up a position)
void clear();
Thread* thisThread;
StateInfo* st;
int chess960;
-
- // Static variables
- static Score pieceSquareTable[16][64]; // [piece][square]
- static Key zobrist[2][8][64]; // [color][pieceType][square]/[piece count]
- static Key zobEp[8]; // [file]
- static Key zobCastle[16]; // [castleRight]
- static Key zobSideToMove;
- static Key zobExclusion;
};
inline int64_t Position::nodes_searched() const {
}
inline Key Position::exclusion_key() const {
- return st->key ^ zobExclusion;
+ return st->key ^ Zobrist::exclusion;
}
inline Key Position::pawn_key() const {
inline bool Position::is_capture_or_promotion(Move m) const {
assert(is_ok(m));
- return is_special(m) ? !is_castle(m) : !is_empty(to_sq(m));
+ return type_of(m) ? type_of(m) != CASTLE : !is_empty(to_sq(m));
}
inline bool Position::is_capture(Move m) const {
// Note that castle is coded as "king captures the rook"
assert(is_ok(m));
- return (!is_empty(to_sq(m)) && !is_castle(m)) || is_enpassant(m);
+ return (!is_empty(to_sq(m)) && type_of(m) != CASTLE) || type_of(m) == ENPASSANT;
}
inline PieceType Position::captured_piece_type() const {