diff --git a/board/src/move_generator/move_generator.rs b/board/src/move_generator.rs similarity index 53% rename from board/src/move_generator/move_generator.rs rename to board/src/move_generator.rs index 35292a1..2202104 100644 --- a/board/src/move_generator/move_generator.rs +++ b/board/src/move_generator.rs @@ -1,13 +1,104 @@ // Eryn Wells -use super::{ +mod bishop; +mod king; +mod knight; +mod move_set; +mod pawn; +mod queen; +mod rook; + +pub(crate) use move_set::MoveSet; + +use self::{ bishop::ClassicalMoveGenerator as BishopMoveGenerator, king::KingMoveGenerator, - knight::KnightMoveGenerator, move_set::MoveSet, pawn::PawnMoveGenerator, + knight::KnightMoveGenerator, pawn::PawnMoveGenerator, queen::ClassicalMoveGenerator as QueenMoveGenerator, rook::ClassicalMoveGenerator as RookMoveGenerator, }; use crate::{Move, Position}; -use chessfriend_core::{Color, PlacedPiece, Shape}; +use chessfriend_core::{Color, Piece, PlacedPiece, Shape, Square}; +use std::collections::BTreeMap; + +trait MoveGenerator { + fn iter(&self) -> dyn Iterator; + fn moves(&self, color: Color) -> dyn Iterator; + fn attacks(&self, color: Color) -> dyn Iterator; +} + +macro_rules! move_generator_declaration { + ($name:ident) => { + move_generator_declaration!($name, struct); + move_generator_declaration!($name, new); + move_generator_declaration!($name, getters); + }; + ($name:ident, struct) => { + #[derive(Clone, Debug, Eq, PartialEq)] + pub(super) struct $name { + color: chessfriend_core::Color, + move_sets: std::collections::BTreeMap< + chessfriend_core::Square, + $crate::move_generator::MoveSet, + >, + } + }; + ($name:ident, new) => { + impl $name { + pub(super) fn new( + position: &$crate::Position, + color: chessfriend_core::Color, + ) -> $name { + $name { + color, + move_sets: Self::move_sets(position, color), + } + } + } + }; + ($name:ident, getters) => { + impl $name { + pub(super) fn iter(&self) -> impl Iterator + '_ { + self.move_sets.values().map(|set| set.moves()).flatten() + } + + pub(crate) fn moves_for_piece( + &self, + piece: &chessfriend_core::PlacedPiece, + ) -> Option<&$crate::move_generator::move_set::MoveSet> { + self.move_sets.get(&piece.square()) + } + + fn bitboard(&self) -> chessfriend_bitboard::BitBoard { + self.move_sets.values().fold( + chessfriend_bitboard::BitBoard::empty(), + |partial, mv_set| partial | mv_set.bitboard(), + ) + } + } + }; +} + +pub(self) use move_generator_declaration; + +trait MoveGeneratorInternal { + fn piece(color: Color) -> Piece; + + fn move_sets(position: &Position, color: Color) -> BTreeMap { + let piece = Self::piece(color); + BTreeMap::from_iter( + position + .bitboard_for_piece(piece) + .occupied_squares() + .map(|sq| { + let placed_piece = PlacedPiece::new(piece, sq); + let move_set = Self::move_set_for_piece(position, placed_piece); + (sq, move_set) + }), + ) + } + + fn move_set_for_piece(position: &Position, placed_piece: PlacedPiece) -> MoveSet; +} #[derive(Clone, Debug, Eq, PartialEq)] pub struct Moves { diff --git a/board/src/move_generator/mod.rs b/board/src/move_generator/mod.rs deleted file mode 100644 index b15d2f9..0000000 --- a/board/src/move_generator/mod.rs +++ /dev/null @@ -1,97 +0,0 @@ -// Eryn Wells - -mod bishop; -mod king; -mod knight; -mod move_generator; -mod move_set; -mod pawn; -mod queen; -mod rook; - -pub use move_generator::Moves; -pub(crate) use move_set::MoveSet; - -use crate::{Move, Position}; -use chessfriend_core::{Color, Piece, PlacedPiece, Square}; -use std::collections::BTreeMap; - -trait MoveGenerator { - fn iter(&self) -> dyn Iterator; - fn moves(&self, color: Color) -> dyn Iterator; - fn attacks(&self, color: Color) -> dyn Iterator; -} - -macro_rules! move_generator_declaration { - ($name:ident) => { - move_generator_declaration!($name, struct); - move_generator_declaration!($name, new); - move_generator_declaration!($name, getters); - }; - ($name:ident, struct) => { - #[derive(Clone, Debug, Eq, PartialEq)] - pub(super) struct $name { - color: chessfriend_core::Color, - move_sets: std::collections::BTreeMap< - chessfriend_core::Square, - $crate::move_generator::MoveSet, - >, - } - }; - ($name:ident, new) => { - impl $name { - pub(super) fn new( - position: &$crate::Position, - color: chessfriend_core::Color, - ) -> $name { - $name { - color, - move_sets: Self::move_sets(position, color), - } - } - } - }; - ($name:ident, getters) => { - impl $name { - pub(super) fn iter(&self) -> impl Iterator + '_ { - self.move_sets.values().map(|set| set.moves()).flatten() - } - - pub(crate) fn moves_for_piece( - &self, - piece: &chessfriend_core::PlacedPiece, - ) -> Option<&$crate::move_generator::move_set::MoveSet> { - self.move_sets.get(&piece.square()) - } - - fn bitboard(&self) -> chessfriend_bitboard::BitBoard { - self.move_sets.values().fold( - chessfriend_bitboard::BitBoard::empty(), - |partial, mv_set| partial | mv_set.bitboard(), - ) - } - } - }; -} - -pub(self) use move_generator_declaration; - -trait MoveGeneratorInternal { - fn piece(color: Color) -> Piece; - - fn move_sets(position: &Position, color: Color) -> BTreeMap { - let piece = Self::piece(color); - BTreeMap::from_iter( - position - .bitboard_for_piece(piece) - .occupied_squares() - .map(|sq| { - let placed_piece = PlacedPiece::new(piece, sq); - let move_set = Self::move_set_for_piece(position, placed_piece); - (sq, move_set) - }), - ) - } - - fn move_set_for_piece(position: &Position, placed_piece: PlacedPiece) -> MoveSet; -}