-package org.simantics.db.impl.query;\r
-\r
-import java.util.ArrayList;\r
-import java.util.Collection;\r
-\r
-public class CacheCollectionResult {\r
- public static final int LEVELS = 10;\r
- private int level = 0;\r
- private int position = -1;\r
- private int currentLength = 0;\r
- private int size = 0;\r
- private ArrayList<CacheEntryBase> currentLevel;\r
- public ArrayList<CacheEntryBase> levels[] = new ArrayList[LEVELS];\r
- public CacheCollectionResult() {\r
- for(int i=0;i<LEVELS;i++) {\r
- levels[i] = new ArrayList<CacheEntryBase>();\r
- }\r
- }\r
- public void add(CacheEntryBase entry) {\r
- short level = entry.getLevel();\r
- if(level < (LEVELS-1)) levels[level].add(entry);\r
- else levels[(LEVELS-1)].add(entry);\r
- size++;\r
- }\r
- public Collection<CacheEntryBase> toCollection() {\r
- ArrayList<CacheEntryBase> result = new ArrayList<CacheEntryBase>(size());\r
- for(int i=0;i<LEVELS;i++)\r
- result.addAll(levels[i]);\r
- return result;\r
- }\r
- public int size() {\r
- return size;\r
- }\r
- public boolean isAtStart() {\r
- return level == 0 && position == -1;\r
- }\r
- public void restart() {\r
- level = 0;\r
- position = -1;\r
- currentLevel = levels[0];\r
- currentLength = currentLevel.size();\r
- }\r
- public CacheEntryBase next(int maxLevel) {\r
- //System.err.println("next " + position + " " + level);\r
- position++;\r
- if(position >= currentLength) {\r
- if(level == (LEVELS-1)) return null;\r
- if(level == maxLevel) return null;\r
- level++;\r
- position=-1;\r
- currentLevel = levels[level];\r
- currentLength = currentLevel.size();\r
- return next(maxLevel);\r
- }\r
- return currentLevel.get(position);\r
- }\r
- public void remove() {\r
- int lastPosition = currentLevel.size()-1;\r
- CacheEntryBase last = currentLevel.remove(lastPosition);\r
- if(lastPosition > position) {\r
- currentLevel.set(position, last);\r
- }\r
- currentLength--;\r
- position--;\r
- size--;\r
- }\r
- public void setLevel(CacheEntryBase current, int level) {\r
- if(level == current.level) return;\r
- current.level = (short)level;\r
- remove();\r
- add(current);\r
- }\r
+package org.simantics.db.impl.query;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+public class CacheCollectionResult {
+ public static final int LEVELS = 10;
+ private int level = 0;
+ private int position = -1;
+ private int currentLength = 0;
+ private int size = 0;
+ private ArrayList<CacheEntryBase> currentLevel;
+ public ArrayList<CacheEntryBase> levels[] = new ArrayList[LEVELS];
+ public CacheCollectionResult() {
+ for(int i=0;i<LEVELS;i++) {
+ levels[i] = new ArrayList<CacheEntryBase>();
+ }
+ }
+ public void add(CacheEntryBase entry) {
+ short level = entry.getLevel();
+ if(level < (LEVELS-1)) levels[level].add(entry);
+ else levels[(LEVELS-1)].add(entry);
+ size++;
+ }
+ public Collection<CacheEntryBase> toCollection() {
+ ArrayList<CacheEntryBase> result = new ArrayList<CacheEntryBase>(size());
+ for(int i=0;i<LEVELS;i++)
+ result.addAll(levels[i]);
+ return result;
+ }
+ public int size() {
+ return size;
+ }
+ public boolean isAtStart() {
+ return level == 0 && position == -1;
+ }
+ public void restart() {
+ level = 0;
+ position = -1;
+ currentLevel = levels[0];
+ currentLength = currentLevel.size();
+ }
+ public CacheEntryBase next(int maxLevel) {
+ //System.err.println("next " + position + " " + level);
+ position++;
+ if(position >= currentLength) {
+ if(level == (LEVELS-1)) return null;
+ if(level == maxLevel) return null;
+ level++;
+ position=-1;
+ currentLevel = levels[level];
+ currentLength = currentLevel.size();
+ return next(maxLevel);
+ }
+ return currentLevel.get(position);
+ }
+ public void remove() {
+ int lastPosition = currentLevel.size()-1;
+ CacheEntryBase last = currentLevel.remove(lastPosition);
+ if(lastPosition > position) {
+ currentLevel.set(position, last);
+ }
+ currentLength--;
+ position--;
+ size--;
+ }
+ public void setLevel(CacheEntryBase current, int level) {
+ if(level == current.level) return;
+ current.level = (short)level;
+ remove();
+ add(current);
+ }