1pub struct Rule {
2 number: u8
3}
4
5impl Rule {
6 pub fn new(num: u8) -> Self {
7 Rule {
8 number: num
9 }
10 }
11
12 pub fn result_of(&self, triad: [bool; 3]) -> bool {
13 let mut rule_bit_ind: u8 = 0;
14 for (i, cell) in triad.iter().rev().enumerate() {
15 rule_bit_ind += (*cell as u8) * 2u8.pow(i as u32);
16 }
17 self.bit_at(rule_bit_ind)
18 }
19
20 fn bit_at(&self, ind: u8) -> bool {
21 self.number & (1 << ind) != 0
22 }
23}
24
25#[cfg(test)]
26mod tests {
27 use crate::rule::*;
28
29 #[test]
30 fn creating_rule_from_number() {
31 let rule = Rule::new(0b10000101);
32 assert!(rule.bit_at(0));
33 assert!(rule.bit_at(7));
34 assert!(rule.bit_at(2));
35 for i in [1,3,4,5,6] {
36 assert!(!rule.bit_at(i));
37 }
38 }
39}