use slotmap::new_key_type;
use super::lattice::{Direction, Position};
new_key_type! {
pub struct LegKey;
pub struct LefKey;
}
#[derive(Copy, Clone, Eq, PartialEq, Debug, bytemuck::NoUninit)]
#[repr(u8)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "serde", serde(rename_all = "snake_case"))]
pub enum Mobility {
Moving = 0,
Captured = 1,
}
impl Mobility {
pub const NAMES: [&str; 2] = ["Moving", "Captured"];
pub fn code(self) -> u8 {
self as u8
}
pub fn as_codes(column: &[Mobility]) -> &[u8] {
bytemuck::cast_slice(column)
}
pub fn into_codes(column: Vec<Mobility>) -> Vec<u8> {
bytemuck::allocation::cast_vec(column)
}
pub fn from_code(code: u8) -> Option<Self> {
match code {
0 => Some(Mobility::Moving),
1 => Some(Mobility::Captured),
_ => None,
}
}
}
#[derive(Copy, Clone, Debug)]
pub struct Leg {
pub pos: Position,
pub lef: LefKey,
pub partner: LegKey,
pub facing: Direction,
pub mobility: Mobility,
}
#[derive(Copy, Clone, Debug)]
pub struct Lef {
pub legs: [LegKey; 2],
}