mathew 0.0.2

Mathematical expression evaluator with context
Documentation
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));
    }
}