--- /dev/null
+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
+}
\ No newline at end of file