use crate::{lexer::Token, memory::LVar};
super::op_enum! { pub enum ConditionOp {
Equal,
NotEqual,
LessThan,
LessThanEq,
GreaterThan,
GreaterThanEq,
StrictEqual,
} }
macro_rules! op {
($name: ident $op:tt ) => {
fn $name<'v>(a: &LVar<'v>, b: &LVar<'v>) -> bool {
if let &LVar::Num(a) = a && let &LVar::Num(b) = b { a $op b } else { false }
}
};
}
fn eq<'v>(a: &LVar<'v>, b: &LVar<'v>) -> bool {
a == b
}
fn ne<'v>(a: &LVar<'v>, b: &LVar<'v>) -> bool {
a != b
}
op!(lt <);
op!(gt >);
op!(le <=);
op!(ge >=);
super::op_impl!(ConditionOp, ptr type = for<'f> fn(&LVar<'f>, &LVar<'f>) -> bool {
Equal => eq,
StrictEqual => eq,
NotEqual => ne,
LessThan => lt,
GreaterThan => gt,
LessThanEq => le,
GreaterThanEq => ge,
});