use std::cmp::Ordering;
#[derive(Debug, Clone, Copy, PartialEq)]
#[repr(u8)]
pub(super) enum Operator {
ParenLeft = 1 << 2,
ParenRight = (1 << 2) + 1,
Fn = (1 << 2) + 2,
Neg = 1 << 3,
Mul = 1 << 4,
Div = (1 << 4) + 1,
Rem = (1 << 4) + 2,
Add = 1 << 5,
Sub = (1 << 5) + 1,
}
impl Operator {
fn preference(&self, o: &Operator) -> Ordering {
(*self as u8)
.leading_zeros()
.cmp(&(*o as u8).leading_zeros())
}
pub(super) fn ge_preference(&self, o: &Operator) -> bool {
match self.preference(o) {
Ordering::Greater | Ordering::Equal => true,
_ => false,
}
}
pub(super) fn eq_preference(&self, o: &Operator) -> bool {
match self.preference(o) {
Ordering::Equal => true,
_ => false,
}
}
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn test_op_preference() {
assert!(Operator::Add.ge_preference(&Operator::Sub) && Operator::Sub != Operator::Add);
assert!(Operator::Neg.ge_preference(&Operator::Neg) && Operator::Neg == Operator::Neg);
assert!(!Operator::Add.ge_preference(&Operator::Neg));
assert!(Operator::Neg.ge_preference(&Operator::Add));
}
}