#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq, PartialOrd, Ord)]
pub struct Precedence(u8);
impl Precedence {
pub const MIN: Self = Precedence(0);
pub const MAX: Self = Precedence(34);
}
#[derive(Debug, Copy, Clone, PartialEq)]
pub enum Op {
Query,
Pow,
BitNot,
Plus,
Minus,
Borrow,
Share,
Clone,
Mul,
Div,
Rem,
Add,
Sub,
SL,
ASR,
LSR,
BitAnd,
BitXor,
BitOr,
Cast,
Exclusive,
Inclusive,
LT,
GT,
LE,
GE,
LG,
EQ,
NE,
In,
BoolNot,
BoolAnd,
BoolOr,
Missing,
}
impl Op {
pub const fn precedence(self) -> (Option<Precedence>, Option<Precedence>) {
const fn p(n: u8) -> Option<Precedence> { Some(Precedence(n)) }
use Op::*;
match self {
Query => (p(34), None),
Pow => (p(32), p(33)),
BitNot | Plus | Minus | Borrow | Share | Clone => (None, p(30)),
Mul | Div | Rem => (p(29), p(28)),
Add | Sub => (p(27), p(26)),
SL | ASR | LSR => (p(24), p(25)),
BitAnd => (p(23), p(22)),
BitXor => (p(21), p(20)),
BitOr => (p(19), p(18)),
Cast => (p(16), p(17)),
Exclusive | Inclusive => (p(15), p(14)),
LT | GT | LE | GE | LG => (p(13), p(12)),
EQ | NE => (p(11), p(10)),
In => (p(9), p(8)),
BoolNot => (None, p(6)),
BoolAnd => (p(5), p(4)),
BoolOr => (p(3), p(2)),
Missing => (p(1), p(0)),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn limits() {
let (_, right) = Op::Missing.precedence();
assert_eq!(right.unwrap(), Precedence::MIN);
let (left, _) = Op::Query.precedence();
assert_eq!(left.unwrap(), Precedence::MAX);
}
}