- template<PieceType Piece>
- int generate_piece_moves(const Position &pos, MoveStack *mlist,
- Color side, Bitboard target) {
- int n = 0;
- for (int i = 0; i < pos.piece_count(side, Piece); i++)
- {
- Square from = pos.piece_list(side, Piece, i);
- Bitboard b = pos.piece_attacks<Piece>(from) & target;
- while (b)
- {
- Square to = pop_1st_bit(&b);
- mlist[n++].move = make_move(from, to);
- }
- }
- return n;
+ // Template generate_pawn_blocking_evasions() with specializations
+ template<Color Us, Rank, Bitboard, SquareDelta>
+ MoveStack* do_generate_pawn_blocking_evasions(const Position& pos, Bitboard not_pinned,
+ Bitboard blockSquares, MoveStack* mlist);
+ template<Color>
+ inline MoveStack* generate_pawn_blocking_evasions(const Position& p, Bitboard np, Bitboard bs, MoveStack* m) {
+ return do_generate_pawn_blocking_evasions<WHITE, RANK_8, Rank3BB, DELTA_N>(p, np, bs, m);
+ }
+ template<>
+ inline MoveStack* generate_pawn_blocking_evasions<BLACK>(const Position& p, Bitboard np, Bitboard bs, MoveStack* m) {
+ return do_generate_pawn_blocking_evasions<BLACK, RANK_1, Rank6BB, DELTA_S>(p, np, bs, m);