WIP
This commit is contained in:
parent
d5cdf273c8
commit
091cc99cb3
42 changed files with 805 additions and 1662 deletions
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue