mindustry logic execution, map- and schematic- parsing and rendering
Diffstat (limited to 'lemu/src/instructions/cop.rs')
-rw-r--r--lemu/src/instructions/cop.rs43
1 files changed, 43 insertions, 0 deletions
diff --git a/lemu/src/instructions/cop.rs b/lemu/src/instructions/cop.rs
new file mode 100644
index 0000000..9e32720
--- /dev/null
+++ b/lemu/src/instructions/cop.rs
@@ -0,0 +1,43 @@
+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 >=);
+
+impl ConditionOp {
+ pub const fn get_fn(self) -> for<'f> fn(LVar<'f>, LVar<'f>) -> bool {
+ match self {
+ Self::Equal | Self::StrictEqual => eq,
+ Self::NotEqual => ne,
+ Self::LessThan => lt,
+ Self::GreaterThan => gt,
+ Self::LessThanEq => le,
+ Self::GreaterThanEq => ge,
+ }
+ }
+}