Should easier to read than the lsb() / msb() low
level functions.
No functional change.
-/// lsb() overload finds least significant bit relative to the given color
-inline Square lsb(Color c, Bitboard b) {
- return c == WHITE ? lsb(b) : msb(b);
-}
+/// frontmost_sq() and backmost_sq() find the square corresponding to the
+/// most/least advanced bit relative to the given color.
+
+inline Square frontmost_sq(Color c, Bitboard b) { return c == WHITE ? msb(b) : lsb(b); }
+inline Square backmost_sq(Color c, Bitboard b) { return c == WHITE ? lsb(b) : msb(b); }
#endif // #ifndef BITBOARD_H_INCLUDED
#endif // #ifndef BITBOARD_H_INCLUDED
// The bishop has the wrong color, and the defending king is on the
// file of the pawn(s) or the adjacent file. Find the rank of the
// frontmost pawn.
// The bishop has the wrong color, and the defending king is on the
// file of the pawn(s) or the adjacent file. Find the rank of the
// frontmost pawn.
- Rank rank = relative_rank(strongerSide, lsb(weakerSide, pawns));
+ Square pawnSq = frontmost_sq(strongerSide, pawns);
+
// If the defending king has distance 1 to the promotion square or
// is placed somewhere in front of the pawn, it's a draw.
if ( square_distance(kingSq, queeningSq) <= 1
// If the defending king has distance 1 to the promotion square or
// is placed somewhere in front of the pawn, it's a draw.
if ( square_distance(kingSq, queeningSq) <= 1
- || relative_rank(strongerSide, kingSq) >= rank)
+ || relative_rank(weakerSide, kingSq) <= relative_rank(weakerSide, pawnSq))
return SCALE_FACTOR_DRAW;
}
}
return SCALE_FACTOR_DRAW;
}
}
&& pos.count<PAWN>(weakerSide) >= 1)
{
// Get weakerSide pawn that is closest to home rank
&& pos.count<PAWN>(weakerSide) >= 1)
{
// Get weakerSide pawn that is closest to home rank
- Square weakerPawnSq = lsb(weakerSide, pos.pieces(weakerSide, PAWN));
+ Square weakerPawnSq = backmost_sq(weakerSide, pos.pieces(weakerSide, PAWN));
Square strongerKingSq = pos.king_square(strongerSide);
Square weakerKingSq = pos.king_square(weakerSide);
Square strongerKingSq = pos.king_square(strongerSide);
Square weakerKingSq = pos.king_square(weakerSide);
for (int f = kf - 1; f <= kf + 1; f++)
{
b = ourPawns & FileBB[f];
for (int f = kf - 1; f <= kf + 1; f++)
{
b = ourPawns & FileBB[f];
- rkUs = b ? relative_rank(Us, lsb(Us, b)) : RANK_1;
+ rkUs = b ? relative_rank(Us, backmost_sq(Us, b)) : RANK_1;
safety -= ShelterWeakness[rkUs];
b = theirPawns & FileBB[f];
safety -= ShelterWeakness[rkUs];
b = theirPawns & FileBB[f];
- rkThem = b ? relative_rank(Us, lsb(Us, b)) : RANK_1;
+ rkThem = b ? relative_rank(Us, frontmost_sq(Them, b)) : RANK_1;
safety -= StormDanger[rkUs == RANK_1 ? 0 : rkThem == rkUs + 1 ? 2 : 1][rkThem];
}
safety -= StormDanger[rkUs == RANK_1 ? 0 : rkThem == rkUs + 1 ? 2 : 1][rkThem];
}