--- /dev/null
+package org.simantics.scl.compiler.elaboration.chr.plan;\r
+\r
+import java.util.ArrayList;\r
+\r
+import org.simantics.scl.compiler.compilation.CompilationContext;\r
+import org.simantics.scl.compiler.constants.IntegerConstant;\r
+import org.simantics.scl.compiler.constants.JavaComparisonOperation;\r
+import org.simantics.scl.compiler.constants.singletons.IncreaseByOne;\r
+import org.simantics.scl.compiler.constants.singletons.ListElement;\r
+import org.simantics.scl.compiler.constants.singletons.ListLength;\r
+import org.simantics.scl.compiler.elaboration.chr.CHRRuleset;\r
+import org.simantics.scl.compiler.elaboration.expressions.Variable;\r
+import org.simantics.scl.compiler.internal.codegen.continuations.ICont;\r
+import org.simantics.scl.compiler.internal.codegen.references.IVal;\r
+import org.simantics.scl.compiler.internal.codegen.writer.CodeWriter;\r
+import org.simantics.scl.compiler.types.Type;\r
+import org.simantics.scl.compiler.types.Types;\r
+\r
+public abstract class PlanContext {\r
+ public CompilationContext context;\r
+ public CHRRuleset ruleset;\r
+ public IVal storeVar;\r
+ public ArrayList<PartnerFact> partnerFacts = new ArrayList<PartnerFact>();\r
+ public IVal currentId;\r
+ \r
+ public PlanContext(CompilationContext context, CHRRuleset ruleset, IVal storeVar) {\r
+ this.context = context;\r
+ this.ruleset = ruleset;\r
+ this.storeVar = storeVar;\r
+ }\r
+\r
+ public abstract void nextOp(CodeWriter w);\r
+\r
+ public IVal generateNewId(long location, CodeWriter w) {\r
+ if(currentId == null)\r
+ currentId = w.apply(location, ruleset.readCurrentId, storeVar);\r
+ IVal result = currentId;\r
+ currentId = w.apply(location, IncreaseByOne.INSTANCE, currentId);\r
+ return result;\r
+ }\r
+ \r
+ public void iterateList(long location, CodeWriter w, Variable variable, IVal listValue) {\r
+ Type componentType = variable.getType();\r
+ IVal listLength = w.apply(location, ListLength.INSTANCE.createSpecialization(componentType), listValue);\r
+ \r
+ CodeWriter body = w.createBlock(Types.INTEGER);\r
+ ICont bodyContinuation = body.getContinuation();\r
+ CodeWriter end = w.createBlock();\r
+ \r
+ w.jump(body.getContinuation(), IntegerConstant.ZERO);\r
+ \r
+ IVal index = body.getParameters()[0];\r
+ body.branchAwayIf(body.apply(location, JavaComparisonOperation.IEQUAL, index, listLength),\r
+ end.getContinuation());\r
+ variable.setVal(body.apply(location, ListElement.INSTANCE.createSpecialization(componentType), listValue, index));\r
+ nextOp(body);\r
+ if(body.isUnfinished())\r
+ body.jump(bodyContinuation, body.apply(location, IncreaseByOne.INSTANCE, index));\r
+ \r
+ w.continueAs(end);\r
+ }\r
+\r
+ public void check(long location, CodeWriter w, IVal booleanValue) {\r
+ CodeWriter end = w.createBlock();\r
+ w.branchAwayUnless(booleanValue, end.getContinuation());\r
+ nextOp(w);\r
+ if(w.isUnfinished())\r
+ w.jump(end.getContinuation());\r
+ w.continueAs(end);\r
+ }\r
+}\r