de.bwaldvogel.mongo.backend.memory.DocumentIterable Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of mongo-java-server-memory-backend Show documentation
Show all versions of mongo-java-server-memory-backend Show documentation
Fake implementation of MongoDB in Java that speaks the wire protocol
The newest version!
package de.bwaldvogel.mongo.backend.memory;
import java.util.Iterator;
import java.util.List;
import java.util.NoSuchElementException;
import de.bwaldvogel.mongo.bson.Document;
class DocumentIterable implements Iterable {
private final List documents;
private final boolean reversed;
DocumentIterable(List documents) {
this(documents, false);
}
private DocumentIterable(List documents, boolean reversed) {
this.documents = documents;
this.reversed = reversed;
}
DocumentIterable reversed() {
return new DocumentIterable(documents, !reversed);
}
@Override
public Iterator iterator() {
if (!reversed) {
return new DocumentIterator(documents);
} else {
return new ReverseDocumentIterator(documents);
}
}
private abstract static class AbstractDocumentIterator implements Iterator {
int pos;
final List documents;
Document current;
AbstractDocumentIterator(List documents, int pos) {
this.documents = documents;
this.pos = pos;
}
protected abstract Document getNext();
@Override
public boolean hasNext() {
if (current == null) {
current = getNext();
}
return (current != null);
}
@Override
public Document next() {
if (!hasNext()) {
throw new NoSuchElementException();
}
Document document = current;
current = getNext();
return document;
}
@Override
public void remove() {
throw new UnsupportedOperationException();
}
}
private static class DocumentIterator extends AbstractDocumentIterator {
private DocumentIterator(List documents) {
super(documents, 0);
}
@Override
protected Document getNext() {
while (pos < documents.size()) {
Document document = documents.get(pos++);
if (document != null) {
return document;
}
}
return null;
}
}
private static class ReverseDocumentIterator extends AbstractDocumentIterator {
private ReverseDocumentIterator(List documents) {
super(documents, documents.size() - 1);
}
@Override
protected Document getNext() {
while (pos >= 0) {
Document document = documents.get(pos--);
if (document != null) {
return document;
}
}
return null;
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy