HooverChessUtils_PgnReader 0.9.0
Loading...
Searching...
No Matches
chessboard-movegen-by-dest.h
Go to the documentation of this file.
1// Hoover Chess Utilities / PGN reader
2// Copyright (C) 2024-2025 Sami Kiminki
3//
4// This program is free software: you can redistribute it and/or modify
5// it under the terms of the GNU General Public License as published by
6// the Free Software Foundation, either version 3 of the License, or
7// (at your option) any later version.
8//
9// This program is distributed in the hope that it will be useful,
10// but WITHOUT ANY WARRANTY; without even the implied warranty of
11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12// GNU General Public License for more details.
13//
14// You should have received a copy of the GNU General Public License
15// along with this program. If not, see <https://www.gnu.org/licenses/>.
16
17#ifndef HOOVER_CHESS_UTILS__PGN_READER__CHESSBOARD_MOVEGEN_BY_DEST_H_INCLUDED
18#define HOOVER_CHESS_UTILS__PGN_READER__CHESSBOARD_MOVEGEN_BY_DEST_H_INCLUDED
19
20#include "chessboard-movegen.h"
21
22
24{
25
26template <MoveGenType type, typename MoveStoreFn>
28 const ChessBoard &board,
29 SquareSet srcSqMask, Square dst, typename MoveStoreFn::Store &store) noexcept
30{
31 static_assert(type == MoveGenType::NO_CHECK || type == MoveGenType::CHECK);
32
33 // allowedDstSqMask optimization
34 static_assert(static_cast<std::uint8_t>(Color::WHITE) == 0U);
35 static_assert(static_cast<std::uint8_t>(Color::BLACK) == 8U);
36
37 const Color turn { board.getTurn() };
38 const SquareSet dstSqBit {
39 SquareSet { dst } & ~board.getOccupancyMask() &
40 blocksAllChecksMaskTempl<type>(board.getKingInTurn(), board.getCheckers(), dst) };
41
42 const auto pawnAdvanceShift = PawnLookups::pawnAdvanceShift(turn);
43
44 const SquareSet singleAdvancingPawnSquare {
45 (PawnLookups::singleAdvanceNoPromoLegalDstMask(turn) & dstSqBit).rotr(pawnAdvanceShift) };
46
47 const SquareSet doubleAdvancingPawnSquare {
48 (PawnLookups::rank3(turn) & singleAdvancingPawnSquare &~ board.getOccupancyMask()).rotr(pawnAdvanceShift) };
49
50 const SquareSet advancingPawn {
51 (singleAdvancingPawnSquare | doubleAdvancingPawnSquare) &
52 board.getPawns() & board.getPiecesInTurn() & srcSqMask };
53
54 if (advancingPawn != SquareSet { }) [[likely]]
55 {
56 Square src { advancingPawn.firstSquare() };
57 if (Attacks::pinCheck(src, SquareSet { dst }, board.getKingInTurn(), board.getPinnedPieces())) [[likely]]
58 {
59 MoveStoreFn::storeMove(store, Move { src, dst, MoveTypeAndPromotion::REGULAR_PAWN_MOVE });
60 }
61 }
62}
63
64template <MoveGenType type>
66{
67 Move ret { Move::illegalNoMove() };
68 generateMovesForPawnAndDestNoCaptureStoreFnTempl<type, SingleMoveStoreMoveNoDupCheckFn>(board, srcSqMask, dst, ret);
69 return ret;
70}
71
72template <MoveGenType type>
73std::size_t generateMovesForPawnAndDestNoCaptureTempl(const ChessBoard &board, ShortMoveList &moves, SquareSet srcSqMask, Square dst) noexcept
74{
75 auto i = moves.begin();
76 generateMovesForPawnAndDestNoCaptureStoreFnTempl<type, IteratorStoreMoveFn<ShortMoveList::iterator> >(
77 board, srcSqMask, dst, i);
78 return i - moves.begin();
79}
80
81template <MoveGenType type, typename MoveStoreFn>
83 const ChessBoard &board,
84 SquareSet srcSqMask, Square dst, typename MoveStoreFn::Store &store) noexcept
85{
86 static_assert(type == MoveGenType::NO_CHECK || type == MoveGenType::CHECK);
87
88 // ctPawnAttackerMasks, retractOneAdd optimization
89 static_assert(static_cast<std::uint8_t>(Color::WHITE) == 0U);
90 static_assert(static_cast<std::uint8_t>(Color::BLACK) == 8U);
91
92 const Color turn { board.getTurn() };
93
94 if (dst != board.getEpSquare()) [[likely]]
95 {
96 const SquareSet dstSqBit { dst };
97 constexpr SquareSet dstSqMask { 0x00'FF'FF'FF'FF'FF'FF'00 };
98
99 SquareSet dstOkMask {
100 (blocksAllChecksMaskTempl<type>(board.getKingInTurn(), board.getCheckers(), dst) &
101 board.getOccupancyMask() & dstSqBit & dstSqMask & ~board.getPiecesInTurn()).allIfAny() };
102
104 src,
105 dstOkMask &
106 srcSqMask & board.getPawns() & board.getPiecesInTurn() & Attacks::getPawnAttackerMask(dst, turn),
107 {
108 if (Attacks::pinCheck(src, SquareSet { dst }, board.getKingInTurn(), board.getPinnedPieces()))
109 {
110 MoveStoreFn::storeMove(store, Move { src, dst, MoveTypeAndPromotion::REGULAR_PAWN_MOVE });
111 }
112 });
113 }
114 else
115 {
117 src,
118 srcSqMask & board.getPawns() & board.getPiecesInTurn() & Attacks::getPawnAttackerMask(dst, turn),
119 {
120 if (Attacks::pinCheck(src, SquareSet { dst }, board.getKingInTurn(), board.getPinnedPieces()))
121 {
122 MoveStoreFn::storeMove(store, Move { src, board.getEpSquare(), MoveTypeAndPromotion::EN_PASSANT });
123 }
124 });
125 }
126}
127
128template <MoveGenType type>
130{
131 Move ret { Move::illegalNoMove() };
132 generateMovesForPawnAndDestCaptureStoreFnTempl<type, SingleMoveStoreMoveFn>(board, srcSqMask, dst, ret);
133 return ret;
134}
135
136template <MoveGenType type>
137std::size_t generateMovesForPawnAndDestCaptureTempl(const ChessBoard &board, ShortMoveList &moves, SquareSet srcSqMask, Square dst) noexcept
138{
139 auto i = moves.begin();
140 generateMovesForPawnAndDestCaptureStoreFnTempl<type, IteratorStoreMoveFn<ShortMoveList::iterator> >(
141 board, srcSqMask, dst, i);
142 return i - moves.begin();
143}
144
145template <MoveGenType type, typename MoveStoreFn>
147 const ChessBoard &board,
148 SquareSet srcSqMask, Square dst, Piece promo, typename MoveStoreFn::Store &store) noexcept
149{
150 static_assert(type == MoveGenType::NO_CHECK || type == MoveGenType::CHECK);
151
152 // allowedDstSqMask optimization
153 static_assert(static_cast<std::uint8_t>(Color::WHITE) == 0U);
154 static_assert(static_cast<std::uint8_t>(Color::BLACK) == 8U);
155
156 const Color turn { board.getTurn() };
157 const SquareSet dstSqBit {
158 SquareSet { dst } & ~board.getOccupancyMask() &
159 blocksAllChecksMaskTempl<type>(board.getKingInTurn(), board.getCheckers(), dst) };
160
161 // 7th or 0th rank
162 const SquareSet allowedDstSqMask { PawnLookups::rank8(turn) };
163 const auto pawnAdvanceShift = PawnLookups::pawnAdvanceShift(turn);
164
165 const SquareSet singleAdvancingPawnSquare { (allowedDstSqMask & dstSqBit).rotr(pawnAdvanceShift) };
166
167 const SquareSet advancingPawn {
168 singleAdvancingPawnSquare &
169 board.getPawns() & board.getPiecesInTurn() & srcSqMask };
170
171 if (advancingPawn != SquareSet { }) [[likely]]
172 {
173 Square src { advancingPawn.firstSquare() };
174 if (Attacks::pinCheck(src, SquareSet { dst }, board.getKingInTurn(), board.getPinnedPieces())) [[likely]]
175 {
176 MoveStoreFn::storeMove(store, Move { src, dst, pieceToTypeAndPromotion(promo) });
177 }
178 }
179}
180
181template <MoveGenType type>
183{
184 Move ret { Move::illegalNoMove() };
185 generateMovesForPawnAndDestPromoNoCaptureStoreFnTempl<type, SingleMoveStoreMoveNoDupCheckFn>(
186 board, srcSqMask, dst, promo, ret);
187 return ret;
188}
189
190template <MoveGenType type>
191std::size_t generateMovesForPawnAndDestPromoNoCaptureTempl(const ChessBoard &board, ShortMoveList &moves, SquareSet srcSqMask, Square dst, Piece promo) noexcept
192{
193 auto i = moves.begin();
194 generateMovesForPawnAndDestPromoNoCaptureStoreFnTempl<type, IteratorStoreMoveFn<ShortMoveList::iterator> >(
195 board, srcSqMask, dst, promo, i);
196 return i - moves.begin();
197}
198
199template <MoveGenType type, typename MoveStoreFn>
201 const ChessBoard &board,
202 SquareSet srcSqMask, Square dst, Piece promo, typename MoveStoreFn::Store &store) noexcept
203{
204 static_assert(type == MoveGenType::NO_CHECK || type == MoveGenType::CHECK);
205
206 const Color turn { board.getTurn() };
207
208 const SquareSet dstSqBit { dst };
209 const SquareSet dstSqMask { PawnLookups::rank8(turn) };
210
211 SquareSet dstOkMask {
212 (blocksAllChecksMaskTempl<type>(board.getKingInTurn(), board.getCheckers(), dst) &
213 board.getOccupancyMask() & dstSqBit & dstSqMask & ~board.getPiecesInTurn()).allIfAny() };
214
216 src,
217 dstOkMask &
218 srcSqMask & board.getPawns() & board.getPiecesInTurn() & Attacks::getPawnAttackerMask(dst, turn),
219 {
220 if (Attacks::pinCheck(src, SquareSet { dst }, board.getKingInTurn(), board.getPinnedPieces()))
221 {
222 MoveStoreFn::storeMove(store, Move { src, dst, pieceToTypeAndPromotion(promo) });
223 }
224 });
225}
226
227template <MoveGenType type>
229{
230 Move ret { Move::illegalNoMove() };
231 generateMovesForPawnAndDestPromoCaptureStoreFnTempl<type, SingleMoveStoreMoveFn>(
232 board, srcSqMask, dst, promo, ret);
233 return ret;
234}
235
236template <MoveGenType type>
237std::size_t generateMovesForPawnAndDestPromoCaptureTempl(const ChessBoard &board, ShortMoveList &moves, SquareSet srcSqMask, Square dst, Piece promo) noexcept
238{
239 auto i = moves.begin();
240 generateMovesForPawnAndDestPromoCaptureStoreFnTempl<type, IteratorStoreMoveFn<ShortMoveList::iterator> >(
241 board, srcSqMask, dst, promo, i);
242 return i - moves.begin();
243}
244
245template <MoveGenType type, typename MoveStoreFn>
247 const ChessBoard &board,
248 SquareSet srcSqMask, Square dst, typename MoveStoreFn::Store &store) noexcept
249{
250 static_assert(type == MoveGenType::NO_CHECK || type == MoveGenType::CHECK);
251
253 src,
254 blocksAllChecksMaskTempl<type>(board.getKingInTurn(), board.getCheckers(), dst) &
255 ((board.getPiecesInTurn() & SquareSet { dst }).allIfNone() // check for no self-capture
256 & board.getPiecesInTurn() & board.getKnights() & srcSqMask & Attacks::getKnightAttackMask(dst) &~ board.getPinnedPieces()),
257 {
258 MoveStoreFn::storeMove(store, Move { src, dst, MoveTypeAndPromotion::REGULAR_KNIGHT_MOVE });
259 });
260}
261
262template <MoveGenType type>
264{
265 Move ret { Move::illegalNoMove() };
266 generateMovesForKnightAndDestStoreFnTempl<type, SingleMoveStoreMoveFn>(board, srcSqMask, dst, ret);
267 return ret;
268}
269
270template <MoveGenType type>
271std::size_t generateMovesForKnightAndDestTempl(const ChessBoard &board, ShortMoveList &moves, SquareSet srcSqMask, Square dst) noexcept
272{
273 ShortMoveList::iterator i { moves.begin() };
274 generateMovesForKnightAndDestStoreFnTempl<type, IteratorStoreMoveFn<ShortMoveList::iterator> >(
275 board, srcSqMask, dst, i);
276 return i - moves.begin();
277}
278
279template <MoveGenType type, MoveTypeAndPromotion moveType, typename MoveStoreFn>
281 const ChessBoard &board,
282 SquareSet srcSqMask, Square dst, typename MoveStoreFn::Store &store) noexcept
283{
284 static_assert(type == MoveGenType::NO_CHECK || type == MoveGenType::CHECK);
285
286 static_assert(
287 moveType == MoveTypeAndPromotion::REGULAR_BISHOP_MOVE ||
288 moveType == MoveTypeAndPromotion::REGULAR_ROOK_MOVE ||
289 moveType == MoveTypeAndPromotion::REGULAR_QUEEN_MOVE);
290
291 SquareSet pieces;
292
293 if constexpr (moveType == MoveTypeAndPromotion::REGULAR_BISHOP_MOVE)
294 {
295 pieces = Attacks::getBishopAttackMask(dst, board.getOccupancyMask())
296 & srcSqMask & board.getPiecesInTurn() & board.getBishopsAndQueens() & (~board.getRooksAndQueens());
297 }
298 else if constexpr (moveType == MoveTypeAndPromotion::REGULAR_ROOK_MOVE)
299 {
300 pieces = Attacks::getRookAttackMask(dst, board.getOccupancyMask())
301 & srcSqMask & board.getPiecesInTurn() & (~board.getBishopsAndQueens()) & board.getRooksAndQueens();
302 }
303 else
304 {
305 static_assert(moveType == MoveTypeAndPromotion::REGULAR_QUEEN_MOVE);
306
307 pieces = Attacks::getQueenAttackMask(dst, board.getOccupancyMask())
308 & srcSqMask & board.getPiecesInTurn() & board.getBishopsAndQueens() & board.getRooksAndQueens();
309 }
310
312 src,
313 blocksAllChecksMaskTempl<type>(board.getKingInTurn(), board.getCheckers(), dst) &
314 ((board.getPiecesInTurn() & SquareSet { dst }).allIfNone() // check for no self-capture
315 & pieces),
316 {
317 if (Attacks::pinCheck(src, SquareSet { dst }, board.getKingInTurn(), board.getPinnedPieces()))
318 {
319 MoveStoreFn::storeMove(store, Move { src, dst, moveType });
320 }
321 });
322}
323
324template <MoveGenType type>
326{
327 Move ret { Move::illegalNoMove() };
329 type, MoveTypeAndPromotion::REGULAR_BISHOP_MOVE, SingleMoveStoreMoveFn>(board, srcSqMask, dst, ret);
330 return ret;
331}
332
333template <MoveGenType type>
334std::size_t generateMovesForBishopAndDestTempl(const ChessBoard &board, ShortMoveList &moves, SquareSet srcSqMask, Square dst) noexcept
335{
336 ShortMoveList::iterator i { moves.begin() };
338 type, MoveTypeAndPromotion::REGULAR_BISHOP_MOVE, IteratorStoreMoveFn<ShortMoveList::iterator> >(
339 board, srcSqMask, dst, i);
340 return i - moves.begin();
341}
342
343template <MoveGenType type>
345{
346 Move ret { Move::illegalNoMove() };
348 type, MoveTypeAndPromotion::REGULAR_ROOK_MOVE, SingleMoveStoreMoveFn>(board, srcSqMask, dst, ret);
349 return ret;
350}
351
352template <MoveGenType type>
353std::size_t generateMovesForRookAndDestTempl(const ChessBoard &board, ShortMoveList &moves, SquareSet srcSqMask, Square dst) noexcept
354{
355 ShortMoveList::iterator i { moves.begin() };
357 type, MoveTypeAndPromotion::REGULAR_ROOK_MOVE, IteratorStoreMoveFn<ShortMoveList::iterator> >(
358 board, srcSqMask, dst, i);
359 return i - moves.begin();
360}
361
362template <MoveGenType type>
364{
365 Move ret { Move::illegalNoMove() };
367 type, MoveTypeAndPromotion::REGULAR_QUEEN_MOVE, SingleMoveStoreMoveFn>(board, srcSqMask, dst, ret);
368 return ret;
369}
370
371template <MoveGenType type>
372std::size_t generateMovesForQueenAndDestTempl(const ChessBoard &board, ShortMoveList &moves, SquareSet srcSqMask, Square dst) noexcept
373{
374 ShortMoveList::iterator i { moves.begin() };
376 type, MoveTypeAndPromotion::REGULAR_QUEEN_MOVE, IteratorStoreMoveFn<ShortMoveList::iterator> >(
377 board, srcSqMask, dst, i);
378 return i - moves.begin();
379}
380
381template <MoveGenType type, typename MoveStoreFn>
383 const ChessBoard &board,
384 SquareSet srcSqMask, Square dst, typename MoveStoreFn::Store &store) noexcept
385{
386 const SquareSet dstSqBit { dst };
387 const SquareSet srcSqBit { board.getKingInTurn() };
388
389 const SquareSet kingAttackers {
390 Attacks::determineAttackers(
391 board.getOccupancyMask() & ~srcSqBit,
392 board.getPiecesInTurn() & ~srcSqBit,
393 board.getPawns(),
394 board.getKnights(),
395 board.getBishopsAndQueens(),
396 board.getRooksAndQueens(),
397 board.getKings() & ~srcSqBit,
398 dst,
399 board.getTurn()) };
400
401
402 if (((board.getPiecesInTurn() & dstSqBit).allIfNone() &
403 kingAttackers.allIfNone() &
404 srcSqMask & SquareSet { board.getKingInTurn() } & Attacks::getKingAttackMask(dst)) != SquareSet { })
405 {
406 MoveStoreFn::storeMove(store, Move { board.getKingInTurn(), dst, MoveTypeAndPromotion::REGULAR_KING_MOVE });
407 }
408}
409
410template <MoveGenType type>
412{
413 Move ret { Move::illegalNoMove() };
414 generateMovesForKingAndDestStoreFnTempl<type, SingleMoveStoreMoveFn>(
415 board, srcSqMask, dst, ret);
416 return ret;
417}
418
419template <MoveGenType type>
420std::size_t generateMovesForKingAndDestTempl(const ChessBoard &board, ShortMoveList &moves, SquareSet srcSqMask, Square dst) noexcept
421{
422 ShortMoveList::iterator i { moves.begin() };
423 generateMovesForKingAndDestStoreFnTempl<type, IteratorStoreMoveFn<ShortMoveList::iterator> >(
424 board, srcSqMask, dst, i);
425 return i - moves.begin();
426}
427
428template <MoveGenType type>
430{
431 static_assert(type == MoveGenType::NO_CHECK);
432
433 const SquareSet attackedSquares {
434 Attacks::determineAttackedSquares(
435 board.getOccupancyMask() &~ (board.getKings() & board.getPiecesInTurn()), // remove potentially attacked king
436 board.getPawns() &~ board.getPiecesInTurn(),
437 board.getKnights() &~ board.getPiecesInTurn(),
438 board.getBishopsAndQueens() &~ board.getPiecesInTurn(),
439 board.getRooksAndQueens() &~ board.getPiecesInTurn(),
440 board.getKingNotInTurn(),
441 board.getTurn()) };
442
443 Move ret { Move::illegalNoMove() };
444 generateMovesForCastlingStoreFnTempl<MoveGenType::NO_CHECK, SingleMoveStoreMoveNoDupCheckFn, false>(
445 board, attackedSquares, ret);
446 return ret;
447}
448
449template <MoveGenType type>
450std::size_t generateMovesForLongCastlingTempl(const ChessBoard &board, ShortMoveList &moves) noexcept
451{
452 static_assert(type == MoveGenType::NO_CHECK);
453
454 // long castling requested
455 ShortMoveList::iterator i { moves.begin() };
456
457 const SquareSet attackedSquares {
458 Attacks::determineAttackedSquares(
459 board.getOccupancyMask() &~ (board.getKings() & board.getPiecesInTurn()), // remove potentially attacked king
460 board.getPawns() &~ board.getPiecesInTurn(),
461 board.getKnights() &~ board.getPiecesInTurn(),
462 board.getBishopsAndQueens() &~ board.getPiecesInTurn(),
463 board.getRooksAndQueens() &~ board.getPiecesInTurn(),
464 board.getKingNotInTurn(),
465 board.getTurn()) };
466
468 MoveGenType::NO_CHECK, IteratorStoreMoveFn<ShortMoveList::iterator>, false>(board, attackedSquares, i);
469
470 return i - moves.begin();
471}
472
473template <MoveGenType type>
475{
476 static_assert(type == MoveGenType::NO_CHECK);
477
478 const SquareSet attackedSquares {
479 Attacks::determineAttackedSquares(
480 board.getOccupancyMask() &~ (board.getKings() & board.getPiecesInTurn()), // remove potentially attacked king
481 board.getPawns() &~ board.getPiecesInTurn(),
482 board.getKnights() &~ board.getPiecesInTurn(),
483 board.getBishopsAndQueens() &~ board.getPiecesInTurn(),
484 board.getRooksAndQueens() &~ board.getPiecesInTurn(),
485 board.getKingNotInTurn(),
486 board.getTurn()) };
487
488 Move ret { Move::illegalNoMove() };
489 generateMovesForCastlingStoreFnTempl<MoveGenType::NO_CHECK, SingleMoveStoreMoveNoDupCheckFn, true>(
490 board, attackedSquares, ret);
491 return ret;
492}
493
494template <MoveGenType type>
495std::size_t generateMovesForShortCastlingTempl(const ChessBoard &board, ShortMoveList &moves) noexcept
496{
497 static_assert(type == MoveGenType::NO_CHECK);
498
499 // long castling requested
500 ShortMoveList::iterator i { moves.begin() };
501
502 const SquareSet attackedSquares {
503 Attacks::determineAttackedSquares(
504 board.getOccupancyMask() &~ (board.getKings() & board.getPiecesInTurn()), // remove potentially attacked king
505 board.getPawns() &~ board.getPiecesInTurn(),
506 board.getKnights() &~ board.getPiecesInTurn(),
507 board.getBishopsAndQueens() &~ board.getPiecesInTurn(),
508 board.getRooksAndQueens() &~ board.getPiecesInTurn(),
509 board.getKingNotInTurn(),
510 board.getTurn()) };
511
513 MoveGenType::NO_CHECK, IteratorStoreMoveFn<ShortMoveList::iterator>, true>(board, attackedSquares, i);
514
515 return i - moves.begin();
516}
517
518}
519
520#endif
static SquareSet getPawnAttackerMask(Square sq, Color pawnColor) noexcept
Returns a set of squares from which a pawn can attack.
Definition bitboard-attacks.h:111
static bool pinCheck(Square src, SquareSet dstBit, Square kingSq, SquareSet pinnedPieces) noexcept
Checks whether a move by a possibly pinned piece does not expose a check.
Definition bitboard-attacks.h:359
The chessboard.
Definition chessboard.h:589
A legal move. Important: see the note!
Definition chessboard.h:198
static constexpr Move illegalNoMove() noexcept
Token for illegal move: no moves generated.
Definition chessboard.h:429
static SquareSet rank3(Color turn) noexcept
Definition pawn-lookups.h:181
static SquareSet singleAdvanceNoPromoLegalDstMask(Color turn) noexcept
Definition pawn-lookups.h:176
static std::int64_t pawnAdvanceShift(Color turn) noexcept
Definition pawn-lookups.h:191
Set of squares. Implemented using a bit-mask.
Definition chessboard-types-squareset.h:35
constexpr Square firstSquare() const noexcept
Returns the first (lowest-value) square in the set or Square::NONE if the set is empty.
Definition chessboard-types-squareset.h:105
Piece
Named piece.
Definition chessboard-types.h:204
std::array< CompactMove, 8U > ShortMoveList
Short move list returned by move generators for writing a SAN move. That is, when the piece type and ...
Definition chessboard.h:514
Color
Color of a piece or side to move.
Definition chessboard-types.h:194
Square
Named square.
Definition chessboard-types.h:122
#define SQUARESET_ENUMERATE(sq, squareSet,...)
Enumerates all squares in a square set.
Definition chessboard-types-squareset.h:623
@ REGULAR_PAWN_MOVE
Regular non-capturing or capturing move (no promotion or en passant)
@ BLACK
Black piece or black side to move.
@ WHITE
White piece or white side to move.
@ NO_CHECK
Move generator for when the king is not in check. All moves are considered.
@ CHECK
Move generator for when the king is in check (single). King moves are considered first,...
Definition chessboard-types-squareset.h:30
std::size_t generateMovesForLongCastlingTempl(const ChessBoard &board, ShortMoveList &moves) noexcept
Definition chessboard-movegen-by-dest.h:450
void generateMovesForPawnAndDestNoCaptureStoreFnTempl(const ChessBoard &board, SquareSet srcSqMask, Square dst, typename MoveStoreFn::Store &store) noexcept
Definition chessboard-movegen-by-dest.h:27
Move generateSingleMoveForRookAndDestTempl(const ChessBoard &board, SquareSet srcSqMask, Square dst) noexcept
Definition chessboard-movegen-by-dest.h:344
std::size_t generateMovesForShortCastlingTempl(const ChessBoard &board, ShortMoveList &moves) noexcept
Definition chessboard-movegen-by-dest.h:495
void generateMovesForCastlingStoreFnTempl(const ChessBoard &board, SquareSet attackedSquares, typename MoveStoreFn::Store &store) noexcept
Generates the legal castling move, if any.
Definition chessboard-movegen.h:175
Move generateSingleMoveForKingAndDestTempl(const ChessBoard &board, SquareSet srcSqMask, Square dst) noexcept
Definition chessboard-movegen-by-dest.h:411
void generateMovesForPawnAndDestPromoCaptureStoreFnTempl(const ChessBoard &board, SquareSet srcSqMask, Square dst, Piece promo, typename MoveStoreFn::Store &store) noexcept
Definition chessboard-movegen-by-dest.h:200
void generateMovesForSliderAndDestStoreFnTempl(const ChessBoard &board, SquareSet srcSqMask, Square dst, typename MoveStoreFn::Store &store) noexcept
Definition chessboard-movegen-by-dest.h:280
constexpr MoveTypeAndPromotion pieceToTypeAndPromotion(Piece promotion) noexcept
Definition chessboard-movegen.h:75
std::size_t generateMovesForKingAndDestTempl(const ChessBoard &board, ShortMoveList &moves, SquareSet srcSqMask, Square dst) noexcept
Definition chessboard-movegen-by-dest.h:420
Move generateSingleMoveForPawnAndDestCaptureTempl(const ChessBoard &board, SquareSet srcSqMask, Square dst) noexcept
Definition chessboard-movegen-by-dest.h:129
void generateMovesForPawnAndDestPromoNoCaptureStoreFnTempl(const ChessBoard &board, SquareSet srcSqMask, Square dst, Piece promo, typename MoveStoreFn::Store &store) noexcept
Definition chessboard-movegen-by-dest.h:146
Move generateSingleMoveForPawnAndDestPromoCaptureTempl(const ChessBoard &board, SquareSet srcSqMask, Square dst, Piece promo) noexcept
Definition chessboard-movegen-by-dest.h:228
std::size_t generateMovesForPawnAndDestCaptureTempl(const ChessBoard &board, ShortMoveList &moves, SquareSet srcSqMask, Square dst) noexcept
Definition chessboard-movegen-by-dest.h:137
std::size_t generateMovesForPawnAndDestPromoCaptureTempl(const ChessBoard &board, ShortMoveList &moves, SquareSet srcSqMask, Square dst, Piece promo) noexcept
Definition chessboard-movegen-by-dest.h:237
Move generateSingleMoveForPawnAndDestNoCaptureTempl(const ChessBoard &board, SquareSet srcSqMask, Square dst) noexcept
Definition chessboard-movegen-by-dest.h:65
Move generateSingleMoveForQueenAndDestTempl(const ChessBoard &board, SquareSet srcSqMask, Square dst) noexcept
Definition chessboard-movegen-by-dest.h:363
std::size_t generateMovesForRookAndDestTempl(const ChessBoard &board, ShortMoveList &moves, SquareSet srcSqMask, Square dst) noexcept
Definition chessboard-movegen-by-dest.h:353
void generateMovesForPawnAndDestCaptureStoreFnTempl(const ChessBoard &board, SquareSet srcSqMask, Square dst, typename MoveStoreFn::Store &store) noexcept
Definition chessboard-movegen-by-dest.h:82
Move generateSingleMoveForPawnAndDestPromoNoCaptureTempl(const ChessBoard &board, SquareSet srcSqMask, Square dst, Piece promo) noexcept
Definition chessboard-movegen-by-dest.h:182
Move generateSingleMoveForLongCastlingTempl(const ChessBoard &board) noexcept
Definition chessboard-movegen-by-dest.h:429
void generateMovesForKnightAndDestStoreFnTempl(const ChessBoard &board, SquareSet srcSqMask, Square dst, typename MoveStoreFn::Store &store) noexcept
Definition chessboard-movegen-by-dest.h:246
void generateMovesForKingAndDestStoreFnTempl(const ChessBoard &board, SquareSet srcSqMask, Square dst, typename MoveStoreFn::Store &store) noexcept
Definition chessboard-movegen-by-dest.h:382
std::size_t generateMovesForBishopAndDestTempl(const ChessBoard &board, ShortMoveList &moves, SquareSet srcSqMask, Square dst) noexcept
Definition chessboard-movegen-by-dest.h:334
std::size_t generateMovesForQueenAndDestTempl(const ChessBoard &board, ShortMoveList &moves, SquareSet srcSqMask, Square dst) noexcept
Definition chessboard-movegen-by-dest.h:372
Move generateSingleMoveForKnightAndDestTempl(const ChessBoard &board, SquareSet srcSqMask, Square dst) noexcept
Definition chessboard-movegen-by-dest.h:263
std::size_t generateMovesForKnightAndDestTempl(const ChessBoard &board, ShortMoveList &moves, SquareSet srcSqMask, Square dst) noexcept
Definition chessboard-movegen-by-dest.h:271
std::size_t generateMovesForPawnAndDestPromoNoCaptureTempl(const ChessBoard &board, ShortMoveList &moves, SquareSet srcSqMask, Square dst, Piece promo) noexcept
Definition chessboard-movegen-by-dest.h:191
Move generateSingleMoveForBishopAndDestTempl(const ChessBoard &board, SquareSet srcSqMask, Square dst) noexcept
Definition chessboard-movegen-by-dest.h:325
Move generateSingleMoveForShortCastlingTempl(const ChessBoard &board) noexcept
Definition chessboard-movegen-by-dest.h:474
std::size_t generateMovesForPawnAndDestNoCaptureTempl(const ChessBoard &board, ShortMoveList &moves, SquareSet srcSqMask, Square dst) noexcept
Definition chessboard-movegen-by-dest.h:73