From 1e3804027096668a46add9d2749967210bc52e68 Mon Sep 17 00:00:00 2001 From: dogeystamp Date: Sun, 20 Oct 2024 15:40:34 -0400 Subject: [PATCH] refactor: centralize conversion to signed row/column --- src/lib.rs | 5 +++++ src/movegen.rs | 46 +++++++++++++++++++++++----------------------- 2 files changed, 28 insertions(+), 23 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 0a2e1bb..cba45ad 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -187,6 +187,11 @@ impl Square { assert!(rem <= 7); (div, rem) } + fn to_row_col_signed(self) -> (isize, isize) { + //! Get row, column (signed) from index + let (r, c) = self.to_row_col(); + (r.try_into().unwrap(), c.try_into().unwrap()) + } } impl Display for Square { diff --git a/src/movegen.rs b/src/movegen.rs index 0e05e8e..1a2b788 100644 --- a/src/movegen.rs +++ b/src/movegen.rs @@ -290,7 +290,7 @@ impl FromUCIAlgebraic for Move { /// "Pseudo-legal" here means that moving into check is allowed, and capturing friendly pieces is /// allowed. These will be filtered out in the legal move generation step. pub trait PseudoMoveGen { - fn gen_pseudo_moves(self) -> impl IntoIterator; + fn gen_pseudo_moves(&self) -> impl IntoIterator; } const DIRS_STRAIGHT: [(isize, isize); 4] = [(0, 1), (1, 0), (-1, 0), (0, -1)]; @@ -346,15 +346,15 @@ fn move_slider( }; for dir in dirs { - let (mut r, mut c) = src.to_row_col(); + let (mut r, mut c) = src.to_row_col_signed(); loop { // increment - let nr = r as isize + dir.0; - let nc = c as isize + dir.1; + let nr = r + dir.0; + let nc = c + dir.1; if let Ok(dest) = Square::from_row_col_signed(nr, nc) { - r = nr as usize; - c = nc as usize; + r = nr; + c = nc; move_list.push(Move { src, @@ -378,7 +378,7 @@ fn move_slider( } impl PseudoMoveGen for BoardState { - fn gen_pseudo_moves(self) -> impl IntoIterator { + fn gen_pseudo_moves(&self) -> impl IntoIterator { let mut ret = Vec::new(); let pl = self.pl(self.turn); macro_rules! squares { @@ -387,16 +387,16 @@ impl PseudoMoveGen for BoardState { }; } for sq in squares!(Rook) { - move_slider(&self, sq, &mut ret, SliderDirection::Straight, true); + move_slider(self, sq, &mut ret, SliderDirection::Straight, true); } for sq in squares!(Bishop) { - move_slider(&self, sq, &mut ret, SliderDirection::Diagonal, true); + move_slider(self, sq, &mut ret, SliderDirection::Diagonal, true); } for sq in squares!(Queen) { - move_slider(&self, sq, &mut ret, SliderDirection::Star, true); + move_slider(self, sq, &mut ret, SliderDirection::Star, true); } for src in squares!(King) { - move_slider(&self, src, &mut ret, SliderDirection::Star, false); + move_slider(self, src, &mut ret, SliderDirection::Star, false); let (r, c) = src.to_row_col(); let rights = self.pl_castle(self.turn); let castle_sides = [(rights.k, 2, BOARD_WIDTH - 1), (rights.q, -2, 0)]; @@ -440,14 +440,14 @@ impl PseudoMoveGen for BoardState { } } for src in squares!(Pawn) { - let (r, c) = src.to_row_col(); + let (r, c) = src.to_row_col_signed(); let last_row = match self.turn { - Color::White => BOARD_HEIGHT as isize - 1, + Color::White => isize::try_from(BOARD_HEIGHT).unwrap() - 1, Color::Black => 0, }; - let nr = (r as isize) + let nr = (r) + match self.turn { Color::White => 1, Color::Black => -1, @@ -477,7 +477,7 @@ impl PseudoMoveGen for BoardState { // capture for horiz in [-1, 1] { - let nc = c as isize + horiz; + let nc = c + horiz; let dest = match Square::from_row_col_signed(nr, nc) { Ok(sq) => sq, Err(_) => continue, @@ -488,7 +488,7 @@ impl PseudoMoveGen for BoardState { } // single push - let nc = c as isize; + let nc = c; let dest = match Square::from_row_col_signed(nr, nc) { Ok(sq) => sq, Err(_) => continue, @@ -500,14 +500,14 @@ impl PseudoMoveGen for BoardState { // double push if r == match self.turn { Color::White => 1, - Color::Black => BOARD_HEIGHT - 2, + Color::Black => isize::try_from(BOARD_HEIGHT).unwrap() - 2, } { - let nr = (r as isize) + let nr = (r) + match self.turn { Color::White => 2, Color::Black => -2, }; - let nc = c as isize; + let nc = c; let dest = Square::from_row_col_signed(nr, nc) .expect("Pawn double push should have valid destination"); if self.get_piece(dest).is_none() { @@ -517,11 +517,11 @@ impl PseudoMoveGen for BoardState { } } for src in squares!(Knight) { - let (r, c) = src.to_row_col(); + let (r, c) = src.to_row_col_signed(); for dir in DIRS_KNIGHT { - let nr = r as isize + dir.0; - let nc = c as isize + dir.1; + let nr = r + dir.0; + let nc = c + dir.1; if let Ok(dest) = Square::from_row_col_signed(nr, nc) { ret.push(Move { src, @@ -537,7 +537,7 @@ impl PseudoMoveGen for BoardState { /// Legal move generation. pub trait LegalMoveGen { - fn gen_moves(self) -> impl IntoIterator; + fn gen_moves(&self) -> impl IntoIterator; } #[cfg(test)]