#[derive(Debug, Copy, Clone, Eq, PartialEq, Hash)]
pub enum BinOp {
Add,
Sub,
Mul,
Div,
Rem,
And,
Or,
BitXor,
BitAnd,
BitOr,
Shl,
Shr,
Eq,
Lt,
Le,
Ne,
Ge,
Gt,
}
#[derive(Debug, Copy, Clone, Eq, PartialEq, Hash)]
pub enum UnOp {
Deref,
Not,
Neg,
}
#[cfg(feature = "parsing")]
pub mod parsing {
use super::*;
named!(pub binop -> BinOp, alt!(
punct!("&&") => { |_| BinOp::And }
|
punct!("||") => { |_| BinOp::Or }
|
punct!("<<") => { |_| BinOp::Shl }
|
punct!(">>") => { |_| BinOp::Shr }
|
punct!("==") => { |_| BinOp::Eq }
|
punct!("<=") => { |_| BinOp::Le }
|
punct!("!=") => { |_| BinOp::Ne }
|
punct!(">=") => { |_| BinOp::Ge }
|
punct!("+") => { |_| BinOp::Add }
|
punct!("-") => { |_| BinOp::Sub }
|
punct!("*") => { |_| BinOp::Mul }
|
punct!("/") => { |_| BinOp::Div }
|
punct!("%") => { |_| BinOp::Rem }
|
punct!("^") => { |_| BinOp::BitXor }
|
punct!("&") => { |_| BinOp::BitAnd }
|
punct!("|") => { |_| BinOp::BitOr }
|
punct!("<") => { |_| BinOp::Lt }
|
punct!(">") => { |_| BinOp::Gt }
));
#[cfg(feature = "full")]
named!(pub assign_op -> BinOp, alt!(
punct!("+=") => { |_| BinOp::Add }
|
punct!("-=") => { |_| BinOp::Sub }
|
punct!("*=") => { |_| BinOp::Mul }
|
punct!("/=") => { |_| BinOp::Div }
|
punct!("%=") => { |_| BinOp::Rem }
|
punct!("^=") => { |_| BinOp::BitXor }
|
punct!("&=") => { |_| BinOp::BitAnd }
|
punct!("|=") => { |_| BinOp::BitOr }
|
punct!("<<=") => { |_| BinOp::Shl }
|
punct!(">>=") => { |_| BinOp::Shr }
));
named!(pub unop -> UnOp, alt!(
punct!("*") => { |_| UnOp::Deref }
|
punct!("!") => { |_| UnOp::Not }
|
punct!("-") => { |_| UnOp::Neg }
));
}
#[cfg(feature = "printing")]
mod printing {
use super::*;
use quote::{Tokens, ToTokens};
impl BinOp {
pub fn op(&self) -> &'static str {
match *self {
BinOp::Add => "+",
BinOp::Sub => "-",
BinOp::Mul => "*",
BinOp::Div => "/",
BinOp::Rem => "%",
BinOp::And => "&&",
BinOp::Or => "||",
BinOp::BitXor => "^",
BinOp::BitAnd => "&",
BinOp::BitOr => "|",
BinOp::Shl => "<<",
BinOp::Shr => ">>",
BinOp::Eq => "==",
BinOp::Lt => "<",
BinOp::Le => "<=",
BinOp::Ne => "!=",
BinOp::Ge => ">=",
BinOp::Gt => ">",
}
}
pub fn assign_op(&self) -> Option<&'static str> {
match *self {
BinOp::Add => Some("+="),
BinOp::Sub => Some("-="),
BinOp::Mul => Some("*="),
BinOp::Div => Some("/="),
BinOp::Rem => Some("%="),
BinOp::BitXor => Some("^="),
BinOp::BitAnd => Some("&="),
BinOp::BitOr => Some("|="),
BinOp::Shl => Some("<<="),
BinOp::Shr => Some(">>="),
_ => None,
}
}
}
impl ToTokens for BinOp {
fn to_tokens(&self, tokens: &mut Tokens) {
tokens.append(self.op());
}
}
impl UnOp {
pub fn op(&self) -> &'static str {
match *self {
UnOp::Deref => "*",
UnOp::Not => "!",
UnOp::Neg => "-",
}
}
}
impl ToTokens for UnOp {
fn to_tokens(&self, tokens: &mut Tokens) {
tokens.append(self.op());
}
}
}