use std::fmt;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum SymbolicOp {
Add,
Sub,
Mul,
DivS,
DivU,
RemS,
RemU,
Neg,
And,
Or,
Xor,
Not,
Shl,
ShrS,
ShrU,
Eq,
Ne,
LtS,
LtU,
GtS,
GtU,
LeS,
LeU,
GeS,
GeU,
}
impl SymbolicOp {
#[must_use]
pub const fn is_commutative(self) -> bool {
matches!(
self,
Self::Add | Self::Mul | Self::And | Self::Or | Self::Xor | Self::Eq | Self::Ne
)
}
#[must_use]
pub const fn is_comparison(self) -> bool {
matches!(
self,
Self::Eq
| Self::Ne
| Self::LtS
| Self::LtU
| Self::GtS
| Self::GtU
| Self::LeS
| Self::LeU
| Self::GeS
| Self::GeU
)
}
#[must_use]
pub const fn is_unary(self) -> bool {
matches!(self, Self::Neg | Self::Not)
}
}
impl fmt::Display for SymbolicOp {
#[allow(clippy::match_same_arms)] fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::Add => write!(f, "+"),
Self::Sub => write!(f, "-"),
Self::Mul => write!(f, "*"),
Self::DivS => write!(f, "/"),
Self::DivU => write!(f, "/u"),
Self::RemS => write!(f, "%"),
Self::RemU => write!(f, "%u"),
Self::Neg => write!(f, "-"),
Self::And => write!(f, "&"),
Self::Or => write!(f, "|"),
Self::Xor => write!(f, "^"),
Self::Not => write!(f, "~"),
Self::Shl => write!(f, "<<"),
Self::ShrS => write!(f, ">>"),
Self::ShrU => write!(f, ">>>"),
Self::Eq => write!(f, "=="),
Self::Ne => write!(f, "!="),
Self::LtS => write!(f, "<"),
Self::LtU => write!(f, "<u"),
Self::GtS => write!(f, ">"),
Self::GtU => write!(f, ">u"),
Self::LeS => write!(f, "<="),
Self::LeU => write!(f, "<=u"),
Self::GeS => write!(f, ">="),
Self::GeU => write!(f, ">=u"),
}
}
}