use std::fs::File;
use std::io::Write;
use crate::bitboard::{BitBoard, EMPTY};
use crate::file::File as ChessFile;
use crate::rank::Rank;
use crate::square::ALL_SQUARES;
static mut RANKS: [BitBoard; 8] = [EMPTY; 8];
static mut FILES: [BitBoard; 8] = [EMPTY; 8];
static mut ADJACENT_FILES: [BitBoard; 8] = [EMPTY; 8];
static mut EDGES: BitBoard = EMPTY;
pub fn gen_bitboard_data() {
unsafe {
EDGES = ALL_SQUARES
.iter()
.filter(|x| x.get_rank() == Rank::First || x.get_rank() == Rank::Eighth || x.get_file() == ChessFile::A || x.get_file() == ChessFile::H)
.fold(EMPTY, |v, s| v | BitBoard::from_square(*s));
for i in 0..8 {
RANKS[i] = ALL_SQUARES.iter().filter(|x| x.get_rank().to_index() == i).fold(EMPTY, |v, s| v | BitBoard::from_square(*s));
FILES[i] = ALL_SQUARES.iter().filter(|x| x.get_file().to_index() == i).fold(EMPTY, |v, s| v | BitBoard::from_square(*s));
ADJACENT_FILES[i] = ALL_SQUARES
.iter()
.filter(|y| ((y.get_file().to_index() as i8) == (i as i8) - 1) || ((y.get_file().to_index() as i8) == (i as i8) + 1))
.fold(EMPTY, |v, s| v | BitBoard::from_square(*s));
}
}
}
pub fn write_bitboard_data(f: &mut File) {
writeln!(f, "const FILES: [BitBoard; 8] = [").unwrap();
let fs = unsafe { FILES };
for i in &fs {
writeln!(f, " BitBoard({}),", i.0).unwrap();
}
writeln!(f, "];").unwrap();
writeln!(f, "const ADJACENT_FILES: [BitBoard; 8] = [").unwrap();
let af = unsafe { ADJACENT_FILES };
for i in &af {
writeln!(f, " BitBoard({}),", i.0).unwrap();
}
writeln!(f, "];").unwrap();
writeln!(f, "const RANKS: [BitBoard; 8] = [").unwrap();
let r = unsafe { RANKS };
for i in &r {
writeln!(f, " BitBoard({}),", i.0).unwrap();
}
writeln!(f, "];").unwrap();
writeln!(f, "/// What are all the edge squares on the `BitBoard`?").unwrap();
let e0 = unsafe { EDGES.0 };
writeln!(f, "pub const EDGES: BitBoard = BitBoard({});", e0).unwrap();
}