use core::mem::transmute;
use crate::{BitBoard, File, Rank, Square};
const KING_DELTAS: [(i8, i8); 8] = [
(-1, -1),
(-1, 0),
(-1, 1),
(0, -1),
(0, 1),
(1, -1),
(1, 0),
(1, 1),
];
pub(crate) const KING_ATTACKS: [BitBoard; Square::NUM_SQUARES] = [
BitBoard(770),
BitBoard(1797),
BitBoard(3594),
BitBoard(7188),
BitBoard(14376),
BitBoard(28752),
BitBoard(57504),
BitBoard(49216),
BitBoard(197123),
BitBoard(460039),
BitBoard(920078),
BitBoard(1840156),
BitBoard(3680312),
BitBoard(7360624),
BitBoard(14721248),
BitBoard(12599488),
BitBoard(50463488),
BitBoard(117769984),
BitBoard(235539968),
BitBoard(471079936),
BitBoard(942159872),
BitBoard(1884319744),
BitBoard(3768639488),
BitBoard(3225468928),
BitBoard(12918652928),
BitBoard(30149115904),
BitBoard(60298231808),
BitBoard(120596463616),
BitBoard(241192927232),
BitBoard(482385854464),
BitBoard(964771708928),
BitBoard(825720045568),
BitBoard(3307175149568),
BitBoard(7718173671424),
BitBoard(15436347342848),
BitBoard(30872694685696),
BitBoard(61745389371392),
BitBoard(123490778742784),
BitBoard(246981557485568),
BitBoard(211384331665408),
BitBoard(846636838289408),
BitBoard(1975852459884544),
BitBoard(3951704919769088),
BitBoard(7903409839538176),
BitBoard(15806819679076352),
BitBoard(31613639358152704),
BitBoard(63227278716305408),
BitBoard(54114388906344448),
BitBoard(216739030602088448),
BitBoard(505818229730443264),
BitBoard(1011636459460886528),
BitBoard(2023272918921773056),
BitBoard(4046545837843546112),
BitBoard(8093091675687092224),
BitBoard(16186183351374184448),
BitBoard(13853283560024178688),
BitBoard(144959613005987840),
BitBoard(362258295026614272),
BitBoard(724516590053228544),
BitBoard(1449033180106457088),
BitBoard(2898066360212914176),
BitBoard(5796132720425828352),
BitBoard(11592265440851656704),
BitBoard(4665729213955833856),
];
#[inline(always)]
pub fn get_king_attacks(square: Square) -> BitBoard {
unsafe { *KING_ATTACKS.get_unchecked(square.to_index()) }
}
fn gen_king_attacks(square: Square) -> BitBoard {
let mut attacks: BitBoard = BitBoard::EMPTY;
let rank: i8 = square.rank() as i8;
let file: i8 = square.file() as i8;
for (dr, df) in KING_DELTAS.iter() {
let new_rank: i8 = rank + dr;
let new_file: i8 = file + df;
if (0..8).contains(&new_rank) && (0..8).contains(&new_file) {
let new_square: Square =
Square::from_file_rank(unsafe { transmute::<u8, File>(new_file as u8) }, unsafe {
transmute::<u8, Rank>(new_rank as u8)
});
attacks = attacks.set_square(new_square);
}
}
attacks
}
fn gen_king_attack_table() -> [BitBoard; 64] {
let mut table: [BitBoard; Square::NUM_SQUARES] = [BitBoard::EMPTY; Square::NUM_SQUARES];
for square in BitBoard::FULL {
table[square.to_index()] = gen_king_attacks(square);
}
table
}