MOVE_NULL = 65
};
-struct MoveStack {
- Move move;
- int score;
+enum MoveType {
+ NORMAL = 0,
+ PROMOTION = 1 << 14,
+ ENPASSANT = 2 << 14,
+ CASTLE = 3 << 14
};
-inline bool operator<(const MoveStack& f, const MoveStack& s) {
- return f.score < s.score;
-}
-
enum CastleRight { // Defined as in PolyGlot book hash key
CASTLES_NONE = 0,
WHITE_OO = 1,
extern const Value PieceValueEndgame[17];
extern int SquareDistance[64][64];
+struct MoveStack {
+ Move move;
+ int score;
+};
+
+inline bool operator<(const MoveStack& f, const MoveStack& s) {
+ return f.score < s.score;
+}
+
inline Color operator~(Color c) {
return Color(c ^ 1);
}
return Square(s ^ 56); // Vertical flip SQ_A1 -> SQ_A8
}
+inline Square operator|(File f, Rank r) {
+ return Square((r << 3) | f);
+}
+
inline Value mate_in(int ply) {
return VALUE_MATE - ply;
}
return Color(p >> 3);
}
-inline Square make_square(File f, Rank r) {
- return Square((r << 3) | f);
-}
-
inline bool is_ok(Square s) {
return s >= SQ_A1 && s <= SQ_H8;
}
return SquareDistance[s1][s2];
}
-inline char piece_type_to_char(PieceType pt) {
- return " PNBRQK"[pt];
-}
-
inline char file_to_char(File f) {
return char(f - FILE_A + int('a'));
}
return Square(m & 0x3F);
}
-inline bool is_special(Move m) {
- return m & (3 << 14);
-}
-
-inline bool is_promotion(Move m) {
- return (m & (3 << 14)) == (1 << 14);
-}
-
-inline int is_enpassant(Move m) {
- return (m & (3 << 14)) == (2 << 14);
-}
-
-inline int is_castle(Move m) {
- return (m & (3 << 14)) == (3 << 14);
+inline MoveType type_of(Move m) {
+ return MoveType(m & (3 << 14));
}
inline PieceType promotion_type(Move m) {
return Move(to | (from << 6));
}
-inline Move make_promotion(Square from, Square to, PieceType pt) {
- return Move(to | (from << 6) | (1 << 14) | ((pt - 2) << 12)) ;
-}
-
-inline Move make_enpassant(Square from, Square to) {
- return Move(to | (from << 6) | (2 << 14));
-}
-
-inline Move make_castle(Square from, Square to) {
- return Move(to | (from << 6) | (3 << 14));
+template<MoveType T>
+inline Move make(Square from, Square to, PieceType pt = KNIGHT) {
+ return Move(to | (from << 6) | T | ((pt - KNIGHT) << 12)) ;
}
inline bool is_ok(Move m) {