openpql_prelude/card/
flop.rs1use 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
10pub 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}