open_pql/base/
mod.rs

1use std::{
2    fmt,
3    hash::Hash,
4    iter, mem,
5    ops::{BitAnd, BitAndAssign, BitOr, BitOrAssign, Index, Not},
6    slice,
7    str::FromStr,
8    vec::Vec,
9};
10
11use derive_more::{
12    BitAnd, BitAndAssign, BitOr, BitOrAssign, Display, From, Into,
13};
14#[cfg(test)]
15use quickcheck::{Arbitrary, TestResult};
16#[cfg(test)]
17use quickcheck_macros::*;
18
19use super::{
20    constants::{
21        MASK16_RANKS, MASK64_2, MASK64_ALL, N_CARDS, N_RANKS, N_SUITS,
22        OFFSET_C, OFFSET_D, OFFSET_H, OFFSET_S, OFFSET_SUIT, RANK_NAMES,
23        SUIT_NAMES, U16_LEADING_ONE,
24    },
25    *,
26};
27
28mod board;
29mod card;
30mod card64;
31mod card_idx;
32mod hand_iter;
33mod hand_n;
34mod isomorphic;
35mod rank;
36mod rank16;
37mod suit;
38mod suit4;
39
40pub use board::*;
41pub use card::*;
42pub use card_idx::*;
43pub use card64::*;
44pub use hand_iter::*;
45pub use hand_n::*;
46pub use isomorphic::*;
47pub use rank::*;
48pub use rank16::*;
49pub use suit::*;
50pub use suit4::*;
51
52pub type Hand = [Card];
53
54/// Card count type
55pub type CardCount = u8;
56
57/// Index of the turn card in a board array
58pub const IDX_TURN: usize = 3;
59/// Index of the river card in a board array
60pub const IDX_RIVER: usize = 4;
61/// Number of cards in a flop
62pub const N_FLOP: usize = 3;
63/// Number of cards in a flop + turn
64pub const N_TURN: usize = 4;
65/// Number of cards in a flop + turn + river
66pub const N_RIVER: usize = 5;
67
68/// Mask for shortdeck ranks in Rank16
69pub const MASK16_RANKS_SHORT: u16 = 0b0001_1111_1111_0000;
70
71/// Mask for spades in Card64
72pub const MASK64_S: u64 = MASK16_RANKS as u64;
73/// Mask for hearts in Card64
74pub const MASK64_H: u64 = MASK64_S << OFFSET_H;
75/// Mask for diamonds in Card64
76pub const MASK64_D: u64 = MASK64_S << OFFSET_D;
77/// Mask for clubs in Card64
78pub const MASK64_C: u64 = MASK64_S << OFFSET_C;
79
80/// Mask for all suits in Card64
81pub const MASK64_ALL_SHORT: u64 = (MASK16_RANKS_SHORT as u64)
82    | ((MASK16_RANKS_SHORT as u64) << OFFSET_H)
83    | ((MASK16_RANKS_SHORT as u64) << OFFSET_D)
84    | ((MASK16_RANKS_SHORT as u64) << OFFSET_C);
85
86/// Number of combinations of two ranks
87pub const COMB_TWO_RANKS_LEN: usize = 91;
88
89/// Normalizes a Card64 value
90#[inline]
91const fn normalize_u64(c: u64) -> [u8; 8] {
92    unsafe {
93        let [s, h, d, c]: [u16; 4] = mem::transmute(c);
94
95        let has4 = s & h & d & c;
96        let has3 = s & h & d | s & h & c | s & d & c | h & d & c;
97        let has2 = s & h | s & d | s & c | h & d | h & c | d & c;
98        let has1 = s | h | d | c;
99
100        mem::transmute([has1, has2, has3, has4])
101    }
102}