]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.runtime/src/org/simantics/scl/runtime/chr/PriorityContainer.java
Merge "Improved Statement API in Simantics/DB"
[simantics/platform.git] / bundles / org.simantics.scl.runtime / src / org / simantics / scl / runtime / chr / PriorityContainer.java
1 package org.simantics.scl.runtime.chr;
2
3 import java.util.Arrays;
4
5 class PriorityContainer {
6     private static final boolean CLEANUP_ENABLED = true;
7     
8     final int priority;
9     Fact[] facts = new Fact[4];
10     int size;
11
12     public PriorityContainer(int priority) {
13         this.priority = priority;
14     }
15     
16     public void push(Fact item) {
17         if(size == facts.length)
18             increaseCapacity();
19         facts[size++] = item;
20     }
21
22     private void increaseCapacity() {
23         if(CLEANUP_ENABLED) {
24             // Cleanup dead facts
25             int j=0;
26             for(int i=0;i<size;++i) {
27                 Fact fact = facts[i];
28                 if(fact.isAlive())
29                     facts[j++] = fact;
30             }
31             size = j;
32         }
33         
34         // Resize if necessary
35         if(size >= facts.length*3/4)
36             facts = Arrays.copyOf(facts, size*2);
37     }
38
39     public Fact pop() {
40         return facts[--size];
41     }
42 }