Value Endgame<KXK>::operator()(const Position& pos) const {
assert(pos.non_pawn_material(weakerSide) == VALUE_ZERO);
- assert(pos.piece_count(weakerSide, PAWN) == VALUE_ZERO);
+ assert(!pos.count<PAWN>(weakerSide));
// Stalemate detection with lone king
if ( pos.side_to_move() == weakerSide
Square loserKSq = pos.king_square(weakerSide);
Value result = pos.non_pawn_material(strongerSide)
- + pos.piece_count(strongerSide, PAWN) * PawnValueEg
+ + pos.count<PAWN>(strongerSide) * PawnValueEg
+ MateTable[loserKSq]
+ DistanceBonus[square_distance(winnerKSq, loserKSq)];
- if ( pos.piece_count(strongerSide, QUEEN)
- || pos.piece_count(strongerSide, ROOK)
+ if ( pos.count<QUEEN>(strongerSide)
+ || pos.count<ROOK>(strongerSide)
|| pos.bishop_pair(strongerSide)) {
result += VALUE_KNOWN_WIN;
}
template<>
Value Endgame<KBNK>::operator()(const Position& pos) const {
- assert(pos.non_pawn_material(weakerSide) == VALUE_ZERO);
- assert(pos.piece_count(weakerSide, PAWN) == VALUE_ZERO);
assert(pos.non_pawn_material(strongerSide) == KnightValueMg + BishopValueMg);
- assert(pos.piece_count(strongerSide, BISHOP) == 1);
- assert(pos.piece_count(strongerSide, KNIGHT) == 1);
- assert(pos.piece_count(strongerSide, PAWN) == 0);
+ assert(pos.non_pawn_material(weakerSide) == VALUE_ZERO);
+ assert(pos.count<BISHOP>(strongerSide) == 1);
+ assert(pos.count<KNIGHT>(strongerSide) == 1);
+ assert(pos.count< PAWN>(strongerSide) == 0);
+ assert(pos.count< PAWN>(weakerSide ) == 0);
Square winnerKSq = pos.king_square(strongerSide);
Square loserKSq = pos.king_square(weakerSide);
- Square bishopSq = pos.piece_list(strongerSide, BISHOP)[0];
+ Square bishopSq = pos.list<BISHOP>(strongerSide)[0];
// kbnk_mate_table() tries to drive toward corners A1 or H8,
// if we have a bishop that cannot reach the above squares we
assert(pos.non_pawn_material(strongerSide) == VALUE_ZERO);
assert(pos.non_pawn_material(weakerSide) == VALUE_ZERO);
- assert(pos.piece_count(strongerSide, PAWN) == 1);
- assert(pos.piece_count(weakerSide, PAWN) == 0);
+ assert(pos.count<PAWN>(strongerSide) == 1);
+ assert(pos.count<PAWN>(weakerSide ) == 0);
Square wksq, bksq, wpsq;
Color us;
{
wksq = pos.king_square(WHITE);
bksq = pos.king_square(BLACK);
- wpsq = pos.piece_list(WHITE, PAWN)[0];
+ wpsq = pos.list<PAWN>(WHITE)[0];
us = pos.side_to_move();
}
else
{
wksq = ~pos.king_square(BLACK);
bksq = ~pos.king_square(WHITE);
- wpsq = ~pos.piece_list(BLACK, PAWN)[0];
+ wpsq = ~pos.list<PAWN>(BLACK)[0];
us = ~pos.side_to_move();
}
Value Endgame<KRKP>::operator()(const Position& pos) const {
assert(pos.non_pawn_material(strongerSide) == RookValueMg);
- assert(pos.piece_count(strongerSide, PAWN) == 0);
assert(pos.non_pawn_material(weakerSide) == 0);
- assert(pos.piece_count(weakerSide, PAWN) == 1);
+ assert(pos.count<PAWN>(strongerSide) == 0);
+ assert(pos.count<PAWN>(weakerSide ) == 1);
Square wksq, wrsq, bksq, bpsq;
int tempo = (pos.side_to_move() == strongerSide);
wksq = pos.king_square(strongerSide);
- wrsq = pos.piece_list(strongerSide, ROOK)[0];
bksq = pos.king_square(weakerSide);
- bpsq = pos.piece_list(weakerSide, PAWN)[0];
+ wrsq = pos.list<ROOK>(strongerSide)[0];
+ bpsq = pos.list<PAWN>(weakerSide)[0];
if (strongerSide == BLACK)
{
Value Endgame<KRKB>::operator()(const Position& pos) const {
assert(pos.non_pawn_material(strongerSide) == RookValueMg);
- assert(pos.piece_count(strongerSide, PAWN) == 0);
- assert(pos.non_pawn_material(weakerSide) == BishopValueMg);
- assert(pos.piece_count(weakerSide, PAWN) == 0);
- assert(pos.piece_count(weakerSide, BISHOP) == 1);
+ assert(pos.non_pawn_material(weakerSide ) == BishopValueMg);
+ assert(pos.count<BISHOP>(weakerSide ) == 1);
+ assert(pos.count< PAWN>(weakerSide ) == 0);
+ assert(pos.count< PAWN>(strongerSide) == 0);
Value result = Value(MateTable[pos.king_square(weakerSide)]);
return strongerSide == pos.side_to_move() ? result : -result;
Value Endgame<KRKN>::operator()(const Position& pos) const {
assert(pos.non_pawn_material(strongerSide) == RookValueMg);
- assert(pos.piece_count(strongerSide, PAWN) == 0);
- assert(pos.non_pawn_material(weakerSide) == KnightValueMg);
- assert(pos.piece_count(weakerSide, PAWN) == 0);
- assert(pos.piece_count(weakerSide, KNIGHT) == 1);
+ assert(pos.non_pawn_material(weakerSide ) == KnightValueMg);
+ assert(pos.count<KNIGHT>(weakerSide ) == 1);
+ assert(pos.count< PAWN>(weakerSide ) == 0);
+ assert(pos.count< PAWN>(strongerSide) == 0);
const int penalty[8] = { 0, 10, 14, 20, 30, 42, 58, 80 };
Square bksq = pos.king_square(weakerSide);
- Square bnsq = pos.piece_list(weakerSide, KNIGHT)[0];
+ Square bnsq = pos.list<KNIGHT>(weakerSide)[0];
Value result = Value(MateTable[bksq] + penalty[square_distance(bksq, bnsq)]);
return strongerSide == pos.side_to_move() ? result : -result;
}
Value Endgame<KQKP>::operator()(const Position& pos) const {
assert(pos.non_pawn_material(strongerSide) == QueenValueMg);
- assert(pos.piece_count(strongerSide, PAWN) == 0);
- assert(pos.non_pawn_material(weakerSide) == 0);
- assert(pos.piece_count(weakerSide, PAWN) == 1);
+ assert(pos.non_pawn_material(weakerSide ) == VALUE_ZERO);
+ assert(pos.count<PAWN>(strongerSide) == 0);
+ assert(pos.count<PAWN>(weakerSide ) == 1);
Square winnerKSq = pos.king_square(strongerSide);
Square loserKSq = pos.king_square(weakerSide);
- Square pawnSq = pos.piece_list(weakerSide, PAWN)[0];
+ Square pawnSq = pos.list<PAWN>(weakerSide)[0];
Value result = QueenValueEg
- PawnValueEg
Value Endgame<KQKR>::operator()(const Position& pos) const {
assert(pos.non_pawn_material(strongerSide) == QueenValueMg);
- assert(pos.piece_count(strongerSide, PAWN) == 0);
- assert(pos.non_pawn_material(weakerSide) == RookValueMg);
- assert(pos.piece_count(weakerSide, PAWN) == 0);
+ assert(pos.non_pawn_material(weakerSide ) == RookValueMg);
+ assert(pos.count<PAWN>(strongerSide) == 0);
+ assert(pos.count<PAWN>(weakerSide ) == 0);
Square winnerKSq = pos.king_square(strongerSide);
Square loserKSq = pos.king_square(weakerSide);
template<>
Value Endgame<KBBKN>::operator()(const Position& pos) const {
- assert(pos.piece_count(strongerSide, BISHOP) == 2);
- assert(pos.non_pawn_material(strongerSide) == 2*BishopValueMg);
- assert(pos.piece_count(weakerSide, KNIGHT) == 1);
- assert(pos.non_pawn_material(weakerSide) == KnightValueMg);
+ assert(pos.non_pawn_material(strongerSide) == 2 * BishopValueMg);
+ assert(pos.non_pawn_material(weakerSide ) == KnightValueMg);
+ assert(pos.count<BISHOP>(strongerSide) == 2);
+ assert(pos.count<KNIGHT>(weakerSide ) == 1);
assert(!pos.pieces(PAWN));
Value result = BishopValueEg;
Square wksq = pos.king_square(strongerSide);
Square bksq = pos.king_square(weakerSide);
- Square nsq = pos.piece_list(weakerSide, KNIGHT)[0];
+ Square nsq = pos.list<KNIGHT>(weakerSide)[0];
// Bonus for attacking king close to defending king
result += Value(DistanceBonus[square_distance(wksq, bksq)]);
ScaleFactor Endgame<KBPsK>::operator()(const Position& pos) const {
assert(pos.non_pawn_material(strongerSide) == BishopValueMg);
- assert(pos.piece_count(strongerSide, BISHOP) == 1);
- assert(pos.piece_count(strongerSide, PAWN) >= 1);
+ assert(pos.count<BISHOP>(strongerSide) == 1);
+ assert(pos.count< PAWN>(strongerSide) >= 1);
// No assertions about the material of weakerSide, because we want draws to
// be detected even when the weaker side has some pawns.
Bitboard pawns = pos.pieces(strongerSide, PAWN);
- File pawnFile = file_of(pos.piece_list(strongerSide, PAWN)[0]);
+ File pawnFile = file_of(pos.list<PAWN>(strongerSide)[0]);
// All pawns are on a single rook file ?
if ( (pawnFile == FILE_A || pawnFile == FILE_H)
&& !(pawns & ~file_bb(pawnFile)))
{
- Square bishopSq = pos.piece_list(strongerSide, BISHOP)[0];
+ Square bishopSq = pos.list<BISHOP>(strongerSide)[0];
Square queeningSq = relative_square(strongerSide, pawnFile | RANK_8);
Square kingSq = pos.king_square(weakerSide);
if ( (pawnFile == FILE_B || pawnFile == FILE_G)
&& !(pos.pieces(PAWN) & ~file_bb(pawnFile))
&& pos.non_pawn_material(weakerSide) == 0
- && pos.piece_count(weakerSide, PAWN) >= 1)
+ && pos.count<PAWN>(weakerSide) >= 1)
{
// Get weaker pawn closest to opponent's queening square
Bitboard wkPawns = pos.pieces(weakerSide, PAWN);
Square strongerKingSq = pos.king_square(strongerSide);
Square weakerKingSq = pos.king_square(weakerSide);
- Square bishopSq = pos.piece_list(strongerSide, BISHOP)[0];
+ Square bishopSq = pos.list<BISHOP>(strongerSide)[0];
// Draw if weaker pawn is on rank 7, bishop can't attack the pawn, and
// weaker king can stop opposing opponent's king from penetrating.
ScaleFactor Endgame<KQKRPs>::operator()(const Position& pos) const {
assert(pos.non_pawn_material(strongerSide) == QueenValueMg);
- assert(pos.piece_count(strongerSide, QUEEN) == 1);
- assert(pos.piece_count(strongerSide, PAWN) == 0);
- assert(pos.piece_count(weakerSide, ROOK) == 1);
- assert(pos.piece_count(weakerSide, PAWN) >= 1);
+ assert(pos.count<QUEEN>(strongerSide) == 1);
+ assert(pos.count< PAWN>(strongerSide) == 0);
+ assert(pos.count< ROOK>(weakerSide ) == 1);
+ assert(pos.count< PAWN>(weakerSide ) >= 1);
Square kingSq = pos.king_square(weakerSide);
- if ( relative_rank(weakerSide, kingSq) <= RANK_2
- && relative_rank(weakerSide, pos.king_square(strongerSide)) >= RANK_4
+ if ( relative_rank(weakerSide, kingSq) <= RANK_2
+ && relative_rank(weakerSide, pos.king_square(strongerSide)) >= RANK_4
&& (pos.pieces(weakerSide, ROOK) & rank_bb(relative_rank(weakerSide, RANK_3)))
&& (pos.pieces(weakerSide, PAWN) & rank_bb(relative_rank(weakerSide, RANK_2)))
&& (pos.attacks_from<KING>(kingSq) & pos.pieces(weakerSide, PAWN)))
{
- Square rsq = pos.piece_list(weakerSide, ROOK)[0];
+ Square rsq = pos.list<ROOK>(weakerSide)[0];
if (pos.attacks_from<PAWN>(rsq, strongerSide) & pos.pieces(weakerSide, PAWN))
return SCALE_FACTOR_DRAW;
}
ScaleFactor Endgame<KRPKR>::operator()(const Position& pos) const {
assert(pos.non_pawn_material(strongerSide) == RookValueMg);
- assert(pos.piece_count(strongerSide, PAWN) == 1);
- assert(pos.non_pawn_material(weakerSide) == RookValueMg);
- assert(pos.piece_count(weakerSide, PAWN) == 0);
+ assert(pos.non_pawn_material(weakerSide) == RookValueMg);
+ assert(pos.count<PAWN>(strongerSide) == 1);
+ assert(pos.count<PAWN>(weakerSide ) == 0);
Square wksq = pos.king_square(strongerSide);
- Square wrsq = pos.piece_list(strongerSide, ROOK)[0];
- Square wpsq = pos.piece_list(strongerSide, PAWN)[0];
Square bksq = pos.king_square(weakerSide);
- Square brsq = pos.piece_list(weakerSide, ROOK)[0];
+ Square wrsq = pos.list<ROOK>(strongerSide)[0];
+ Square wpsq = pos.list<PAWN>(strongerSide)[0];
+ Square brsq = pos.list<ROOK>(weakerSide)[0];
// Orient the board in such a way that the stronger side is white, and the
// pawn is on the left half of the board.
ScaleFactor Endgame<KRPPKRP>::operator()(const Position& pos) const {
assert(pos.non_pawn_material(strongerSide) == RookValueMg);
- assert(pos.piece_count(strongerSide, PAWN) == 2);
- assert(pos.non_pawn_material(weakerSide) == RookValueMg);
- assert(pos.piece_count(weakerSide, PAWN) == 1);
+ assert(pos.non_pawn_material(weakerSide) == RookValueMg);
+ assert(pos.count<PAWN>(strongerSide) == 2);
+ assert(pos.count<PAWN>(weakerSide ) == 1);
- Square wpsq1 = pos.piece_list(strongerSide, PAWN)[0];
- Square wpsq2 = pos.piece_list(strongerSide, PAWN)[1];
+ Square wpsq1 = pos.list<PAWN>(strongerSide)[0];
+ Square wpsq2 = pos.list<PAWN>(strongerSide)[1];
Square bksq = pos.king_square(weakerSide);
// Does the stronger side have a passed pawn?
ScaleFactor Endgame<KPsK>::operator()(const Position& pos) const {
assert(pos.non_pawn_material(strongerSide) == VALUE_ZERO);
- assert(pos.piece_count(strongerSide, PAWN) >= 2);
- assert(pos.non_pawn_material(weakerSide) == VALUE_ZERO);
- assert(pos.piece_count(weakerSide, PAWN) == 0);
+ assert(pos.non_pawn_material(weakerSide) == VALUE_ZERO);
+ assert(pos.count<PAWN>(strongerSide) >= 2);
+ assert(pos.count<PAWN>(weakerSide ) == 0);
Square ksq = pos.king_square(weakerSide);
Bitboard pawns = pos.pieces(strongerSide, PAWN);
ScaleFactor Endgame<KBPKB>::operator()(const Position& pos) const {
assert(pos.non_pawn_material(strongerSide) == BishopValueMg);
- assert(pos.piece_count(strongerSide, BISHOP) == 1);
- assert(pos.piece_count(strongerSide, PAWN) == 1);
- assert(pos.non_pawn_material(weakerSide) == BishopValueMg);
- assert(pos.piece_count(weakerSide, BISHOP) == 1);
- assert(pos.piece_count(weakerSide, PAWN) == 0);
-
- Square pawnSq = pos.piece_list(strongerSide, PAWN)[0];
- Square strongerBishopSq = pos.piece_list(strongerSide, BISHOP)[0];
- Square weakerBishopSq = pos.piece_list(weakerSide, BISHOP)[0];
+ assert(pos.non_pawn_material(weakerSide ) == BishopValueMg);
+ assert(pos.count<BISHOP>(strongerSide) == 1);
+ assert(pos.count<BISHOP>(weakerSide ) == 1);
+ assert(pos.count< PAWN>(strongerSide) == 1);
+ assert(pos.count< PAWN>(weakerSide ) == 0);
+
+ Square pawnSq = pos.list<PAWN>(strongerSide)[0];
+ Square strongerBishopSq = pos.list<BISHOP>(strongerSide)[0];
+ Square weakerBishopSq = pos.list<BISHOP>(weakerSide)[0];
Square weakerKingSq = pos.king_square(weakerSide);
// Case 1: Defending king blocks the pawn, and cannot be driven away
ScaleFactor Endgame<KBPPKB>::operator()(const Position& pos) const {
assert(pos.non_pawn_material(strongerSide) == BishopValueMg);
- assert(pos.piece_count(strongerSide, BISHOP) == 1);
- assert(pos.piece_count(strongerSide, PAWN) == 2);
- assert(pos.non_pawn_material(weakerSide) == BishopValueMg);
- assert(pos.piece_count(weakerSide, BISHOP) == 1);
- assert(pos.piece_count(weakerSide, PAWN) == 0);
+ assert(pos.non_pawn_material(weakerSide ) == BishopValueMg);
+ assert(pos.count<BISHOP>(strongerSide) == 1);
+ assert(pos.count<BISHOP>(weakerSide ) == 1);
+ assert(pos.count< PAWN>(strongerSide) == 2);
+ assert(pos.count< PAWN>(weakerSide ) == 0);
- Square wbsq = pos.piece_list(strongerSide, BISHOP)[0];
- Square bbsq = pos.piece_list(weakerSide, BISHOP)[0];
+ Square wbsq = pos.list<BISHOP>(strongerSide)[0];
+ Square bbsq = pos.list<BISHOP>(weakerSide)[0];
if (!opposite_colors(wbsq, bbsq))
return SCALE_FACTOR_NONE;
Square ksq = pos.king_square(weakerSide);
- Square psq1 = pos.piece_list(strongerSide, PAWN)[0];
- Square psq2 = pos.piece_list(strongerSide, PAWN)[1];
+ Square psq1 = pos.list<PAWN>(strongerSide)[0];
+ Square psq2 = pos.list<PAWN>(strongerSide)[1];
Rank r1 = rank_of(psq1);
Rank r2 = rank_of(psq2);
Square blockSq1, blockSq2;
ScaleFactor Endgame<KBPKN>::operator()(const Position& pos) const {
assert(pos.non_pawn_material(strongerSide) == BishopValueMg);
- assert(pos.piece_count(strongerSide, BISHOP) == 1);
- assert(pos.piece_count(strongerSide, PAWN) == 1);
- assert(pos.non_pawn_material(weakerSide) == KnightValueMg);
- assert(pos.piece_count(weakerSide, KNIGHT) == 1);
- assert(pos.piece_count(weakerSide, PAWN) == 0);
-
- Square pawnSq = pos.piece_list(strongerSide, PAWN)[0];
- Square strongerBishopSq = pos.piece_list(strongerSide, BISHOP)[0];
+ assert(pos.non_pawn_material(weakerSide ) == KnightValueMg);
+ assert(pos.count<BISHOP>(strongerSide) == 1);
+ assert(pos.count<KNIGHT>(weakerSide ) == 1);
+ assert(pos.count< PAWN>(strongerSide) == 1);
+ assert(pos.count< PAWN>(weakerSide ) == 0);
+
+ Square pawnSq = pos.list<PAWN>(strongerSide)[0];
+ Square strongerBishopSq = pos.list<BISHOP>(strongerSide)[0];
Square weakerKingSq = pos.king_square(weakerSide);
if ( file_of(weakerKingSq) == file_of(pawnSq)
ScaleFactor Endgame<KNPK>::operator()(const Position& pos) const {
assert(pos.non_pawn_material(strongerSide) == KnightValueMg);
- assert(pos.piece_count(strongerSide, KNIGHT) == 1);
- assert(pos.piece_count(strongerSide, PAWN) == 1);
- assert(pos.non_pawn_material(weakerSide) == VALUE_ZERO);
- assert(pos.piece_count(weakerSide, PAWN) == 0);
+ assert(pos.non_pawn_material(weakerSide ) == VALUE_ZERO);
+ assert(pos.count<KNIGHT>(strongerSide) == 1);
+ assert(pos.count< PAWN>(strongerSide) == 1);
+ assert(pos.count< PAWN>(weakerSide ) == 0);
- Square pawnSq = pos.piece_list(strongerSide, PAWN)[0];
+ Square pawnSq = pos.list<PAWN>(strongerSide)[0];
Square weakerKingSq = pos.king_square(weakerSide);
if ( pawnSq == relative_square(strongerSide, SQ_A7)
template<>
ScaleFactor Endgame<KNPKB>::operator()(const Position& pos) const {
- Square pawnSq = pos.piece_list(strongerSide, PAWN)[0];
- Square bishopSq = pos.piece_list(weakerSide, BISHOP)[0];
+ Square pawnSq = pos.list<PAWN>(strongerSide)[0];
+ Square bishopSq = pos.list<BISHOP>(weakerSide)[0];
Square weakerKingSq = pos.king_square(weakerSide);
// King needs to get close to promoting pawn to prevent knight from blocking.
ScaleFactor Endgame<KPKP>::operator()(const Position& pos) const {
assert(pos.non_pawn_material(strongerSide) == VALUE_ZERO);
- assert(pos.non_pawn_material(weakerSide) == VALUE_ZERO);
- assert(pos.piece_count(WHITE, PAWN) == 1);
- assert(pos.piece_count(BLACK, PAWN) == 1);
+ assert(pos.non_pawn_material(weakerSide ) == VALUE_ZERO);
+ assert(pos.count<PAWN>(WHITE) == 1);
+ assert(pos.count<PAWN>(BLACK) == 1);
Square wksq = pos.king_square(strongerSide);
Square bksq = pos.king_square(weakerSide);
- Square wpsq = pos.piece_list(strongerSide, PAWN)[0];
+ Square wpsq = pos.list<PAWN>(strongerSide)[0];
Color us = pos.side_to_move();
if (strongerSide == BLACK)
// Helper templates used to detect a given material distribution
template<Color Us> bool is_KXK(const Position& pos) {
const Color Them = (Us == WHITE ? BLACK : WHITE);
- return pos.non_pawn_material(Them) == VALUE_ZERO
- && pos.piece_count(Them, PAWN) == 0
- && pos.non_pawn_material(Us) >= RookValueMg;
+ return !pos.count<PAWN>(Them)
+ && pos.non_pawn_material(Them) == VALUE_ZERO
+ && pos.non_pawn_material(Us) >= RookValueMg;
}
template<Color Us> bool is_KBPsKs(const Position& pos) {
- return pos.non_pawn_material(Us) == BishopValueMg
- && pos.piece_count(Us, BISHOP) == 1
- && pos.piece_count(Us, PAWN) >= 1;
+ return pos.non_pawn_material(Us) == BishopValueMg
+ && pos.count<BISHOP>(Us) == 1
+ && pos.count<PAWN >(Us) >= 1;
}
template<Color Us> bool is_KQKRPs(const Position& pos) {
const Color Them = (Us == WHITE ? BLACK : WHITE);
- return pos.piece_count(Us, PAWN) == 0
- && pos.non_pawn_material(Us) == QueenValueMg
- && pos.piece_count(Us, QUEEN) == 1
- && pos.piece_count(Them, ROOK) == 1
- && pos.piece_count(Them, PAWN) >= 1;
+ return !pos.count<PAWN>(Us)
+ && pos.non_pawn_material(Us) == QueenValueMg
+ && pos.count<QUEEN>(Us) == 1
+ && pos.count<ROOK>(Them) == 1
+ && pos.count<PAWN>(Them) >= 1;
}
/// imbalance() calculates imbalance comparing piece count of each
assert((pos.pieces(WHITE, KNIGHT) | pos.pieces(WHITE, BISHOP)));
assert((pos.pieces(BLACK, KNIGHT) | pos.pieces(BLACK, BISHOP)));
- if ( pos.piece_count(WHITE, BISHOP) + pos.piece_count(WHITE, KNIGHT) <= 2
- && pos.piece_count(BLACK, BISHOP) + pos.piece_count(BLACK, KNIGHT) <= 2)
+ if ( pos.count<BISHOP>(WHITE) + pos.count<KNIGHT>(WHITE) <= 2
+ && pos.count<BISHOP>(BLACK) + pos.count<KNIGHT>(BLACK) <= 2)
{
e->evaluationFunction = &EvaluateKmmKm[pos.side_to_move()];
return e;
if (npm_w + npm_b == VALUE_ZERO)
{
- if (pos.piece_count(BLACK, PAWN) == 0)
+ if (!pos.count<PAWN>(BLACK))
{
- assert(pos.piece_count(WHITE, PAWN) >= 2);
+ assert(pos.count<PAWN>(WHITE) >= 2);
e->scalingFunction[WHITE] = &ScaleKPsK[WHITE];
}
- else if (pos.piece_count(WHITE, PAWN) == 0)
+ else if (!pos.count<PAWN>(WHITE))
{
- assert(pos.piece_count(BLACK, PAWN) >= 2);
+ assert(pos.count<PAWN>(BLACK) >= 2);
e->scalingFunction[BLACK] = &ScaleKPsK[BLACK];
}
- else if (pos.piece_count(WHITE, PAWN) == 1 && pos.piece_count(BLACK, PAWN) == 1)
+ else if (pos.count<PAWN>(WHITE) == 1 && pos.count<PAWN>(BLACK) == 1)
{
// This is a special case because we set scaling functions
// for both colors instead of only one.
}
// No pawns makes it difficult to win, even with a material advantage
- if (pos.piece_count(WHITE, PAWN) == 0 && npm_w - npm_b <= BishopValueMg)
+ if (!pos.count<PAWN>(WHITE) && npm_w - npm_b <= BishopValueMg)
{
e->factor[WHITE] = (uint8_t)
- (npm_w == npm_b || npm_w < RookValueMg ? 0 : NoPawnsSF[std::min(pos.piece_count(WHITE, BISHOP), 2)]);
+ (npm_w == npm_b || npm_w < RookValueMg ? 0 : NoPawnsSF[std::min(pos.count<BISHOP>(WHITE), 2)]);
}
- if (pos.piece_count(BLACK, PAWN) == 0 && npm_b - npm_w <= BishopValueMg)
+ if (!pos.count<PAWN>(BLACK) && npm_b - npm_w <= BishopValueMg)
{
e->factor[BLACK] = (uint8_t)
- (npm_w == npm_b || npm_b < RookValueMg ? 0 : NoPawnsSF[std::min(pos.piece_count(BLACK, BISHOP), 2)]);
+ (npm_w == npm_b || npm_b < RookValueMg ? 0 : NoPawnsSF[std::min(pos.count<BISHOP>(BLACK), 2)]);
}
// Compute the space weight
if (npm_w + npm_b >= 2 * QueenValueMg + 4 * RookValueMg + 2 * KnightValueMg)
{
- int minorPieceCount = pos.piece_count(WHITE, KNIGHT) + pos.piece_count(WHITE, BISHOP)
- + pos.piece_count(BLACK, KNIGHT) + pos.piece_count(BLACK, BISHOP);
+ int minorPieceCount = pos.count<KNIGHT>(WHITE) + pos.count<BISHOP>(WHITE)
+ + pos.count<KNIGHT>(BLACK) + pos.count<BISHOP>(BLACK);
e->spaceWeight = minorPieceCount * minorPieceCount;
}
// for the bishop pair "extended piece", this allow us to be more flexible
// in defining bishop pair bonuses.
const int pieceCount[COLOR_NB][PIECE_TYPE_NB] = {
- { pos.piece_count(WHITE, BISHOP) > 1, pos.piece_count(WHITE, PAWN), pos.piece_count(WHITE, KNIGHT),
- pos.piece_count(WHITE, BISHOP) , pos.piece_count(WHITE, ROOK), pos.piece_count(WHITE, QUEEN) },
- { pos.piece_count(BLACK, BISHOP) > 1, pos.piece_count(BLACK, PAWN), pos.piece_count(BLACK, KNIGHT),
- pos.piece_count(BLACK, BISHOP) , pos.piece_count(BLACK, ROOK), pos.piece_count(BLACK, QUEEN) } };
+ { pos.count<BISHOP>(WHITE) > 1, pos.count<PAWN>(WHITE), pos.count<KNIGHT>(WHITE),
+ pos.count<BISHOP>(WHITE) , pos.count<ROOK>(WHITE), pos.count<QUEEN >(WHITE) },
+ { pos.count<BISHOP>(BLACK) > 1, pos.count<PAWN>(BLACK), pos.count<KNIGHT>(BLACK),
+ pos.count<BISHOP>(BLACK) , pos.count<ROOK>(BLACK), pos.count<QUEEN >(BLACK) } };
e->value = (int16_t)((imbalance<WHITE>(pieceCount) - imbalance<BLACK>(pieceCount)) / 16);
return e;