[bitboard] Implement From<File>, From<Rank> for BitBoard and TryFrom<BitBoard> for Square

This commit is contained in:
Eryn Wells 2024-02-11 08:44:46 -07:00
parent 997621eea7
commit 742b00119a

View file

@ -2,7 +2,7 @@
use crate::library;
use crate::{LeadingBitScanner, TrailingBitScanner};
use chessfriend_core::{Color, Direction, Square};
use chessfriend_core::{Color, Direction, File, Rank, Square};
use std::fmt;
use std::ops::Not;
@ -158,6 +158,18 @@ impl Default for BitBoard {
}
}
impl From<File> for BitBoard {
fn from(value: File) -> Self {
library::FILES[*value.as_index() as usize]
}
}
impl From<Rank> for BitBoard {
fn from(value: Rank) -> Self {
library::FILES[*value.as_index() as usize]
}
}
impl From<Square> for BitBoard {
fn from(value: Square) -> Self {
BitBoard(1u64 << value as u32)
@ -176,6 +188,23 @@ impl FromIterator<Square> for BitBoard {
}
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum TryFromBitBoardError {
NotSingleSquare,
}
impl TryFrom<BitBoard> for Square {
type Error = TryFromBitBoardError;
fn try_from(value: BitBoard) -> Result<Self, Self::Error> {
if !value.is_single_square() {
return Err(TryFromBitBoardError::NotSingleSquare);
}
unsafe { Ok(Square::from_index(value.0.trailing_zeros() as u8)) }
}
}
impl fmt::Binary for BitBoard {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
// Delegate to u64's implementation of Binary.