pos_ok(): always set BUG_ON and WARN_ON
This commit is contained in:
@@ -316,11 +316,11 @@ bitboard_t pos_king_blockers(const pos_t *pos, const color_t color, const bitboa
|
||||
* - total number of pieces > 16 or zero (per color)
|
||||
* - number of kings != 1 (per color)
|
||||
* - discrepancy between board and king (per color)
|
||||
* - discrepancy between piece bitboards and ALL_PIECES bitboards (per color)
|
||||
* - discrepancy between bitboards and board (per color)
|
||||
* - side-to-move already checking opponent king
|
||||
* - side-to-move in check more than twice
|
||||
* - kings distance is 1
|
||||
* - TODO: discrepancy between piece bitboards and ALL_PIECES bitboards (per color)
|
||||
*
|
||||
* In case of errors, and @strict is true, @bug_on() is called, and program will
|
||||
* be terminated.
|
||||
@@ -328,15 +328,20 @@ bitboard_t pos_king_blockers(const pos_t *pos, const color_t color, const bitboa
|
||||
* (eg after fen parsing), and with @strict == true otherwise (as we have some data
|
||||
* corruption).
|
||||
*
|
||||
* TODO: add more checks:
|
||||
* - kings attacking each other
|
||||
*
|
||||
* @return: (if @strict is false) return true if check is ok, false otherwise.
|
||||
*/
|
||||
bool pos_ok(const pos_t *pos, const bool strict)
|
||||
{
|
||||
int n, count = 0, bbcount = 0, error = 0;
|
||||
|
||||
/* force BUG_ON and WARN_ON */
|
||||
# pragma push_macro("BUG_ON")
|
||||
# pragma push_macro("WARN_ON")
|
||||
# undef BUG_ON
|
||||
# define BUG_ON
|
||||
# undef WARN_ON
|
||||
# define WARN_ON
|
||||
|
||||
/* pawns on 1st ot 8th rank */
|
||||
error += warn_on((pos->bb[WHITE][PAWN] | pos->bb[BLACK][PAWN]) &
|
||||
(RANK_1bb | RANK_8bb));
|
||||
@@ -357,7 +362,7 @@ bool pos_ok(const pos_t *pos, const bool strict)
|
||||
}
|
||||
for (square_t sq = 0; sq < 64; ++sq) {
|
||||
piece_t piece = pos->board[sq];
|
||||
__unused bitboard_t match;
|
||||
bitboard_t match;
|
||||
if (piece == EMPTY)
|
||||
continue;
|
||||
color_t c = COLOR(piece);
|
||||
@@ -366,18 +371,22 @@ bool pos_ok(const pos_t *pos, const bool strict)
|
||||
error += warn_on(!match);
|
||||
count++;
|
||||
}
|
||||
/* occupied occupation is different from bitboards */
|
||||
/* occupied board is different from bitboards */
|
||||
error += warn_on(count != bbcount);
|
||||
/* is opponent already in check ? */
|
||||
error += warn_on(pos_checkers(pos, OPPONENT(pos->turn)));
|
||||
/* is color to play in check more than twice ? */
|
||||
error += warn_on(popcount64(pos_checkers(pos, OPPONENT(pos->turn))) > 2);
|
||||
error += warn_on(popcount64(pos_checkers(pos, pos->turn)) > 2);
|
||||
/* kings distance is less than 2 */
|
||||
error += warn_on(sq_dist(pos->king[WHITE], pos->king[BLACK]) < 2);
|
||||
|
||||
if (strict)
|
||||
if (strict) {
|
||||
bug_on(error);
|
||||
/* not reached */
|
||||
}
|
||||
return error? false: true;
|
||||
# pragma pop_macro("WARN_ON")
|
||||
# pragma pop_macro("BUG_ON")
|
||||
}
|
||||
|
||||
/**
|
||||
|
@@ -32,7 +32,7 @@ typedef struct __pos_s {
|
||||
|
||||
/* data which cannot be recovered by move_undo (like castle_rights, ...),
|
||||
* or would be expensive to recover (checkers, ...)
|
||||
* following data can be accessed either directly, either via "movesave"
|
||||
* following data can be accessed either directly, either via "state"
|
||||
* structure name.
|
||||
* For example, pos->en_passant and pos->state.en_passant are the same.
|
||||
* This allows a memcpy on this data (to save/restore position state).
|
||||
@@ -40,8 +40,8 @@ typedef struct __pos_s {
|
||||
struct_group_tagged(state_s, state,
|
||||
square_t en_passant;
|
||||
castle_rights_t castle;
|
||||
u16 clock_50;
|
||||
u16 plycount; /* plies so far, start from 1 */
|
||||
int clock_50;
|
||||
int plycount; /* plies so far, start from 1 */
|
||||
piece_t captured; /* only for move_undo */
|
||||
bitboard_t checkers; /* opponent checkers */
|
||||
bitboard_t pinners; /* opponent pinners */
|
||||
|
@@ -29,12 +29,11 @@ struct fentest {
|
||||
char *fen;
|
||||
} fentest[] = {
|
||||
/*
|
||||
{ __LINE__.
|
||||
ATTACK,
|
||||
"checkers: ",
|
||||
{ __LINE__, 1,
|
||||
"",
|
||||
""
|
||||
},
|
||||
*/
|
||||
*/
|
||||
|
||||
/* ***************** TEMP TESTS ABOVE ************************** */
|
||||
|
||||
|
Reference in New Issue
Block a user