X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics.db.impl%2Fsrc%2Forg%2Fsimantics%2Fdb%2Fimpl%2Fquery%2FCacheCollectionResult.java;fp=bundles%2Forg.simantics.db.impl%2Fsrc%2Forg%2Fsimantics%2Fdb%2Fimpl%2Fquery%2FCacheCollectionResult.java;h=72ca07e65af284507525a35181cf6d99a412c660;hb=969bd23cab98a79ca9101af33334000879fb60c5;hp=0000000000000000000000000000000000000000;hpb=866dba5cd5a3929bbeae85991796acb212338a08;p=simantics%2Fplatform.git 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 index 000000000..72ca07e65 --- /dev/null +++ b/bundles/org.simantics.db.impl/src/org/simantics/db/impl/query/CacheCollectionResult.java @@ -0,0 +1,73 @@ +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 currentLevel; + public ArrayList levels[] = new ArrayList[LEVELS]; + public CacheCollectionResult() { + for(int i=0;i(); + } + } + 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 toCollection() { + ArrayList result = new ArrayList(size()); + for(int i=0;i= 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); + } +} \ No newline at end of file