[board] Implement a PositionBuilder; refactor piece bitboards into a PieceBitBoards struct

This makes Position immutable, even if declared mut. I think this will also make
it easier to build positions going forward.

Moving to a PieceBitBoards struct also required a lot of places that return owned
BitBoards to return refs. This is basically fine except for adding a few more &
here and there.

This was a huge refactoring project. All the move generators and a bunch of
BitBoard stuff needed to be updated.
This commit is contained in:
Eryn Wells 2024-01-19 18:08:41 -08:00
parent 939fac80d7
commit 24cce95a88
17 changed files with 472 additions and 381 deletions

View file

@ -76,23 +76,18 @@ impl<'pos> MoveGeneratorInternal for KingMoveGenerator<'pos> {
#[cfg(test)]
mod tests {
use super::*;
use crate::{piece, piece::Piece, Position, Square};
use crate::Square;
use std::collections::HashSet;
#[test]
fn one_king() {
let mut pos = Position::empty();
pos.place_piece(Piece::king(Color::White), Square::E4)
.expect("Failed to place king on e4");
let pos = position![White King on E4];
let generator = KingMoveGenerator::new(&pos, Color::White);
let bb = generator.bitboard();
assert_eq!(
bb,
BitBoard::new(
0b00000000_00000000_00000000_00111000_00101000_00111000_00000000_00000000
)
generator.bitboard(),
bitboard![E5, F5, F4, F3, E3, D3, D4, D5]
);
let expected_moves = [
@ -125,18 +120,16 @@ mod tests {
#[test]
fn one_king_corner() {
let mut pos = Position::empty();
pos.place_piece(Piece::king(Color::White), Square::A1)
.expect("Failed to place king on a1");
let pos = position![White King on A1];
let generator = KingMoveGenerator::new(&pos, Color::White);
let bb = generator.bitboard();
let generated_bitboard = generator.bitboard();
let expected_bitboard = bitboard![A2, B2, B1];
assert_eq!(
bb,
BitBoard::new(
0b00000000_00000000_00000000_00000000_00000000_00000000_00000011_00000010
)
generator.bitboard(),
bitboard![A2, B2, B1],
"Generated:\n{generated_bitboard}\nExpected:\n{expected_bitboard}"
);
let expected_moves = [