-package org.simantics.scl.compiler.elaboration.chr.planning;\r
-\r
-import java.util.Arrays;\r
-\r
-public class PlanPriorityQueue {\r
- PrePlanItem[] items = new PrePlanItem[16];\r
- int size = 0;\r
-\r
- public PrePlanItem head() {\r
- return items[0];\r
- }\r
-\r
- public void pop() {\r
- items[0].queuePos = -1;\r
- --size;\r
- if (size > 0) {\r
- PrePlanItem e = items[size];\r
- items[0] = e;\r
- e.queuePos = 0;\r
- adjustDown(e);\r
- }\r
- items[size] = null;\r
- }\r
-\r
- public void add(PrePlanItem e) {\r
- if (size == items.length)\r
- items = Arrays.copyOf(items, size + size / 2);\r
- items[size] = e;\r
- e.queuePos = size;\r
- ++size;\r
- adjustUp(e);\r
- }\r
-\r
- private boolean adjustUp(PrePlanItem e) {\r
- int pos = e.queuePos;\r
- while (pos > 0) {\r
- int upId = (pos - 1) / 2;\r
- PrePlanItem upE = items[upId];\r
- if (e.compare(upE) >= 0)\r
- break;\r
- items[pos] = upE;\r
- upE.queuePos = pos;\r
- pos = upId;\r
- }\r
- if (e.queuePos != pos) {\r
- items[pos] = e;\r
- e.queuePos = pos;\r
- return true;\r
- } else\r
- return false;\r
- }\r
-\r
- private void adjustDown(PrePlanItem e) {\r
- int pos = e.queuePos;\r
- while (true) {\r
- int downId = pos * 2 + 1;\r
- if (downId >= size)\r
- break;\r
- if (downId + 1 < size\r
- && items[downId].compare(items[downId + 1]) > 0)\r
- ++downId;\r
- PrePlanItem downE = items[downId];\r
- if (e.compare(downE) > 0) {\r
- items[pos] = downE;\r
- downE.queuePos = pos;\r
- pos = downId;\r
- } else\r
- break;\r
- }\r
- if (e.queuePos != pos) {\r
- items[pos] = e;\r
- e.queuePos = pos;\r
- }\r
- }\r
-\r
- public void adjust(PrePlanItem e) {\r
- if(e.queuePos == -1)\r
- return;\r
- if (!adjustUp(e))\r
- adjustDown(e);\r
- }\r
-\r
- public boolean isEmpty() {\r
- return size == 0;\r
- }\r
-}\r
+package org.simantics.scl.compiler.elaboration.chr.planning;
+
+import java.util.Arrays;
+
+public class PlanPriorityQueue {
+ PrePlanItem[] items = new PrePlanItem[16];
+ int size = 0;
+
+ public PrePlanItem head() {
+ return items[0];
+ }
+
+ public void pop() {
+ items[0].queuePos = -1;
+ --size;
+ if (size > 0) {
+ PrePlanItem e = items[size];
+ items[0] = e;
+ e.queuePos = 0;
+ adjustDown(e);
+ }
+ items[size] = null;
+ }
+
+ public void add(PrePlanItem e) {
+ if (size == items.length)
+ items = Arrays.copyOf(items, size + size / 2);
+ items[size] = e;
+ e.queuePos = size;
+ ++size;
+ adjustUp(e);
+ }
+
+ private boolean adjustUp(PrePlanItem e) {
+ int pos = e.queuePos;
+ while (pos > 0) {
+ int upId = (pos - 1) / 2;
+ PrePlanItem upE = items[upId];
+ if (e.compare(upE) >= 0)
+ break;
+ items[pos] = upE;
+ upE.queuePos = pos;
+ pos = upId;
+ }
+ if (e.queuePos != pos) {
+ items[pos] = e;
+ e.queuePos = pos;
+ return true;
+ } else
+ return false;
+ }
+
+ private void adjustDown(PrePlanItem e) {
+ int pos = e.queuePos;
+ while (true) {
+ int downId = pos * 2 + 1;
+ if (downId >= size)
+ break;
+ if (downId + 1 < size
+ && items[downId].compare(items[downId + 1]) > 0)
+ ++downId;
+ PrePlanItem downE = items[downId];
+ if (e.compare(downE) > 0) {
+ items[pos] = downE;
+ downE.queuePos = pos;
+ pos = downId;
+ } else
+ break;
+ }
+ if (e.queuePos != pos) {
+ items[pos] = e;
+ e.queuePos = pos;
+ }
+ }
+
+ public void adjust(PrePlanItem e) {
+ if(e.queuePos == -1)
+ return;
+ if (!adjustUp(e))
+ adjustDown(e);
+ }
+
+ public boolean isEmpty() {
+ return size == 0;
+ }
+}