[board] Implement iter() on board

This iterator yields (Square, Piece) tuples for all pieces on the board.
This commit is contained in:
Eryn Wells 2025-06-01 17:28:47 -07:00
parent f60cb8cf69
commit 724a98c2e2
3 changed files with 42 additions and 0 deletions

View file

@ -90,6 +90,10 @@ impl Board {
}
impl Board {
pub fn iter(&self) -> impl Iterator<Item = (Square, Piece)> {
self.pieces.iter()
}
/// A [`BitBoard`] of squares occupied by pieces of all colors.
pub fn occupancy(&self) -> BitBoard {
self.pieces.occpuancy()

View file

@ -60,6 +60,10 @@ impl PieceSet {
}
}
pub fn iter(&self) -> impl Iterator<Item = (Square, Piece)> {
self.mailbox.iter()
}
/// A [`BitBoard`] representing all the pieces on the board.
pub fn occpuancy(&self) -> BitBoard {
self.color_occupancy

View file

@ -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<Item = (Square, Piece)> {
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::<HashSet<_>>();
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)),
])
);
}
}