]> gerrit.simantics Code Review - simantics/platform.git/blob - 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
1 package org.simantics.db.impl.query;\r
2 \r
3 import java.util.ArrayList;\r
4 import java.util.Collection;\r
5 \r
6 public class CacheCollectionResult {\r
7         public static final int LEVELS = 10;\r
8         private int level = 0;\r
9         private int position = -1;\r
10         private int currentLength = 0;\r
11         private int size = 0;\r
12         private ArrayList<CacheEntryBase> currentLevel;\r
13         public ArrayList<CacheEntryBase> levels[] = new ArrayList[LEVELS];\r
14         public CacheCollectionResult() {\r
15                 for(int i=0;i<LEVELS;i++) {\r
16                         levels[i] = new ArrayList<CacheEntryBase>();\r
17                 }\r
18         }\r
19         public void add(CacheEntryBase entry) {\r
20                 short level = entry.getLevel();\r
21                 if(level < (LEVELS-1)) levels[level].add(entry);\r
22                 else levels[(LEVELS-1)].add(entry);\r
23                 size++;\r
24         }\r
25         public Collection<CacheEntryBase> toCollection() {\r
26                 ArrayList<CacheEntryBase> result = new ArrayList<CacheEntryBase>(size());\r
27                 for(int i=0;i<LEVELS;i++)\r
28                         result.addAll(levels[i]);\r
29                 return result;\r
30         }\r
31         public int size() {\r
32                 return size;\r
33         }\r
34         public boolean isAtStart() {\r
35                 return level == 0 && position == -1;\r
36         }\r
37         public void restart() {\r
38                 level = 0;\r
39                 position = -1;\r
40                 currentLevel = levels[0];\r
41                 currentLength = currentLevel.size();\r
42         }\r
43         public CacheEntryBase next(int maxLevel) {\r
44                 //System.err.println("next " + position + " " + level);\r
45                 position++;\r
46                 if(position >= currentLength) {\r
47                         if(level == (LEVELS-1)) return null;\r
48                         if(level == maxLevel) return null;\r
49                         level++;\r
50                         position=-1;\r
51                         currentLevel = levels[level];\r
52                         currentLength = currentLevel.size();\r
53                         return next(maxLevel);\r
54                 }\r
55                 return currentLevel.get(position);\r
56         }\r
57         public void remove() {\r
58                 int lastPosition = currentLevel.size()-1;\r
59                 CacheEntryBase last = currentLevel.remove(lastPosition);\r
60                 if(lastPosition > position) {\r
61                         currentLevel.set(position, last);\r
62                 }\r
63                 currentLength--;\r
64                 position--;\r
65                 size--;\r
66         }\r
67         public void setLevel(CacheEntryBase current, int level) {\r
68                 if(level == current.level) return;\r
69                 current.level = (short)level;\r
70                 remove();\r
71                 add(current);\r
72         }\r
73 }