// This software is released into the Public Domain. See copying.txt for details.
package org.openstreetmap.osmosis.core.store;
import java.util.Comparator;
import java.util.Iterator;
import java.util.NoSuchElementException;
/**
* Iterates over specific range within an index source. It will skip records until
* it reaches the beginning of the range, and stop when it reaches the end of
* the range.
*
* @param <K>
* The index key type.
* @param <T>
* The index record being stored.
* @author Brett Henderson
*/
public class IndexRangeIterator<K, T extends IndexElement<K>> implements Iterator<T> {
private Iterator<T> source;
private K beginKey;
private K endKey;
private Comparator<K> ordering;
private boolean nextRecordAvailable;
private T nextRecord;
/**
* Creates a new instance.
*
* @param source
* The input index source.
* @param beginKey
* The first key for which to return data.
* @param endKey
* The last key for which to return data.
* @param ordering
* The index key ordering to be used for comparing keys.
*/
public IndexRangeIterator(Iterator<T> source, K beginKey, K endKey, Comparator<K> ordering) {
this.source = source;
this.beginKey = beginKey;
this.endKey = endKey;
this.ordering = ordering;
nextRecordAvailable = false;
}
/**
* {@inheritDoc}
*/
@Override
public boolean hasNext() {
while (!nextRecordAvailable) {
K key;
if (!source.hasNext()) {
break;
}
// Get the next record and its key.
nextRecord = source.next();
key = nextRecord.getKey();
// Skip over records with a key lower than beginKey.
if (ordering.compare(key, beginKey) >= 0) {
// No more data is available if we've passed endKey.
if (ordering.compare(nextRecord.getKey(), endKey) > 0) {
break;
}
nextRecordAvailable = true;
}
}
return nextRecordAvailable;
}
/**
* {@inheritDoc}
*/
@Override
public T next() {
if (!hasNext()) {
throw new NoSuchElementException();
}
nextRecordAvailable = false;
return nextRecord;
}
/**
* {@inheritDoc}
*/
@Override
public void remove() {
throw new UnsupportedOperationException();
}
}