/*
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
- Copyright (C) 2004-2021 The Stockfish developers (see AUTHORS file)
+ Copyright (C) 2004-2023 The Stockfish developers (see AUTHORS file)
Stockfish is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
constexpr bool Is64Bit = false;
#endif
-typedef uint64_t Key;
-typedef uint64_t Bitboard;
+using Key = uint64_t;
+using Bitboard = uint64_t;
constexpr int MAX_MOVES = 256;
constexpr int MAX_PLY = 246;
};
enum Phase {
- PHASE_ENDGAME,
- PHASE_MIDGAME = 128,
MG = 0, EG = 1, PHASE_NB = 2
};
BOUND_EXACT = BOUND_UPPER | BOUND_LOWER
};
-enum ExplosionState {
- EXPLOSION_NONE,
- MUST_CALM_DOWN
-};
-
enum Value : int {
VALUE_ZERO = 0,
VALUE_DRAW = 0,
VALUE_MATE_IN_MAX_PLY = VALUE_MATE - MAX_PLY,
VALUE_MATED_IN_MAX_PLY = -VALUE_MATE_IN_MAX_PLY,
+ // In the code, we make the assumption that these values
+ // are such that non_pawn_material() can be used to uniquely
+ // identify the material on the board.
PawnValueMg = 126, PawnValueEg = 208,
KnightValueMg = 781, KnightValueEg = 854,
BishopValueMg = 825, BishopValueEg = 915,
RookValueMg = 1276, RookValueEg = 1380,
QueenValueMg = 2538, QueenValueEg = 2682,
-
- MidgameLimit = 15258, EndgameLimit = 3915
};
enum PieceType {
VALUE_ZERO, PawnValueEg, KnightValueEg, BishopValueEg, RookValueEg, QueenValueEg, VALUE_ZERO, VALUE_ZERO }
};
-typedef int Depth;
+using Depth = int;
enum : int {
DEPTH_QS_CHECKS = 0,
Square to[3];
};
-/// Score enum stores a middlegame and an endgame value in a single integer (enum).
-/// The least significant 16 bits are used to store the middlegame value and the
-/// upper 16 bits are used to store the endgame value. We have to take care to
-/// avoid left-shifting a signed int to avoid undefined behavior.
-enum Score : int { SCORE_ZERO };
-
-constexpr Score make_score(int mg, int eg) {
- return Score((int)((unsigned int)eg << 16) + mg);
-}
-
-/// Extracting the signed lower and upper 16 bits is not so trivial because
-/// according to the standard a simple cast to short is implementation defined
-/// and so is a right shift of a signed integer.
-inline Value eg_value(Score s) {
- union { uint16_t u; int16_t s; } eg = { uint16_t(unsigned(s + 0x8000) >> 16) };
- return Value(eg.s);
-}
-
-inline Value mg_value(Score s) {
- union { uint16_t u; int16_t s; } mg = { uint16_t(unsigned(s)) };
- return Value(mg.s);
-}
-
#define ENABLE_BASE_OPERATORS_ON(T) \
constexpr T operator+(T d1, int d2) { return T(int(d1) + d2); } \
constexpr T operator-(T d1, int d2) { return T(int(d1) - d2); } \
ENABLE_INCR_OPERATORS_ON(File)
ENABLE_INCR_OPERATORS_ON(Rank)
-ENABLE_BASE_OPERATORS_ON(Score)
-
#undef ENABLE_FULL_OPERATORS_ON
#undef ENABLE_INCR_OPERATORS_ON
#undef ENABLE_BASE_OPERATORS_ON
inline Square& operator+=(Square& s, Direction d) { return s = s + d; }
inline Square& operator-=(Square& s, Direction d) { return s = s - d; }
-/// Only declared but not defined. We don't want to multiply two scores due to
-/// a very high risk of overflow. So user should explicitly convert to integer.
-Score operator*(Score, Score) = delete;
-
-/// Division of a Score must be handled separately for each term
-inline Score operator/(Score s, int i) {
- return make_score(mg_value(s) / i, eg_value(s) / i);
-}
-
-/// Multiplication of a Score by an integer. We check for overflow in debug mode.
-inline Score operator*(Score s, int i) {
-
- Score result = Score(int(s) * i);
-
- assert(eg_value(result) == (i * eg_value(s)));
- assert(mg_value(result) == (i * mg_value(s)));
- assert((i == 0) || (result / i) == s);
-
- return result;
-}
-
-/// Multiplication of a Score by a boolean
-inline Score operator*(Score s, bool b) {
- return b ? s : SCORE_ZERO;
-}
-
constexpr Color operator~(Color c) {
return Color(c ^ BLACK); // Toggle color
}
return Color(pc >> 3);
}
+constexpr bool is_ok(Move m) {
+ return m != MOVE_NONE && m != MOVE_NULL;
+}
+
constexpr bool is_ok(Square s) {
return s >= SQ_A1 && s <= SQ_H8;
}
}
constexpr Square from_sq(Move m) {
+ assert(is_ok(m));
return Square((m >> 6) & 0x3F);
}
constexpr Square to_sq(Move m) {
+ assert(is_ok(m));
return Square(m & 0x3F);
}
constexpr int from_to(Move m) {
- return m & 0xFFF;
+ return m & 0xFFF;
}
constexpr MoveType type_of(Move m) {
return Move((from << 6) + to);
}
-constexpr Move reverse_move(Move m) {
- return make_move(to_sq(m), from_sq(m));
-}
-
template<MoveType T>
constexpr Move make(Square from, Square to, PieceType pt = KNIGHT) {
return Move(T + ((pt - KNIGHT) << 12) + (from << 6) + to);
}
-constexpr bool is_ok(Move m) {
- return from_sq(m) != to_sq(m); // Catch MOVE_NULL and MOVE_NONE
-}
-
/// Based on a congruential pseudo random number generator
constexpr Key make_key(uint64_t seed) {
return seed * 6364136223846793005ULL + 1442695040888963407ULL;