use std::ops::{Index, IndexMut};
use std::fmt::{self, Debug, Formatter};
#[derive(PartialEq, Eq, Copy, Clone, Debug, Hash)]
pub enum Card {
MinusX,
MinusY,
PlusX,
PlusY,
}
impl Card {
pub fn flip(self) -> Card {
match self {
Card::MinusX => Card::PlusX,
Card::PlusX => Card::MinusX,
Card::MinusY => Card::PlusY,
Card::PlusY => Card::MinusY
}
}
#[inline]
pub fn values() -> [Card; 4] {
[Card::MinusX, Card::MinusY, Card::PlusX, Card::PlusY]
}
}
#[derive(PartialEq, Eq, Copy, Clone, Hash)]
pub struct CardMask { flags: [bool; 4] }
impl CardMask {
#[inline]
pub fn empty() -> CardMask {
CardMask { flags: [false; 4] }
}
#[inline]
pub fn full() -> CardMask {
CardMask { flags: [true; 4] }
}
pub(crate) fn flip(&self) -> CardMask {
let mut result = CardMask::empty();
result[Card::PlusX] = self[Card::MinusX];
result[Card::MinusX] = self[Card::PlusX];
result[Card::PlusY] = self[Card::MinusY];
result[Card::MinusY] = self[Card::PlusY];
result
}
}
impl From<Card> for CardMask {
fn from(card: Card) -> CardMask {
let mut result = CardMask::empty();
result[card] = true;
result
}
}
impl Index<Card> for CardMask {
type Output = bool;
#[inline]
fn index(&self, index: Card) -> &bool {
&self.flags[index as usize]
}
}
impl IndexMut<Card> for CardMask {
#[inline]
fn index_mut(&mut self, index: Card) -> &mut bool {
&mut self.flags[index as usize]
}
}
impl Debug for CardMask {
fn fmt(&self, f: &mut Formatter) -> fmt::Result {
write!(f, "CardMask {{ MinusX: {}, MinusY: {}, PlusX: {}, PlusY: {} }}",
self[Card::MinusX], self[Card::MinusY], self[Card::PlusX], self[Card::PlusY])
}
}