use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum UnaryOperator {
LogicalNot,
BitwiseNot,
Minus,
FloatMinus,
AddressOf(Option<usize>),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum BinaryOperator {
Mul,
Div,
SignedDiv,
Mod,
SignedMod,
FloatDiv,
FloatMul,
Add,
Sub,
FloatAdd,
FloatSub,
LeftShift,
RightShift,
SignedRightShift,
SignedLessThan,
SignedGreaterThan,
SignedLessEqual,
SignedGreaterEqual,
LessEqual,
GreaterEqual,
LessThan,
GreaterThan,
FloatLessEqual,
FloatGreaterEqual,
FloatLessThan,
FloatGreaterThan,
Equal,
NotEqual,
FloatEqual,
FloatNotEqual,
LogicalXor,
LogicalAnd,
LogicalOr,
BitwiseXor,
BitwiseOr,
BitwiseAnd,
}
impl BinaryOperator {
pub fn is_comparison(self) -> bool {
matches!(
self,
BinaryOperator::LessEqual
| BinaryOperator::GreaterEqual
| BinaryOperator::LessThan
| BinaryOperator::GreaterThan
| BinaryOperator::SignedLessThan
| BinaryOperator::SignedGreaterThan
| BinaryOperator::SignedLessEqual
| BinaryOperator::SignedGreaterEqual
| BinaryOperator::Equal
| BinaryOperator::NotEqual
| BinaryOperator::FloatLessThan
| BinaryOperator::FloatLessEqual
| BinaryOperator::FloatGreaterThan
| BinaryOperator::FloatGreaterEqual
| BinaryOperator::FloatEqual
| BinaryOperator::FloatNotEqual
)
}
pub fn is_shift(self) -> bool {
matches!(
self,
BinaryOperator::LeftShift
| BinaryOperator::RightShift
| BinaryOperator::SignedRightShift
)
}
pub fn is_signed_comparison(self) -> bool {
matches!(
self,
BinaryOperator::SignedLessThan
| BinaryOperator::SignedGreaterThan
| BinaryOperator::SignedLessEqual
| BinaryOperator::SignedGreaterEqual
)
}
pub fn is_float_comparison(self) -> bool {
matches!(
self,
BinaryOperator::FloatLessThan
| BinaryOperator::FloatLessEqual
| BinaryOperator::FloatGreaterThan
| BinaryOperator::FloatGreaterEqual
| BinaryOperator::FloatEqual
| BinaryOperator::FloatNotEqual
)
}
pub fn is_float(self) -> bool {
matches!(
self,
BinaryOperator::FloatDiv
| BinaryOperator::FloatMul
| BinaryOperator::FloatAdd
| BinaryOperator::FloatSub
| BinaryOperator::FloatLessEqual
| BinaryOperator::FloatGreaterEqual
| BinaryOperator::FloatLessThan
| BinaryOperator::FloatGreaterThan
| BinaryOperator::FloatEqual
| BinaryOperator::FloatNotEqual
)
}
pub fn is_logical(self) -> bool {
matches!(
self,
BinaryOperator::LogicalXor | BinaryOperator::LogicalAnd | BinaryOperator::LogicalOr
)
}
pub fn is_signed_integer(self) -> bool {
matches!(
self,
BinaryOperator::SignedDiv
| BinaryOperator::SignedMod
| BinaryOperator::SignedLessThan
| BinaryOperator::SignedGreaterThan
| BinaryOperator::SignedLessEqual
| BinaryOperator::SignedGreaterEqual
| BinaryOperator::SignedRightShift
)
}
pub fn pretty_print(self) -> &'static str {
match self {
BinaryOperator::Mul => "*",
BinaryOperator::Div => "/",
BinaryOperator::SignedDiv => "s/",
BinaryOperator::Mod => "%",
BinaryOperator::SignedMod => "s%",
BinaryOperator::FloatDiv => "f/",
BinaryOperator::FloatMul => "f*",
BinaryOperator::Add => "+",
BinaryOperator::Sub => "-",
BinaryOperator::FloatAdd => "f+",
BinaryOperator::FloatSub => "f-",
BinaryOperator::LeftShift => "<<",
BinaryOperator::RightShift => ">>",
BinaryOperator::SignedRightShift => "s>>",
BinaryOperator::SignedLessThan => "s<",
BinaryOperator::SignedGreaterThan => "s>",
BinaryOperator::SignedLessEqual => "s<=",
BinaryOperator::SignedGreaterEqual => "s>=",
BinaryOperator::LessEqual => "<=",
BinaryOperator::GreaterEqual => ">=",
BinaryOperator::LessThan => "<",
BinaryOperator::GreaterThan => ">",
BinaryOperator::FloatLessEqual => "f<=",
BinaryOperator::FloatGreaterEqual => "f>=",
BinaryOperator::FloatLessThan => "f<",
BinaryOperator::FloatGreaterThan => "f>",
BinaryOperator::Equal => "==",
BinaryOperator::NotEqual => "!=",
BinaryOperator::FloatEqual => "f==",
BinaryOperator::FloatNotEqual => "f!=",
BinaryOperator::LogicalXor => "^^",
BinaryOperator::LogicalAnd => "&&",
BinaryOperator::LogicalOr => "||",
BinaryOperator::BitwiseXor => "^",
BinaryOperator::BitwiseOr => "|",
BinaryOperator::BitwiseAnd => "&",
}
}
}