template<RiderType R>
inline Bitboard rider_attacks_bb(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 || R == RIDER_CANNON_DIAG || R == RIDER_NIGHTRIDER
- || R == RIDER_GRASSHOPPER_H || R == RIDER_GRASSHOPPER_V || R == RIDER_GRASSHOPPER_D);
+ static_assert(R != NO_RIDER && !(R & (R - 1))); // exactly one bit
const Magic& m = R == RIDER_ROOK_H ? RookMagicsH[s]
: R == RIDER_ROOK_V ? RookMagicsV[s]
: R == RIDER_CANNON_H ? CannonMagicsH[s]
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 || R == RIDER_CANNON_DIAG || R == RIDER_NIGHTRIDER
- || R == RIDER_GRASSHOPPER_H || R == RIDER_GRASSHOPPER_V || R == RIDER_GRASSHOPPER_D);
+ assert(R != NO_RIDER && !(R & (R - 1))); // exactly one bit
const Magic& m = magics[lsb(R)][s]; // re-use Bitboard lsb for riders
return m.attacks[m.index(occupied)];
}
return Value(mg.s);
}
-#define ENABLE_BIT_OPERATORS_ON(T) \
-inline T operator~ (T d) { return (T)~(int)d; } \
-inline T operator| (T d1, T d2) { return (T)((int)d1 | (int)d2); } \
-inline T operator& (T d1, T d2) { return (T)((int)d1 & (int)d2); } \
-inline T operator^ (T d1, T d2) { return (T)((int)d1 ^ (int)d2); } \
+#define ENABLE_BIT_OPERATORS_ON(T) \
+constexpr T operator~ (T d) { return (T)~(int)d; } \
+constexpr T operator| (T d1, T d2) { return (T)((int)d1 | (int)d2); } \
+constexpr T operator& (T d1, T d2) { return (T)((int)d1 & (int)d2); } \
+constexpr T operator^ (T d1, T d2) { return (T)((int)d1 ^ (int)d2); } \
inline T& operator|= (T& d1, T d2) { return (T&)((int&)d1 |= (int)d2); } \
inline T& operator&= (T& d1, T d2) { return (T&)((int&)d1 &= (int)d2); } \
inline T& operator^= (T& d1, T d2) { return (T&)((int&)d1 ^= (int)d2); }