From 90e33d1202051f8fa0c421758d2db8d6531d5e2c Mon Sep 17 00:00:00 2001 From: Eryn Wells Date: Sat, 13 Jul 2024 11:51:52 -0700 Subject: [PATCH] [board] Replace Pieces iterator with Mailbox::iter() Mailbox can use a standard iterator because it's just a slice. So nice! --- board/src/board.rs | 13 +++-- board/src/lib.rs | 2 - board/src/pieces.rs | 127 -------------------------------------------- 3 files changed, 10 insertions(+), 132 deletions(-) delete mode 100644 board/src/pieces.rs diff --git a/board/src/board.rs b/board/src/board.rs index f0c1192..93402dc 100644 --- a/board/src/board.rs +++ b/board/src/board.rs @@ -2,10 +2,10 @@ use crate::{ display::DiagramFormatter, piece_sets::PlacePieceError, Castle, EnPassant, Flags, PieceSet, - Pieces, }; use chessfriend_bitboard::BitBoard; use chessfriend_core::{Color, Piece, PlacedPiece, Shape, Square}; +use std::iter::Iterator; #[derive(Clone, Debug, Eq)] pub struct Board { @@ -154,8 +154,15 @@ impl Board { } #[must_use] - pub fn pieces(&self, color: Color) -> Pieces { - Pieces::new(self, color) + pub fn iter_all_pieces(&self) -> impl Iterator + '_ { + self.pieces.iter() + } + + #[must_use] + pub fn iter_pieces_of_color(&self, color: Color) -> impl Iterator + '_ { + self.pieces + .iter() + .filter(move |piece| piece.color() == color) } #[must_use] diff --git a/board/src/lib.rs b/board/src/lib.rs index 6192053..fc37d9d 100644 --- a/board/src/lib.rs +++ b/board/src/lib.rs @@ -10,7 +10,6 @@ mod display; mod flags; mod macros; mod piece_sets; -mod pieces; pub use board::Board; pub use builder::Builder; @@ -18,5 +17,4 @@ pub use builder::Builder; use castle::Castle; use en_passant::EnPassant; use flags::Flags; -use pieces::Pieces; use piece_sets::PieceSet; diff --git a/board/src/pieces.rs b/board/src/pieces.rs deleted file mode 100644 index 537db20..0000000 --- a/board/src/pieces.rs +++ /dev/null @@ -1,127 +0,0 @@ -// Eryn Wells - -use super::Board; -use chessfriend_bitboard::BitBoard; -use chessfriend_core::{Color, Piece, PlacedPiece, Shape, Square}; - -pub struct Pieces<'a> { - color: Color, - board: &'a Board, - current_shape: Option, - shape_iterator: Box>, - square_iterator: Option>>, -} - -impl<'a> Pieces<'a> { - pub(crate) fn new(board: &Board, color: Color) -> Pieces { - Pieces { - color, - board, - current_shape: None, - shape_iterator: Box::new(Shape::iter()), - square_iterator: None, - } - } -} - -impl<'a> Iterator for Pieces<'a> { - type Item = PlacedPiece; - - fn next(&mut self) -> Option { - if let Some(square_iterator) = &mut self.square_iterator { - if let (Some(square), Some(shape)) = (square_iterator.next(), self.current_shape) { - return Some(PlacedPiece::new(Piece::new(self.color, shape), square)); - } - } - - let mut current_shape: Option = None; - let mut next_nonempty_bitboard: Option<&BitBoard> = None; - - for shape in self.shape_iterator.by_ref() { - let piece = Piece::new(self.color, *shape); - - let bitboard = self.board.bitboard_for_piece(piece); - if bitboard.is_empty() { - continue; - } - - next_nonempty_bitboard = Some(bitboard); - current_shape = Some(*shape); - - break; - } - - if let (Some(bitboard), Some(shape)) = (next_nonempty_bitboard, current_shape) { - let mut square_iterator = bitboard.occupied_squares(); - - let mut next_placed_piece: Option = None; - if let Some(square) = square_iterator.next() { - next_placed_piece = Some(PlacedPiece::new(Piece::new(self.color, shape), square)); - } - - self.square_iterator = Some(Box::new(square_iterator)); - self.current_shape = Some(shape); - - return next_placed_piece; - } - - None - } -} - -#[cfg(test)] -mod tests { - use crate::{test_board, Board, Builder}; - use chessfriend_core::{piece, Color}; - use std::collections::HashSet; - - #[test] - fn empty() { - let board = Board::empty(); - let mut pieces = board.pieces(Color::White); - assert_eq!(pieces.next(), None); - } - - #[test] - fn one() { - let pos = Builder::new() - .place_piece(piece!(White Queen on E4)) - .build(); - println!("{:#?}", &pos); - - let mut pieces = pos.pieces(Color::White); - assert_eq!(pieces.next(), Some(piece!(White Queen on E4))); - assert_eq!(pieces.next(), Some(piece!(White King on E1))); - assert_eq!(pieces.next(), None); - } - - #[test] - fn multiple_pieces() { - let board = test_board![ - White Queen on E4, - White King on A1, - White Pawn on B2, - White Pawn on C2, - ]; - - let expected_placed_pieces = HashSet::from([ - piece!(White Queen on E4), - piece!(White King on A1), - piece!(White Pawn on B2), - piece!(White Pawn on C2), - ]); - - let placed_pieces = HashSet::from_iter(board.pieces(Color::White)); - - assert_eq!( - placed_pieces, - expected_placed_pieces, - "{:#?}", - placed_pieces - .symmetric_difference(&expected_placed_pieces) - .into_iter() - .map(|pp| format!("{}", pp)) - .collect::>() - ); - } -}