use super::*;
#[derive(Copy, Clone, Debug, Eq, PartialEq, Ord, PartialOrd)]
#[repr(i8)]
pub(crate) enum Order {
FnBarrier,
AddSub,
MulDiv,
IMul,
Unary,
Pow,
}
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
#[repr(u8)]
pub(crate) enum Assoc {
Left,
Right,
}
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
#[repr(u8)]
pub enum Operator {
Add,
Sub,
Mul,
Div,
Rem,
IMul,
Pow,
}
pub(crate) struct OpDesc {
pub pfn: Function,
pub pre: Order,
pub assoc: Assoc,
pub unary: bool,
}
static OP_DESC: [OpDesc; 7] = [
OpDesc { pfn: native::add, pre: Order::AddSub, assoc: Assoc::Left, unary: true },
OpDesc { pfn: native::sub, pre: Order::AddSub, assoc: Assoc::Left, unary: true },
OpDesc { pfn: native::mul, pre: Order::MulDiv, assoc: Assoc::Left, unary: false },
OpDesc { pfn: native::div, pre: Order::MulDiv, assoc: Assoc::Left, unary: false },
OpDesc { pfn: native::rem, pre: Order::MulDiv, assoc: Assoc::Left, unary: false },
OpDesc { pfn: native::mul, pre: Order::IMul, assoc: Assoc::Left, unary: false },
OpDesc { pfn: native::pow, pre: Order::Pow, assoc: Assoc::Right, unary: false },
];
impl Operator {
#[inline]
pub(crate) fn desc(self) -> &'static OpDesc {
&OP_DESC[self as usize]
}
}