use crate::deck::{Rank, CardMask, RankMask};
use core::fmt;
pub mod refbest5;
pub mod lutbest5;
pub trait Best5 {
fn best5(&self, cards: CardMask) -> (CardMask, Hand);
}
pub trait Rank5 {
fn rank5(&self, cards: CardMask) -> u32;
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Ord, PartialOrd)]
pub enum Hand {
HighCard {
kickers: RankMask,
},
OnePair {
pair: Rank,
kickers: RankMask,
},
TwoPair {
pairs: RankMask,
kickers: RankMask,
},
ThreeOfAKind {
trip: Rank,
kickers: RankMask,
},
Straight {
top: Rank,
},
Flush {
ranks: RankMask,
},
FullHouse {
trip: Rank,
pair: Rank,
},
FourOfAKind {
quad: Rank,
kickers: RankMask,
},
StraightFlush {
top: Rank,
},
}
impl fmt::Display for Hand {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::HighCard { kickers } => {
write!(f, "Kickers: '{:}'", kickers)
},
Self::OnePair { pair, kickers } => {
write!(f, "Pair '{:}' + Kickers '{:}'", pair, kickers)
},
Self::TwoPair { pairs, kickers } => {
write!(f, "Two Pair '{:}' + Kickers '{:}'", pairs, kickers)
},
Self::ThreeOfAKind { trip, kickers } => {
write!(f, "Trip '{:}' + Kickers '{:}'", trip, kickers)
},
Self::Straight { top } => {
match top {
Rank::Five => {
write!(f, "Straight 'A2345'")
},
_ => {
write!(f, "Straight '")?;
for i in 0..5 {
let irank = Rank::from_index(top.to_index() - i);
write!(f, "{}", irank)?;
if i > 0 {
write!(f, "")?;
}
}
write!(f, "'")
}
}
},
Self::FourOfAKind { quad, kickers } => {
write!(f, "Quad '{:}' + Kickers '{:}'", quad, kickers)
},
Self::FullHouse { trip, pair } => {
write!(f, "Full House '{:}{:}'", trip, pair)
},
Self::Flush { ranks } => {
write!(f, "Flush '{:}'", ranks)
},
Self::StraightFlush { top } => {
match top {
Rank::Five => {
write!(f, "Straight Flush 'A2345'")
},
_ => {
write!(f, "Straight Flush '")?;
for i in 0..5 {
let irank = Rank::from_index(top.to_index() - i);
write!(f, "{}", irank)?;
if i > 0 {
write!(f, "")?;
}
}
write!(f, "'")
}
}
},
}
}
}