Add 'Piece' enum
This commit is contained in:
parent
d919b956ed
commit
a3a9f64213
|
@ -13,6 +13,9 @@ pub use direction::*;
|
||||||
pub mod file;
|
pub mod file;
|
||||||
pub use file::*;
|
pub use file::*;
|
||||||
|
|
||||||
|
pub mod piece;
|
||||||
|
pub use piece::*;
|
||||||
|
|
||||||
pub mod rank;
|
pub mod rank;
|
||||||
pub use rank::*;
|
pub use rank::*;
|
||||||
|
|
||||||
|
|
72
src/board/piece.rs
Normal file
72
src/board/piece.rs
Normal file
|
@ -0,0 +1,72 @@
|
||||||
|
/// An enum representing the type of a piece.
|
||||||
|
#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
|
||||||
|
pub enum Piece {
|
||||||
|
King,
|
||||||
|
Queen,
|
||||||
|
Rook,
|
||||||
|
Bishop,
|
||||||
|
Knight,
|
||||||
|
Pawn,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Piece {
|
||||||
|
/// The number of [Piece] variants.
|
||||||
|
pub const NUM_VARIANTS: usize = 6;
|
||||||
|
|
||||||
|
const ALL: [Self; Self::NUM_VARIANTS] = [
|
||||||
|
Self::King,
|
||||||
|
Self::Queen,
|
||||||
|
Self::Rook,
|
||||||
|
Self::Bishop,
|
||||||
|
Self::Knight,
|
||||||
|
Self::Pawn,
|
||||||
|
];
|
||||||
|
|
||||||
|
/// Iterate over all piece types.
|
||||||
|
pub fn iter() -> impl Iterator<Item = Self> {
|
||||||
|
Self::ALL.iter().cloned()
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Convert from a piece index into a [Piece] type.
|
||||||
|
#[inline(always)]
|
||||||
|
pub fn from_index(index: usize) -> Self {
|
||||||
|
assert!(index < Self::NUM_VARIANTS);
|
||||||
|
// SAFETY: we know the value is in-bounds
|
||||||
|
unsafe { Self::from_index_unchecked(index) }
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Convert from a piece index into a [Piece] type, no bounds checking.
|
||||||
|
///
|
||||||
|
/// # Safety
|
||||||
|
///
|
||||||
|
/// Should only be called with values that can be output by [Piece::index()].
|
||||||
|
#[inline(always)]
|
||||||
|
pub unsafe fn from_index_unchecked(index: usize) -> Self {
|
||||||
|
std::mem::transmute(index as u8)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Return the index of a given [Piece].
|
||||||
|
#[inline(always)]
|
||||||
|
pub fn index(self) -> usize {
|
||||||
|
self as usize
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod test {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn from_index() {
|
||||||
|
assert_eq!(Piece::from_index(0), Piece::King);
|
||||||
|
assert_eq!(Piece::from_index(1), Piece::Queen);
|
||||||
|
assert_eq!(Piece::from_index(5), Piece::Pawn);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn index() {
|
||||||
|
assert_eq!(Piece::King.index(), 0);
|
||||||
|
assert_eq!(Piece::Queen.index(), 1);
|
||||||
|
assert_eq!(Piece::Pawn.index(), 5);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue