1#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
13pub enum Token {
14 Or,
17 Nor,
19 Xor,
21
22 NodeStart,
25 NodeEnd,
27 InputDecl,
29 OutputDecl,
31
32 True,
35 False,
37
38 Id(u16),
41}
42
43impl Token {
44 pub fn as_bool_op(&self) -> Option<BoolOp> {
46 match self {
47 Token::Or => Some(BoolOp::Or),
48 Token::Nor => Some(BoolOp::Nor),
49 Token::Xor => Some(BoolOp::Xor),
50 _ => None,
51 }
52 }
53
54 pub fn is_operator(&self) -> bool {
56 matches!(self, Token::Or | Token::Nor | Token::Xor)
57 }
58
59 pub fn as_source(&self) -> Option<Source> {
61 match self {
62 Token::Id(id) => Some(Source::Id(*id)),
63 Token::True => Some(Source::True),
64 Token::False => Some(Source::False),
65 _ => None,
66 }
67 }
68}
69
70#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
74pub enum Source {
75 Id(u16),
77 True,
79 False,
81}
82
83#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
85pub enum BoolOp {
86 Or,
88 Nor,
90 Xor,
92}
93
94impl BoolOp {
95 #[inline]
97 pub fn eval(self, a: bool, b: bool) -> bool {
98 match self {
99 BoolOp::Or => a || b,
100 BoolOp::Nor => !(a || b),
101 BoolOp::Xor => a ^ b,
102 }
103 }
104}
105
106#[cfg(test)]
107mod tests {
108 use super::*;
109
110 #[test]
111 fn test_bool_op_or() {
112 assert!(!BoolOp::Or.eval(false, false));
113 assert!(BoolOp::Or.eval(false, true));
114 assert!(BoolOp::Or.eval(true, false));
115 assert!(BoolOp::Or.eval(true, true));
116 }
117
118 #[test]
119 fn test_bool_op_nor() {
120 assert!(BoolOp::Nor.eval(false, false));
121 assert!(!BoolOp::Nor.eval(false, true));
122 assert!(!BoolOp::Nor.eval(true, false));
123 assert!(!BoolOp::Nor.eval(true, true));
124 }
125
126 #[test]
127 fn test_bool_op_xor() {
128 assert!(!BoolOp::Xor.eval(false, false));
129 assert!(BoolOp::Xor.eval(false, true));
130 assert!(BoolOp::Xor.eval(true, false));
131 assert!(!BoolOp::Xor.eval(true, true));
132 }
133
134 #[test]
135 fn test_token_as_bool_op() {
136 assert_eq!(Token::Or.as_bool_op(), Some(BoolOp::Or));
137 assert_eq!(Token::Nor.as_bool_op(), Some(BoolOp::Nor));
138 assert_eq!(Token::Xor.as_bool_op(), Some(BoolOp::Xor));
139 assert_eq!(Token::NodeStart.as_bool_op(), None);
140 assert_eq!(Token::Id(0).as_bool_op(), None);
141 }
142
143 #[test]
144 fn test_token_as_source() {
145 assert_eq!(Token::Id(42).as_source(), Some(Source::Id(42)));
146 assert_eq!(Token::True.as_source(), Some(Source::True));
147 assert_eq!(Token::False.as_source(), Some(Source::False));
148 assert_eq!(Token::Or.as_source(), None);
149 assert_eq!(Token::NodeStart.as_source(), None);
150 }
151}