[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:
parent
9d25414b97
commit
654e4094d9
2 changed files with 94 additions and 100 deletions
|
@ -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 {
|
|
@ -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;
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue