- for (auto& m : *this)
- if (Type == CAPTURES)
- m.value = PieceValue[MG][pos.piece_on(to_sq(m))]
- - Value(200 * relative_rank(pos.side_to_move(), to_sq(m)));
+ Bitboard threatened, threatenedByPawn, threatenedByMinor, threatenedByRook;
+ if constexpr (Type == QUIETS)
+ {
+ Color us = pos.side_to_move();
+ // squares threatened by pawns
+ threatenedByPawn = pos.attacks_by<PAWN>(~us);
+ // squares threatened by minors or pawns
+ threatenedByMinor = pos.attacks_by<KNIGHT>(~us) | pos.attacks_by<BISHOP>(~us) | threatenedByPawn;
+ // squares threatened by rooks, minors or pawns
+ threatenedByRook = pos.attacks_by<ROOK>(~us) | threatenedByMinor;
+
+ // pieces threatened by pieces of lesser material value
+ threatened = (pos.pieces(us, QUEEN) & threatenedByRook)
+ | (pos.pieces(us, ROOK) & threatenedByMinor)
+ | (pos.pieces(us, KNIGHT, BISHOP) & threatenedByPawn);
+ }
+ else
+ {
+ // Silence unused variable warnings
+ (void) threatened;
+ (void) threatenedByPawn;
+ (void) threatenedByMinor;
+ (void) threatenedByRook;
+ }