openpql_prelude/card/
flop.rs

1use super::{Board, Card, Card64, HandN, ops};
2
3#[macro_export]
4macro_rules! flop {
5    ($s:expr) => {
6        $crate::Flop::from(<[$crate::Card; 3]>::try_from(cards!($s)).unwrap())
7    };
8}
9
10/// Flop representation.
11///
12/// Type alias for `HandN<3>` representing the first three community cards.
13/// Includes a macro for convenient flop creation.
14pub type Flop = HandN<3>;
15
16impl Flop {
17    pub(crate) const fn to_c64(self) -> Card64 {
18        let mut res = Card64::EMPTY;
19        res.set(self.0[0]);
20        res.set(self.0[1]);
21        res.set(self.0[2]);
22
23        res
24    }
25
26    pub(crate) const fn contains_card(self, card: Card) -> bool {
27        self.0[0].eq(card) || self.0[1].eq(card) || self.0[2].eq(card)
28    }
29}
30
31impl From<Flop> for Board {
32    fn from(flop: Flop) -> Self {
33        Self {
34            flop: Some(flop),
35            ..Default::default()
36        }
37    }
38}
39
40impl ops::BitOrAssign<Flop> for Card64 {
41    fn bitor_assign(&mut self, rhs: Flop) {
42        self.set(rhs[0]);
43        self.set(rhs[1]);
44        self.set(rhs[2]);
45    }
46}
47
48#[cfg(test)]
49#[cfg_attr(coverage_nightly, coverage(off))]
50mod tests {
51    use super::*;
52    use crate::*;
53
54    #[quickcheck]
55    fn test_to_board(cards: CardN<3>) {
56        let flop = Flop::from_slice(cards.as_slice());
57        let board = Board::from_slice(cards.as_slice());
58
59        assert_eq!(Board::from(flop), board);
60    }
61
62    #[quickcheck]
63    fn bit_or_assign(cards: CardN<3>, c64: Card64) {
64        let flop = Flop::from_slice(cards.as_slice());
65        let mut copy = c64;
66        copy |= flop;
67
68        assert_eq!(copy, Card64::from(flop) | c64);
69    }
70
71    #[quickcheck]
72    fn test_flop_eq(cards: CardN<3>) {
73        let flops: Vec<Flop> = vec![
74            Flop::from_slice(&[cards[0], cards[1], cards[2]]),
75            Flop::from_slice(&[cards[0], cards[2], cards[1]]),
76            Flop::from_slice(&[cards[1], cards[0], cards[2]]),
77            Flop::from_slice(&[cards[1], cards[2], cards[0]]),
78            Flop::from_slice(&[cards[2], cards[1], cards[0]]),
79            Flop::from_slice(&[cards[2], cards[0], cards[1]]),
80        ];
81
82        for i in 0..flops.len() {
83            for j in 0..flops.len() {
84                assert_eq!(flops[i], flops[j]);
85            }
86        }
87    }
88}