public:
Position() {}
Position(const Position& p) { *this = p; }
- Position(const std::string& f, bool c960) { from_fen(f, c960); }
- Position& operator=(const Position&);
+ 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&);
// Text input/output
- void from_fen(const std::string& fen, bool isChess960);
+ void from_fen(const std::string& fen, bool isChess960, Thread* th);
const std::string to_fen() const;
void print(Move m = MOVE_NONE) const;
// Castling
bool can_castle(CastleRight f) const;
bool can_castle(Color c) const;
- bool castle_impeded(CastleRight f) const;
- Square castle_rook_square(CastleRight f) const;
+ bool castle_impeded(Color c, CastlingSide s) const;
+ Square castle_rook_square(Color c, CastlingSide s) const;
// Checking
bool in_check() const;
Color side_to_move() const;
int startpos_ply_counter() const;
bool is_chess960() const;
+ Thread* this_thread() const;
int64_t nodes_searched() const;
void set_nodes_searched(int64_t n);
template<bool SkipRepetition> bool is_draw() const;
int index[64]; // [square]
// Other info
- int castleRightsMask[64]; // [square]
- Square castleRookSquare[16]; // [castleRight]
- Bitboard castlePath[16]; // [castleRight]
+ int castleRightsMask[64]; // [square]
+ Square castleRookSquare[2][2]; // [color][side]
+ Bitboard castlePath[2][2]; // [color][side]
StateInfo startState;
int64_t nodes;
int startPosPly;
Color sideToMove;
+ Thread* thisThread;
StateInfo* st;
int chess960;
return st->castleRights & ((WHITE_OO | WHITE_OOO) << c);
}
-inline bool Position::castle_impeded(CastleRight f) const {
- return byTypeBB[ALL_PIECES] & castlePath[f];
+inline bool Position::castle_impeded(Color c, CastlingSide s) const {
+ return byTypeBB[ALL_PIECES] & castlePath[c][s];
}
-inline Square Position::castle_rook_square(CastleRight f) const {
- return castleRookSquare[f];
+inline Square Position::castle_rook_square(Color c, CastlingSide s) const {
+ return castleRookSquare[c][s];
}
template<PieceType Pt>
return st->capturedType;
}
+inline Thread* Position::this_thread() const {
+ return thisThread;
+}
+
#endif // !defined(POSITION_H_INCLUDED)