[board] Replace Moves' separate properties with a Vec of Iterators
This makes iteration easier. Move to the next iterator if the current one returns None. No tests for Moves yet though.
This commit is contained in:
parent
c2c0af20fb
commit
878d771d86
3 changed files with 44 additions and 15 deletions
|
|
@ -4,5 +4,5 @@ mod r#move;
|
||||||
mod move_generator;
|
mod move_generator;
|
||||||
mod pawn;
|
mod pawn;
|
||||||
|
|
||||||
pub use move_generator::MoveGenerator;
|
pub use move_generator::Moves;
|
||||||
pub use r#move::Move;
|
pub use r#move::Move;
|
||||||
|
|
|
||||||
|
|
@ -1,20 +1,48 @@
|
||||||
// Eryn Wells <eryn@erynwells.me>
|
// Eryn Wells <eryn@erynwells.me>
|
||||||
|
|
||||||
|
use super::pawn::PawnMoveGenerator;
|
||||||
|
use super::Move;
|
||||||
|
use crate::piece::Color;
|
||||||
use crate::Position;
|
use crate::Position;
|
||||||
|
|
||||||
use super::pawn::PawnMoveGenerator;
|
pub struct Moves<'pos> {
|
||||||
|
position: &'pos Position,
|
||||||
pub struct MoveGenerator<'a> {
|
color: Color,
|
||||||
pub(super) position: &'a Position,
|
iterators: Vec<Box<dyn Iterator<Item = Move> + 'pos>>,
|
||||||
|
index: usize,
|
||||||
pawn_move_generator: PawnMoveGenerator<'a>,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> MoveGenerator<'a> {
|
impl<'a> Moves<'a> {
|
||||||
pub fn new(position: &Position) -> MoveGenerator {
|
pub fn new(position: &Position, color: Color) -> Moves {
|
||||||
MoveGenerator {
|
Moves {
|
||||||
position,
|
position,
|
||||||
pawn_move_generator: PawnMoveGenerator::new(position),
|
color,
|
||||||
|
iterators: vec![
|
||||||
|
Box::new(PawnMoveGenerator::new(position, color)),
|
||||||
|
],
|
||||||
|
index: 0,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn current_iterator(&mut self) -> &mut Box<dyn Iterator<Item = Move> + 'a> {
|
||||||
|
&mut self.iterators[self.index]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> std::iter::Iterator for Moves<'a> {
|
||||||
|
type Item = Move;
|
||||||
|
|
||||||
|
fn next(&mut self) -> Option<Self::Item> {
|
||||||
|
if self.index >= self.iterators.len() {
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
|
||||||
|
let next_move = self.current_iterator().next();
|
||||||
|
|
||||||
|
if next_move.is_none() && self.index < self.iterators.len() {
|
||||||
|
self.index += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
next_move
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
use super::Pieces;
|
use super::Pieces;
|
||||||
use crate::bitboard::BitBoard;
|
use crate::bitboard::BitBoard;
|
||||||
use crate::moves::MoveGenerator;
|
use crate::moves::Moves;
|
||||||
use crate::piece::{Color, Piece, PiecePlacementError, PlacedPiece, Shape};
|
use crate::piece::{Color, Piece, PiecePlacementError, PlacedPiece, Shape};
|
||||||
use crate::Square;
|
use crate::Square;
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
|
|
@ -94,8 +94,8 @@ impl Position {
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn move_generator(&self) -> MoveGenerator {
|
pub fn move_generator(&self, color: Color) -> Moves {
|
||||||
MoveGenerator::new(self)
|
Moves::new(self, color)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Return a BitBoard representing the set of squares containing a piece.
|
/// Return a BitBoard representing the set of squares containing a piece.
|
||||||
|
|
@ -103,7 +103,8 @@ impl Position {
|
||||||
self.pieces_per_color[Color::White as usize] | self.pieces_per_color[Color::Black as usize]
|
self.pieces_per_color[Color::White as usize] | self.pieces_per_color[Color::Black as usize]
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Return a BitBoard representing the set of squares containing a piece. This set is the inverse of `occupied_squares`.
|
/// Return a BitBoard representing the set of squares containing a piece.
|
||||||
|
/// This set is the inverse of `occupied_squares`.
|
||||||
pub(crate) fn empty_squares(&self) -> BitBoard {
|
pub(crate) fn empty_squares(&self) -> BitBoard {
|
||||||
!(self.pieces_per_color[Color::White as usize]
|
!(self.pieces_per_color[Color::White as usize]
|
||||||
| self.pieces_per_color[Color::Black as usize])
|
| self.pieces_per_color[Color::Black as usize])
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue