[board] Restructure the move_generator module

Move mod.rs to ../move_generator.rs. This is the new style.
Move the contents of move_generator::move_generator to the top of move_generator.
This commit is contained in:
Eryn Wells 2024-01-27 14:25:38 -08:00
parent 9d25414b97
commit 654e4094d9
2 changed files with 94 additions and 100 deletions

View file

@ -1,13 +1,104 @@
// Eryn Wells <eryn@erynwells.me>
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<Item = Move>;
fn moves(&self, color: Color) -> dyn Iterator<Item = Move>;
fn attacks(&self, color: Color) -> dyn Iterator<Item = Move>;
}
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<Item = &$crate::Move> + '_ {
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<Square, MoveSet> {
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 {

View file

@ -1,97 +0,0 @@
// Eryn Wells <eryn@erynwells.me>
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<Item = Move>;
fn moves(&self, color: Color) -> dyn Iterator<Item = Move>;
fn attacks(&self, color: Color) -> dyn Iterator<Item = Move>;
}
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<Item = &$crate::Move> + '_ {
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<Square, MoveSet> {
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;
}