]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/chr/plan/PlanContext.java
Implemented GraphPropertyRelation with the new CHR implementation
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / elaboration / chr / plan / PlanContext.java
index d8cf92332da0a035b4ce86d126a8230dabedea53..aea2cbfdcd47b0921222e4ccde6a50fd0c34db1c 100644 (file)
@@ -2,14 +2,19 @@ package org.simantics.scl.compiler.elaboration.chr.plan;
 
 import java.util.ArrayList;
 
+import javax.crypto.CipherInputStream;
+
 import org.simantics.scl.compiler.compilation.CompilationContext;
 import org.simantics.scl.compiler.constants.IntegerConstant;
 import org.simantics.scl.compiler.constants.JavaComparisonOperation;
 import org.simantics.scl.compiler.constants.singletons.IncreaseByOne;
+import org.simantics.scl.compiler.constants.singletons.JustConstant;
 import org.simantics.scl.compiler.constants.singletons.ListElement;
 import org.simantics.scl.compiler.constants.singletons.ListLength;
 import org.simantics.scl.compiler.elaboration.chr.CHRRuleset;
 import org.simantics.scl.compiler.elaboration.expressions.Variable;
+import org.simantics.scl.compiler.elaboration.java.EqualsFunction;
+import org.simantics.scl.compiler.internal.codegen.continuations.Branch;
 import org.simantics.scl.compiler.internal.codegen.continuations.ICont;
 import org.simantics.scl.compiler.internal.codegen.references.IVal;
 import org.simantics.scl.compiler.internal.codegen.writer.CodeWriter;
@@ -59,6 +64,24 @@ public abstract class PlanContext {
         
         w.continueAs(end);
     }
+    
+    public void iterateMaybe(long location, CodeWriter w, Variable variable, IVal maybeValue) {
+        Type componentType = variable.getType();
+
+        CodeWriter end = w.createBlock();
+        CodeWriter body = w.createBlock(componentType);
+        w.switch_(maybeValue, new Branch[] {
+                new Branch(JustConstant.INSTANCE, body.getContinuation()),
+                new Branch(null, end.getContinuation())
+        });
+        
+        variable.setVal(body.getParameters()[0]);
+        nextOp(body);
+        if(body.isUnfinished())
+            body.jump(end.getContinuation());
+        
+        w.continueAs(end);
+    }
 
     public void check(long location, CodeWriter w, IVal booleanValue) {
         CodeWriter end = w.createBlock();
@@ -68,4 +91,29 @@ public abstract class PlanContext {
             w.jump(end.getContinuation());
         w.continueAs(end);
     }
+
+    public void checkEquals(long location, CodeWriter w, IVal a, IVal b) {
+        check(location, w, w.apply(location,
+                EqualsFunction.INSTANCE.createSpecialization(a.getType()),
+                a, b));
+    }
+    
+    public void checkEqualsJust(long location, CodeWriter w, IVal value, IVal maybeValue) {
+        Type componentType = value.getType();
+
+        CodeWriter end = w.createBlock();
+        CodeWriter body = w.createBlock(componentType);
+        w.switch_(maybeValue, new Branch[] {
+                new Branch(JustConstant.INSTANCE, body.getContinuation()),
+                new Branch(null, end.getContinuation())
+        });
+        body.branchAwayUnless(body.apply(location,
+                EqualsFunction.INSTANCE.createSpecialization(componentType),
+                value, body.getParameters()[0]), end.getContinuation());
+        nextOp(body);
+        if(body.isUnfinished())
+            body.jump(end.getContinuation());
+        
+        w.continueAs(end);
+    }
 }