// This software is released into the Public Domain. See copying.txt for details.
package org.openstreetmap.osmosis.core.store;
import java.util.LinkedList;
import java.util.List;
import java.util.NoSuchElementException;
import org.openstreetmap.osmosis.core.lifecycle.ReleasableIterator;
/**
* Allows the contents of several iterators to be combined into a single
* iterator.
*
* @param <T>
* The type of data to be iterated over.
* @author Brett Henderson
*/
public class MultipleSourceIterator<T> implements ReleasableIterator<T> {
private List<ReleasableIterator<T>> sources;
/**
* Creates a new instance.
*
* @param sources
* The input iterators.
*/
public MultipleSourceIterator(List<ReleasableIterator<T>> sources) {
this.sources = new LinkedList<ReleasableIterator<T>>(sources);
}
/**
* {@inheritDoc}
*/
@Override
public boolean hasNext() {
while (sources.size() > 0) {
if (sources.get(0).hasNext()) {
return true;
} else {
sources.remove(0).close();
}
}
return false;
}
/**
* {@inheritDoc}
*/
@Override
public T next() {
if (!hasNext()) {
throw new NoSuchElementException();
}
return sources.get(0).next();
}
/**
* {@inheritDoc}
*/
@Override
public void remove() {
throw new UnsupportedOperationException();
}
/**
* {@inheritDoc}
*/
@Override
public void close() {
for (ReleasableIterator<T> source : sources) {
source.close();
}
}
}