in query/src/main/java/jetbrains/exodus/query/InMemoryMergeSortIterableWithArrayList.java [53:85]
public Entity next() {
if (src == null) {
init();
}
final Comparator<Entity> comparator = getComparator();
int segment = 1;
// next[current] is index of the least remaining element on current segment
// next[current] == -1 means minimum on current segment is not counted yet
// next[current] == src.size() means current segment is exhausted
while (next[1] < 0) {
segment <<= 1;
if (segment >= size2 || (next[segment] >= 0 && next[segment + 1] >= 0)) {
if ((next[segment + 1] >= src.size()) || ((next[segment] < src.size()) && (comparator.compare(src.get(next[segment]), src.get(next[segment + 1])) <= 0))) {
next[segment >> 1] = next[segment];
} else {
next[segment >> 1] = next[segment + 1];
}
segment >>= 2;
} else if (next[segment] >= 0) {
segment++;
}
}
int r = next[1];
if (r >= src.size()) {
throw new NoSuchElementException();
}
next[r + size2] = src.size();
for (int i = (r + size2) >> 1; i >= 1; i >>= 1) {
next[i] = -1;
}
current++;
return src.get(r);
}