From 09655371d7b1cbbce83b4038f608e94fddd6829c Mon Sep 17 00:00:00 2001 From: Fabian Fichter Date: Wed, 9 Dec 2020 18:33:43 +0100 Subject: [PATCH] Refactor rider attacks --- src/bitboard.cpp | 3 ++ src/bitboard.h | 64 ++++++++++++++++++++++-------------------------------- src/types.h | 1 + 3 files changed, 30 insertions(+), 38 deletions(-) diff --git a/src/bitboard.cpp b/src/bitboard.cpp index fcdeada..8a9b725 100644 --- a/src/bitboard.cpp +++ b/src/bitboard.cpp @@ -46,6 +46,9 @@ Magic HorseMagics[SQUARE_NB]; Magic ElephantMagics[SQUARE_NB]; Magic JanggiElephantMagics[SQUARE_NB]; +Magic* magics[] = {BishopMagics, RookMagicsH, RookMagicsV, CannonMagicsH, CannonMagicsV, + HorseMagics, ElephantMagics, JanggiElephantMagics}; + namespace { #ifdef LARGEBOARDS diff --git a/src/bitboard.h b/src/bitboard.h index 5df1047..600c1dd 100644 --- a/src/bitboard.h +++ b/src/bitboard.h @@ -147,6 +147,8 @@ extern Magic HorseMagics[SQUARE_NB]; extern Magic ElephantMagics[SQUARE_NB]; extern Magic JanggiElephantMagics[SQUARE_NB]; +extern Magic* magics[]; + constexpr Bitboard make_bitboard() { return 0; } template @@ -391,6 +393,16 @@ inline Bitboard rider_attacks_bb(Square s, Bitboard occupied) { return m.attacks[m.index(occupied)]; } +inline Square lsb(Bitboard b); + +inline Bitboard rider_attacks_bb(RiderType R, Square s, Bitboard occupied) { + + assert(R == RIDER_BISHOP || R == RIDER_ROOK_H || R == RIDER_ROOK_V || R == RIDER_CANNON_H || R == RIDER_CANNON_V + || R == RIDER_HORSE || R == RIDER_ELEPHANT || R == RIDER_JANGGI_ELEPHANT); + const Magic& m = magics[lsb(R)][s]; // re-use Bitboard lsb for riders + return m.attacks[m.index(occupied)]; +} + /// attacks_bb(Square) returns the pseudo attacks of the give piece type /// assuming an empty board. @@ -422,53 +434,29 @@ inline Bitboard attacks_bb(Square s, Bitboard occupied) { } } +/// pop_rider() finds and clears a rider in a (hybrid) rider type + +inline RiderType pop_rider(RiderType* r) { + assert(*r); + const RiderType r2 = *r & ~(*r - 1); + *r &= *r - 1; + return r2; +} inline Bitboard attacks_bb(Color c, PieceType pt, Square s, Bitboard occupied) { Bitboard b = LeaperAttacks[c][pt][s]; - if (AttackRiderTypes[pt]) - { - if (AttackRiderTypes[pt] & RIDER_BISHOP) - b |= rider_attacks_bb(s, occupied); - if (AttackRiderTypes[pt] & RIDER_ROOK_H) - b |= rider_attacks_bb(s, occupied); - if (AttackRiderTypes[pt] & RIDER_ROOK_V) - b |= rider_attacks_bb(s, occupied); - if (AttackRiderTypes[pt] & RIDER_CANNON_H) - b |= rider_attacks_bb(s, occupied); - if (AttackRiderTypes[pt] & RIDER_CANNON_V) - b |= rider_attacks_bb(s, occupied); - if (AttackRiderTypes[pt] & RIDER_HORSE) - b |= rider_attacks_bb(s, occupied); - if (AttackRiderTypes[pt] & RIDER_ELEPHANT) - b |= rider_attacks_bb(s, occupied); - if (AttackRiderTypes[pt] & RIDER_JANGGI_ELEPHANT) - b |= rider_attacks_bb(s, occupied); - } + RiderType r = AttackRiderTypes[pt]; + while (r) + b |= rider_attacks_bb(pop_rider(&r), s, occupied); return b & PseudoAttacks[c][pt][s]; } inline Bitboard moves_bb(Color c, PieceType pt, Square s, Bitboard occupied) { Bitboard b = LeaperMoves[c][pt][s]; - if (MoveRiderTypes[pt]) - { - if (MoveRiderTypes[pt] & RIDER_BISHOP) - b |= rider_attacks_bb(s, occupied); - if (MoveRiderTypes[pt] & RIDER_ROOK_H) - b |= rider_attacks_bb(s, occupied); - if (MoveRiderTypes[pt] & RIDER_ROOK_V) - b |= rider_attacks_bb(s, occupied); - if (MoveRiderTypes[pt] & RIDER_CANNON_H) - b |= rider_attacks_bb(s, occupied); - if (MoveRiderTypes[pt] & RIDER_CANNON_V) - b |= rider_attacks_bb(s, occupied); - if (MoveRiderTypes[pt] & RIDER_HORSE) - b |= rider_attacks_bb(s, occupied); - if (MoveRiderTypes[pt] & RIDER_ELEPHANT) - b |= rider_attacks_bb(s, occupied); - if (MoveRiderTypes[pt] & RIDER_JANGGI_ELEPHANT) - b |= rider_attacks_bb(s, occupied); - } + RiderType r = MoveRiderTypes[pt]; + while (r) + b |= rider_attacks_bb(pop_rider(&r), s, occupied); return b & PseudoMoves[c][pt][s]; } diff --git a/src/types.h b/src/types.h index e71536e..5c27335 100644 --- a/src/types.h +++ b/src/types.h @@ -635,6 +635,7 @@ ENABLE_INCR_OPERATORS_ON(CheckCount) ENABLE_BASE_OPERATORS_ON(Score) ENABLE_BIT_OPERATORS_ON(RiderType) +ENABLE_BASE_OPERATORS_ON(RiderType) #undef ENABLE_FULL_OPERATORS_ON #undef ENABLE_INCR_OPERATORS_ON -- 1.7.0.4