]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/chr/plan/PlanContext.java
Merge "Remove unused import in DeleteHandler"
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / elaboration / chr / plan / PlanContext.java
1 package org.simantics.scl.compiler.elaboration.chr.plan;\r
2 \r
3 import java.util.ArrayList;\r
4 \r
5 import org.simantics.scl.compiler.compilation.CompilationContext;\r
6 import org.simantics.scl.compiler.constants.IntegerConstant;\r
7 import org.simantics.scl.compiler.constants.JavaComparisonOperation;\r
8 import org.simantics.scl.compiler.constants.singletons.IncreaseByOne;\r
9 import org.simantics.scl.compiler.constants.singletons.ListElement;\r
10 import org.simantics.scl.compiler.constants.singletons.ListLength;\r
11 import org.simantics.scl.compiler.elaboration.chr.CHRRuleset;\r
12 import org.simantics.scl.compiler.elaboration.expressions.Variable;\r
13 import org.simantics.scl.compiler.internal.codegen.continuations.ICont;\r
14 import org.simantics.scl.compiler.internal.codegen.references.IVal;\r
15 import org.simantics.scl.compiler.internal.codegen.writer.CodeWriter;\r
16 import org.simantics.scl.compiler.types.Type;\r
17 import org.simantics.scl.compiler.types.Types;\r
18 \r
19 public abstract class PlanContext {\r
20     public CompilationContext context;\r
21     public CHRRuleset ruleset;\r
22     public IVal storeVar;\r
23     public ArrayList<PartnerFact> partnerFacts = new ArrayList<PartnerFact>();\r
24     public IVal currentId;\r
25     \r
26     public PlanContext(CompilationContext context, CHRRuleset ruleset, IVal storeVar) {\r
27         this.context = context;\r
28         this.ruleset = ruleset;\r
29         this.storeVar = storeVar;\r
30     }\r
31 \r
32     public abstract void nextOp(CodeWriter w);\r
33 \r
34     public IVal generateNewId(long location, CodeWriter w) {\r
35         if(currentId == null)\r
36             currentId = w.apply(location, ruleset.readCurrentId, storeVar);\r
37         IVal result = currentId;\r
38         currentId = w.apply(location, IncreaseByOne.INSTANCE, currentId);\r
39         return result;\r
40     }\r
41     \r
42     public void iterateList(long location, CodeWriter w, Variable variable, IVal listValue) {\r
43         Type componentType = variable.getType();\r
44         IVal listLength = w.apply(location, ListLength.INSTANCE.createSpecialization(componentType), listValue);\r
45         \r
46         CodeWriter body = w.createBlock(Types.INTEGER);\r
47         ICont bodyContinuation = body.getContinuation();\r
48         CodeWriter end = w.createBlock();\r
49                 \r
50         w.jump(body.getContinuation(), IntegerConstant.ZERO);\r
51         \r
52         IVal index = body.getParameters()[0];\r
53         body.branchAwayIf(body.apply(location, JavaComparisonOperation.IEQUAL, index, listLength),\r
54                 end.getContinuation());\r
55         variable.setVal(body.apply(location, ListElement.INSTANCE.createSpecialization(componentType), listValue, index));\r
56         nextOp(body);\r
57         if(body.isUnfinished())\r
58             body.jump(bodyContinuation, body.apply(location, IncreaseByOne.INSTANCE, index));\r
59         \r
60         w.continueAs(end);\r
61     }\r
62 \r
63     public void check(long location, CodeWriter w, IVal booleanValue) {\r
64         CodeWriter end = w.createBlock();\r
65         w.branchAwayUnless(booleanValue, end.getContinuation());\r
66         nextOp(w);\r
67         if(w.isUnfinished())\r
68             w.jump(end.getContinuation());\r
69         w.continueAs(end);\r
70     }\r
71 }\r