-pub const PRIMES: [u32; 13] = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41];
+pub const PRIMES: [u8; 13] = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41];
-pub const STRAIGHT_FLUSH: u32 = 1;
-pub const FOUR_OF_A_KIND: u32 = 2;
-pub const FULL_HOUSE: u32 = 3;
-pub const FLUSH: u32 = 4;
-pub const STRAIGHT: u32 = 5;
-pub const THREE_OF_A_KIND: u32 = 6;
-pub const TWO_PAIR: u32 = 7;
-pub const ONE_PAIR: u32 = 8;
-pub const HIGH_CARD: u32 = 9;
+pub const STRAIGHT_FLUSH: u8 = 1;
+pub const FOUR_OF_A_KIND: u8 = 2;
+pub const FULL_HOUSE: u8 = 3;
+pub const FLUSH: u8 = 4;
+pub const STRAIGHT: u8 = 5;
+pub const THREE_OF_A_KIND: u8 = 6;
+pub const TWO_PAIR: u8 = 7;
+pub const ONE_PAIR: u8 = 8;
+pub const HIGH_CARD: u8 = 9;
pub const VALUE_STR: [&str; 10] = [
"",
"High Card",
];
-pub const FLUSHES: [u32; 7937] = [
+pub const FLUSHES: [u16; 7937] = [
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1599, 0, 0, 0, 0, 0, 0, 0, 1598, 0, 0, 0, 1597, 0,
1596, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1595, 0, 0, 0, 0, 0, 0, 0, 1594, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
];
-pub const UNIQUE5: [u32; 7937] = [
+pub const UNIQUE5: [u16; 7937] = [
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1608, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7462, 0, 0, 0, 0, 0, 0, 0, 7461, 0, 0, 0,
7460, 0, 7459, 1607, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7458, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 1600,
];
-pub const HASH_ADJUST: [u32; 512] = [
+pub const HASH_ADJUST: [u16; 512] = [
0, 5628, 7017, 1298, 2918, 2442, 8070, 6383, 6383, 7425, 2442, 5628, 8044, 7425, 3155, 6383,
2918, 7452, 1533, 6849, 5586, 7452, 7452, 1533, 2209, 6029, 2794, 3509, 7992, 7733, 7452, 131,
6029, 4491, 1814, 7452, 6110, 3155, 7077, 6675, 532, 1334, 7555, 5325, 3056, 1403, 1403, 3969,
5628, 7017, 8029, 6528, 4474, 6322, 5562, 6669, 4610, 7006,
];
-pub const HASH_VALUES: [u32; 8192] = [
+pub const HASH_VALUES: [u16; 8192] = [
148, 2934, 166, 5107, 4628, 166, 166, 166, 166, 3033, 166, 4692, 166, 5571, 2225, 166, 5340,
3423, 166, 3191, 1752, 166, 5212, 166, 166, 3520, 166, 166, 166, 1867, 166, 3313, 166, 3461,
166, 166, 3174, 1737, 5010, 5008, 166, 4344, 2868, 3877, 166, 4089, 166, 5041, 4748, 4073,
4767, 5829, 2925, 5916, 2133, 166,
];
-pub const PERM7: [[u32; 5]; 21] = [
+pub const PERM7: [[u16; 5]; 21] = [
[0, 1, 2, 3, 4],
[0, 1, 2, 3, 5],
[0, 1, 2, 3, 6],
let mut suit = 0x8000;
for _ in 0..4 {
for (j, prime) in PRIMES.iter().enumerate() {
+ let prime = *prime as u32;
deck.push(prime | (u32::try_from(j).unwrap() << 8) | suit | (1 << (16 + j)));
}
suit >>= 1;
's' => 0x1000,
_ => panic!("{:?} is an invalid suit character", s),
};
- PRIMES[r] | (u32::try_from(r).unwrap() << 8) | s | (1 << (16 + r))
+ PRIMES[r] as u32 | (u32::try_from(r).unwrap() << 8) | s | (1 << (16 + r))
}
/// Performs a perfect hash lookup
/// <http://senzee.blogspot.com/2006/06/some-perfect-hash.html>
-fn find_fast(mut u: u32) -> u32 {
+fn find_fast(mut u: u32) -> u16 {
u += 0xe91aaa35;
u ^= u >> 16;
// u += u << 8;
let b = (u >> 8) & 0x1ff;
// let a = (u + (u << 2)) >> 19;
let a = (u.wrapping_add(u << 2)) >> 19;
- a ^ HASH_ADJUST[b as usize]
+ u16::try_from(a).unwrap() ^ HASH_ADJUST[b as usize]
}
/// Wrapper over both five-card and seven-card hand evaluator from string.
/// assert_eq!(eval_from_str("Ts 9s 8s 7s 6s 7h 6d"), 5);
/// ```
#[wasm_bindgen]
-pub fn eval_from_str(s: &str) -> u32 {
+pub fn eval_from_str(s: &str) -> u16 {
let cards = s.split(' ').map(|c| card_from_str(c)).collect::<Vec<_>>();
match cards.len() {
7 => eval_7hand(&cards.try_into().unwrap()),
/// Returns the hand's equivalence value.
/// The evaluator orders hands from 1 to 7462.
/// You can use `hand_rank` to get the hand category.
-pub fn eval_5hand(hand: &[u32; 5]) -> u32 {
+pub fn eval_5hand(hand: &[u32; 5]) -> u16 {
let [c1, c2, c3, c4, c5] = hand;
let mut q = (c1 | c2 | c3 | c4 | c5) >> 16;
if c1 & c2 & c3 & c4 & c5 & 0xF000 != 0 {
}
/// Non-optimized method of determining the best five-card hand possible of seven cards.
-pub fn eval_7hand(hand: &[u32; 7]) -> u32 {
+pub fn eval_7hand(hand: &[u32; 7]) -> u16 {
let mut subhand: [u32; 5] = [0; 5];
let mut best = 9999;
/// assert_eq!(hand_rank(eval), FLUSH);
/// ```
#[wasm_bindgen]
-pub fn hand_rank(i: u32) -> u32 {
+pub fn hand_rank(i: u16) -> u8 {
match i {
6186..=7462 => HIGH_CARD,
3326..=6185 => ONE_PAIR,