]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.runtime/src/org/simantics/scl/runtime/chr/CHRPriorityFactContainer.java
Merge "Resolve some dependency problems with SDK features"
[simantics/platform.git] / bundles / org.simantics.scl.runtime / src / org / simantics / scl / runtime / chr / CHRPriorityFactContainer.java
1 package org.simantics.scl.runtime.chr;
2
3 import java.util.Arrays;
4
5 import org.simantics.scl.runtime.reporting.SCLReporting;
6
7 public abstract class CHRPriorityFactContainer extends CHRPriority {
8     private static final boolean CLEANUP_ENABLED = true;
9     private static final int INITIAL_FACT_ARRAY_SIZE = 4;
10     
11     private CHRFact[] facts = new CHRFact[INITIAL_FACT_ARRAY_SIZE];
12     private int size;
13
14     public CHRPriorityFactContainer(int priority) {
15         super(priority);
16     }
17
18     public boolean isEmpty() {
19         return size == 0;
20     }
21
22     public void addFact(CHRContext context, CHRFact item) {
23         //SCLReporting.print("added " + item + " to " + this);
24         ensureInContext(context);
25         if(size == facts.length)
26             increaseCapacity();
27         facts[size++] = item;
28     }
29     
30     private void increaseCapacity() {
31         if(CLEANUP_ENABLED) {
32             // Cleanup dead facts
33             int j=0;
34             for(int i=0;i<size;++i) {
35                 CHRFact fact = facts[i];
36                 if(fact.id >= 0)
37                     facts[j++] = fact;
38             }
39             size = j;
40         }
41         
42         // Resize if necessary
43         if(size >= facts.length*3/4)
44             facts = Arrays.copyOf(facts, size*2);
45     }
46
47     @Override
48     public void activate(CHRContext context) {
49         while(size > 0) {
50             --size;
51             CHRFact fact = facts[size];
52             facts[size] = null;
53             if(fact.id >= 0)
54                 activate(context, fact);
55         }
56     }
57
58     protected abstract void activate(CHRContext context, CHRFact fact);
59 }