stellar

UCI Chess engine written in C++20
git clone git://git.dimitrijedobrota.com/stellar.git
Log | Files | Refs | README | LICENSE

knight.hpp (1322B)


0 #ifndef STELLAR_ATTACK_KNIGHT_H
1 #define STELLAR_ATTACK_KNIGHT_H
3 #include "bit.hpp"
4 #include "bitboard.hpp"
5 #include "square.hpp"
6 #include "utils.hpp"
8 #include <array>
10 namespace attack {
11 namespace knight {
13 static constexpr U64 mask(const square::Square square) {
14 U64 bitboard = C64(0), attacks = C64(0), tmp;
16 bit::set(bitboard, to_underlying(square));
17 tmp = bitboard::nortOne(bitboard::nortOne(bitboard));
18 attacks |= bitboard::westOne(tmp) | bitboard::eastOne(tmp);
19 tmp = bitboard::soutOne(bitboard::soutOne(bitboard));
20 attacks |= bitboard::westOne(tmp) | bitboard::eastOne(tmp);
21 tmp = bitboard::westOne(bitboard::westOne(bitboard));
22 attacks |= bitboard::soutOne(tmp) | bitboard::nortOne(tmp);
23 tmp = bitboard::eastOne(bitboard::eastOne(bitboard));
24 attacks |= bitboard::soutOne(tmp) | bitboard::nortOne(tmp);
26 return attacks;
27 }
29 typedef std::array<U64, 64> attack_array;
30 const attack_array attacks = []() -> attack_array {
31 std::array<U64, 64> attacks;
32 for (uint8_t square = 0; square < 64; square++)
33 attacks[square] = mask(static_cast<square::Square>(square));
34 return attacks;
35 }();
37 inline constexpr U64 attack(const square::Square square, U64 occupancy) {
38 return attacks[to_underlying(square)];
39 }
41 } // namespace knight
42 } // namespace attack
44 #endif