]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.db.impl/src/org/simantics/db/impl/query/CacheCollectionResult.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.db.impl / src / org / simantics / db / impl / query / CacheCollectionResult.java
diff --git a/bundles/org.simantics.db.impl/src/org/simantics/db/impl/query/CacheCollectionResult.java b/bundles/org.simantics.db.impl/src/org/simantics/db/impl/query/CacheCollectionResult.java
new file mode 100644 (file)
index 0000000..72ca07e
--- /dev/null
@@ -0,0 +1,73 @@
+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