]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.runtime/src/org/simantics/scl/runtime/chr/PriorityContainer.java
Merged changes from feature/scl to master.
[simantics/platform.git] / bundles / org.simantics.scl.runtime / src / org / simantics / scl / runtime / chr / PriorityContainer.java
diff --git a/bundles/org.simantics.scl.runtime/src/org/simantics/scl/runtime/chr/PriorityContainer.java b/bundles/org.simantics.scl.runtime/src/org/simantics/scl/runtime/chr/PriorityContainer.java
new file mode 100644 (file)
index 0000000..a19658e
--- /dev/null
@@ -0,0 +1,42 @@
+package org.simantics.scl.runtime.chr;\r
+\r
+import java.util.Arrays;\r
+\r
+class PriorityContainer {\r
+    private static final boolean CLEANUP_ENABLED = true;\r
+    \r
+    final int priority;\r
+    Fact[] facts = new Fact[4];\r
+    int size;\r
+\r
+    public PriorityContainer(int priority) {\r
+        this.priority = priority;\r
+    }\r
+    \r
+    public void push(Fact item) {\r
+        if(size == facts.length)\r
+            increaseCapacity();\r
+        facts[size++] = item;\r
+    }\r
+\r
+    private void increaseCapacity() {\r
+        if(CLEANUP_ENABLED) {\r
+            // Cleanup dead facts\r
+            int j=0;\r
+            for(int i=0;i<size;++i) {\r
+                Fact fact = facts[i];\r
+                if(fact.isAlive())\r
+                    facts[j++] = fact;\r
+            }\r
+            size = j;\r
+        }\r
+        \r
+        // Resize if necessary\r
+        if(size >= facts.length*3/4)\r
+            facts = Arrays.copyOf(facts, size*2);\r
+    }\r
+\r
+    public Fact pop() {\r
+        return facts[--size];\r
+    }\r
+}\r