diff --git a/board/src/move_generator/bishop.rs b/board/src/move_generator/bishop.rs index f4f7f9f..88f7631 100644 --- a/board/src/move_generator/bishop.rs +++ b/board/src/move_generator/bishop.rs @@ -48,7 +48,7 @@ impl<'pos> MoveGeneratorInternal for ClassicalMoveGenerator<'pos> { let quiet_moves_bb = all_moves & (empty_squares | !friendly_pieces); let capture_moves_bb = all_moves & opposing_pieces; - let map_to_move = |sq| MoveBuilder::new(piece, square, sq).build(); + let map_to_move = |sq| MoveBuilder::new(*piece, square, sq).build(); let quiet_moves = quiet_moves_bb.occupied_squares().map(map_to_move); let capture_moves = capture_moves_bb.occupied_squares().map(map_to_move); diff --git a/board/src/move_generator/king.rs b/board/src/move_generator/king.rs index b3500fd..06ae76e 100644 --- a/board/src/move_generator/king.rs +++ b/board/src/move_generator/king.rs @@ -56,7 +56,7 @@ impl<'pos> MoveGeneratorInternal for KingMoveGenerator<'pos> { // TODO: Handle checks. Prevent moving a king to a square attacked by a // piece of the opposite color. - let map_to_move = |sq| MoveBuilder::new(piece, square, sq).build(); + let map_to_move = |sq| MoveBuilder::new(*piece, square, sq).build(); let king_side_castle = Self::king_side_castle(position, color); let queen_side_castle = Self::queen_side_castle(position, color); diff --git a/board/src/move_generator/knight.rs b/board/src/move_generator/knight.rs index 3116b1e..50a7ad0 100644 --- a/board/src/move_generator/knight.rs +++ b/board/src/move_generator/knight.rs @@ -22,11 +22,11 @@ impl<'pos> MoveGeneratorInternal for KnightMoveGenerator<'pos> { let capture_moves_bb = knight_moves & opposing_pieces; let quiet_moves = quiet_moves_bb.occupied_squares().map(|to_sq| { - MoveBuilder::new(placed_piece.piece(), placed_piece.square(), to_sq).build() + MoveBuilder::new(*placed_piece.piece(), placed_piece.square(), to_sq).build() }); let capture_moves = capture_moves_bb.occupied_squares().map(|to_sq| { let captured_piece = position.piece_on_square(to_sq).unwrap(); - MoveBuilder::new(placed_piece.piece(), placed_piece.square(), to_sq) + MoveBuilder::new(*placed_piece.piece(), placed_piece.square(), to_sq) .capturing(captured_piece) .build() }); diff --git a/board/src/move_generator/queen.rs b/board/src/move_generator/queen.rs index e7d03b6..6694bf6 100644 --- a/board/src/move_generator/queen.rs +++ b/board/src/move_generator/queen.rs @@ -53,7 +53,7 @@ impl<'pos> MoveGeneratorInternal for ClassicalMoveGenerator<'pos> { let quiet_moves_bb = all_moves & (empty_squares | !friendly_pieces); let capture_moves_bb = all_moves & opposing_pieces; - let map_to_move = |sq| MoveBuilder::new(piece, square, sq).build(); + let map_to_move = |sq| MoveBuilder::new(*piece, square, sq).build(); let quiet_moves = quiet_moves_bb.occupied_squares().map(map_to_move); let capture_moves = capture_moves_bb.occupied_squares().map(map_to_move); diff --git a/board/src/move_generator/rook.rs b/board/src/move_generator/rook.rs index d82c22c..bd48711 100644 --- a/board/src/move_generator/rook.rs +++ b/board/src/move_generator/rook.rs @@ -49,7 +49,7 @@ impl<'pos> MoveGeneratorInternal for ClassicalMoveGenerator<'pos> { let quiet_moves_bb = all_moves & (empty_squares | !friendly_pieces); let capture_moves_bb = all_moves & opposing_pieces; - let map_to_move = |sq| MoveBuilder::new(piece, square, sq).build(); + let map_to_move = |sq| MoveBuilder::new(*piece, square, sq).build(); let quiet_moves = quiet_moves_bb.occupied_squares().map(map_to_move); let capture_moves = capture_moves_bb.occupied_squares().map(map_to_move); diff --git a/board/src/piece.rs b/board/src/piece.rs index 557f96a..fa8333d 100644 --- a/board/src/piece.rs +++ b/board/src/piece.rs @@ -244,8 +244,8 @@ impl PlacedPiece { } #[inline] - pub fn piece(&self) -> Piece { - self.piece + pub fn piece(&self) -> &Piece { + &self.piece } #[inline] diff --git a/board/src/position/piece_sets.rs b/board/src/position/piece_sets.rs index 2e97669..cd8f26d 100644 --- a/board/src/position/piece_sets.rs +++ b/board/src/position/piece_sets.rs @@ -66,11 +66,11 @@ impl PieceBitBoards { self.by_color.bitboard_mut(color) } - pub(super) fn bitboard_for_piece(&self, piece: Piece) -> &BitBoard { + pub(super) fn bitboard_for_piece(&self, piece: &Piece) -> &BitBoard { self.by_color_and_shape.bitboard_for_piece(piece) } - pub(super) fn bitboard_for_piece_mut(&mut self, piece: Piece) -> &mut BitBoard { + pub(super) fn bitboard_for_piece_mut(&mut self, piece: &Piece) -> &mut BitBoard { self.by_color_and_shape.bitboard_for_piece_mut(piece) } @@ -135,15 +135,15 @@ impl ByColor { } impl ByColorAndShape { - fn bitboard_for_piece(&self, piece: Piece) -> &BitBoard { + fn bitboard_for_piece(&self, piece: &Piece) -> &BitBoard { &self.0[piece.color() as usize][piece.shape() as usize] } - fn bitboard_for_piece_mut(&mut self, piece: Piece) -> &mut BitBoard { + fn bitboard_for_piece_mut(&mut self, piece: &Piece) -> &mut BitBoard { &mut self.0[piece.color() as usize][piece.shape() as usize] } - fn set_square(&mut self, square: Square, piece: Piece) { + fn set_square(&mut self, square: Square, piece: &Piece) { self.bitboard_for_piece_mut(piece).set_square(square); } } diff --git a/board/src/position/position.rs b/board/src/position/position.rs index 2ee5564..1c2831d 100644 --- a/board/src/position/position.rs +++ b/board/src/position/position.rs @@ -144,7 +144,7 @@ impl Position { for color in Color::iter() { for shape in Shape::iter() { let piece = Piece::new(color, *shape); - if self.pieces.bitboard_for_piece(piece).is_set(sq) { + if self.pieces.bitboard_for_piece(&piece).is_set(sq) { return Some(PlacedPiece::new(piece, sq)); } } @@ -176,7 +176,7 @@ impl Position { fn king_square(&self) -> Square { self.pieces - .bitboard_for_piece(Piece::king(self.color_to_move)) + .bitboard_for_piece(&Piece::king(self.color_to_move)) .occupied_squares() .next() .unwrap() @@ -207,6 +207,10 @@ impl Position { pub(super) fn flags(&self) -> Flags { self.flags } + + pub(super) fn piece_bitboards(&self) -> &PieceBitBoards { + &self.pieces + } } // crate methods @@ -216,7 +220,7 @@ impl Position { } pub(crate) fn bitboard_for_piece(&self, piece: Piece) -> &BitBoard { - self.pieces.bitboard_for_piece(piece) + self.pieces.bitboard_for_piece(&piece) } }