[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>
|
// 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,
|
bishop::ClassicalMoveGenerator as BishopMoveGenerator, king::KingMoveGenerator,
|
||||||
knight::KnightMoveGenerator, move_set::MoveSet, pawn::PawnMoveGenerator,
|
knight::KnightMoveGenerator, pawn::PawnMoveGenerator,
|
||||||
queen::ClassicalMoveGenerator as QueenMoveGenerator,
|
queen::ClassicalMoveGenerator as QueenMoveGenerator,
|
||||||
rook::ClassicalMoveGenerator as RookMoveGenerator,
|
rook::ClassicalMoveGenerator as RookMoveGenerator,
|
||||||
};
|
};
|
||||||
use crate::{Move, Position};
|
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)]
|
#[derive(Clone, Debug, Eq, PartialEq)]
|
||||||
pub struct Moves {
|
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