[board] Implement iter() on board
This iterator yields (Square, Piece) tuples for all pieces on the board.
This commit is contained in:
		
							parent
							
								
									f60cb8cf69
								
							
						
					
					
						commit
						724a98c2e2
					
				
					 3 changed files with 42 additions and 0 deletions
				
			
		| 
						 | 
				
			
			@ -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()
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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)),
 | 
			
		||||
            ])
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue