cell_automata_1d/
rule.rs

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}