From 724a98c2e2887aad1f7261eb72ffa8992f086c75 Mon Sep 17 00:00:00 2001 From: Eryn Wells Date: Sun, 1 Jun 2025 17:28:47 -0700 Subject: [PATCH] [board] Implement iter() on board This iterator yields (Square, Piece) tuples for all pieces on the board. --- board/src/board.rs | 4 ++++ board/src/piece_sets.rs | 4 ++++ board/src/piece_sets/mailbox.rs | 34 +++++++++++++++++++++++++++++++++ 3 files changed, 42 insertions(+) diff --git a/board/src/board.rs b/board/src/board.rs index 9b02af6..4e3a0f6 100644 --- a/board/src/board.rs +++ b/board/src/board.rs @@ -90,6 +90,10 @@ impl Board { } impl Board { + pub fn iter(&self) -> impl Iterator { + self.pieces.iter() + } + /// A [`BitBoard`] of squares occupied by pieces of all colors. pub fn occupancy(&self) -> BitBoard { self.pieces.occpuancy() diff --git a/board/src/piece_sets.rs b/board/src/piece_sets.rs index 8db0c93..b6de5c8 100644 --- a/board/src/piece_sets.rs +++ b/board/src/piece_sets.rs @@ -60,6 +60,10 @@ impl PieceSet { } } + pub fn iter(&self) -> impl Iterator { + self.mailbox.iter() + } + /// A [`BitBoard`] representing all the pieces on the board. pub fn occpuancy(&self) -> BitBoard { self.color_occupancy diff --git a/board/src/piece_sets/mailbox.rs b/board/src/piece_sets/mailbox.rs index 9e562dd..5d73561 100644 --- a/board/src/piece_sets/mailbox.rs +++ b/board/src/piece_sets/mailbox.rs @@ -22,6 +22,13 @@ impl Mailbox { pub fn remove(&mut self, square: Square) { self.0[square as usize] = None; } + + pub fn iter(&self) -> impl Iterator { + Square::ALL + .into_iter() + .zip(self.0) + .filter_map(|(square, piece)| piece.map(|piece| (square, piece))) + } } impl Default for Mailbox { @@ -45,3 +52,30 @@ impl FromIterator<(Square, Piece)> for Mailbox { }) } } + +#[cfg(test)] +mod tests { + use super::*; + use chessfriend_core::piece; + use std::collections::HashSet; + + #[test] + fn iter_returns_all_pieces() { + let mut mailbox = Mailbox::new(); + mailbox.set(piece!(White Queen), Square::C3); + mailbox.set(piece!(White Rook), Square::H8); + mailbox.set(piece!(Black Bishop), Square::E4); + mailbox.set(piece!(Black Pawn), Square::F6); + + let pieces = mailbox.iter().collect::>(); + assert_eq!( + pieces, + HashSet::from([ + (Square::C3, piece!(White Queen)), + (Square::H8, piece!(White Rook)), + (Square::E4, piece!(Black Bishop)), + (Square::F6, piece!(Black Pawn)), + ]) + ); + } +}