1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
use super::*;

impl LogicMatrix {
    /// Use as a binary operator
    pub fn perform_logic(&self, p: bool, q: bool) -> bool {
        match self {
            Self::False => false,
            Self::And => p && q,
            Self::AndNot => p && !q,
            Self::P => p,
            Self::NotAnd => !p && q,
            Self::Q => q,
            Self::Xor => p ^ q,
            Self::Or => p || q,
            Self::Nor => !p && !q,
            Self::Xnor => p == q,
            Self::NotQ => !q,
            Self::OrNot => p || !q,
            Self::NotP => !p,
            Self::NotOr => !p || q,
            Self::Nand => !p || !q,
            Self::True => true,
        }
    }
    /// Use on byte, bit by bit
    pub fn perform_byte(&self, p: u8, q: u8) -> u8 {
        match self {
            Self::False => 0,
            Self::And => p & q,
            Self::AndNot => p & !q,
            Self::P => p,
            Self::NotAnd => !p & q,
            Self::Q => q,
            Self::Xor => p ^ q,
            Self::Or => p | q,
            Self::Nor => !(p | q),
            Self::Xnor => p ^ q,
            Self::NotQ => !q,
            Self::OrNot => p | !q,
            Self::NotP => !p,
            Self::NotOr => !(p | q),
            Self::Nand => !(p & q),
            Self::True => 255,
        }
    }

    /// Convert to string if is a binary operator
    pub fn as_str(&self) -> &'static str {
        match self {
            LogicMatrix::False => "_",
            LogicMatrix::And => "∧",
            LogicMatrix::AndNot => "",
            LogicMatrix::P => "⊣",
            LogicMatrix::NotAnd => "",
            LogicMatrix::Q => "⊢",
            LogicMatrix::Xor => "≠",
            LogicMatrix::Or => "∨",
            LogicMatrix::Nor => "⍱",
            LogicMatrix::Xnor => "==",
            LogicMatrix::NotQ => "",
            LogicMatrix::OrNot => "",
            LogicMatrix::NotP => "",
            LogicMatrix::NotOr => "",
            LogicMatrix::Nand => "⍲",
            LogicMatrix::True => "_",
        }
    }
}