This commit is contained in:
Eryn Wells 2025-05-08 17:37:51 -07:00
parent d5cdf273c8
commit 091cc99cb3
42 changed files with 805 additions and 1662 deletions

View file

@ -1,8 +1,10 @@
// Eryn Wells <eryn@erynwells.me>
use chessfriend_core::Square;
macro_rules! bit_scanner {
($name:ident) => {
pub(crate) struct $name {
pub struct $name {
bits: u64,
shift: usize,
}
@ -18,8 +20,15 @@ macro_rules! bit_scanner {
bit_scanner!(LeadingBitScanner);
bit_scanner!(TrailingBitScanner);
fn _index_to_square(index: usize) -> Square {
unsafe {
#[allow(clippy::cast_possible_truncation)]
Square::from_index_unchecked(index as u8)
}
}
impl Iterator for LeadingBitScanner {
type Item = usize;
type Item = Square;
fn next(&mut self) -> Option<Self::Item> {
let u64bits = u64::BITS as usize;
@ -40,12 +49,12 @@ impl Iterator for LeadingBitScanner {
// Shift 1 additional place to account for the 1 that `leading_zeros` found.
self.shift += leading_zeros + 1;
Some(position)
Some(_index_to_square(position))
}
}
impl Iterator for TrailingBitScanner {
type Item = usize;
type Item = Square;
fn next(&mut self) -> Option<Self::Item> {
let u64bits = u64::BITS as usize;
@ -66,7 +75,7 @@ impl Iterator for TrailingBitScanner {
// Shift 1 additional place to account for the 1 that `leading_zeros` found.
self.shift += trailing_zeros + 1;
Some(position)
Some(_index_to_square(position))
}
}
@ -83,17 +92,17 @@ mod tests {
#[test]
fn leading_one() {
let mut scanner = LeadingBitScanner::new(1);
assert_eq!(scanner.next(), Some(0));
assert_eq!(scanner.next(), Some(Square::A1));
assert_eq!(scanner.next(), None);
}
#[test]
fn leading_complex() {
let mut scanner = LeadingBitScanner::new(0b_1100_0101);
assert_eq!(scanner.next(), Some(7));
assert_eq!(scanner.next(), Some(6));
assert_eq!(scanner.next(), Some(2));
assert_eq!(scanner.next(), Some(0));
assert_eq!(scanner.next(), Some(Square::H1));
assert_eq!(scanner.next(), Some(Square::G1));
assert_eq!(scanner.next(), Some(Square::C1));
assert_eq!(scanner.next(), Some(Square::A1));
assert_eq!(scanner.next(), None);
}
@ -106,17 +115,17 @@ mod tests {
#[test]
fn trailing_one() {
let mut scanner = TrailingBitScanner::new(1);
assert_eq!(scanner.next(), Some(0));
assert_eq!(scanner.next(), Some(Square::A1));
assert_eq!(scanner.next(), None);
}
#[test]
fn trailing_complex() {
let mut scanner = TrailingBitScanner::new(0b_1100_0101);
assert_eq!(scanner.next(), Some(0));
assert_eq!(scanner.next(), Some(2));
assert_eq!(scanner.next(), Some(6));
assert_eq!(scanner.next(), Some(7));
assert_eq!(scanner.next(), Some(Square::A1));
assert_eq!(scanner.next(), Some(Square::C1));
assert_eq!(scanner.next(), Some(Square::G1));
assert_eq!(scanner.next(), Some(Square::H1));
assert_eq!(scanner.next(), None);
}
}