package com.googlecode.mp4parser.util;
import java.util.AbstractList;
import java.util.Iterator;
import java.util.List;
import java.util.NoSuchElementException;
/**
* This lazy list tries to postpone the size() call as much as possible.
*/
public class LazyList<E> extends AbstractList<E> {
private static final Logger LOG = Logger.getLogger(LazyList.class);
List<E> underlying;
Iterator<E> elementSource;
public LazyList(List<E> underlying, Iterator<E> elementSource) {
this.underlying = underlying;
this.elementSource = elementSource;
}
public List<E> getUnderlying() {
return underlying;
}
private void blowup() {
LOG.logDebug("blowup running");
while (elementSource.hasNext()) {
underlying.add(elementSource.next());
}
}
public E get(int i) {
if (underlying.size() > i) {
return underlying.get(i);
} else {
if (elementSource.hasNext()) {
underlying.add(elementSource.next());
return get(i);
} else {
throw new NoSuchElementException();
}
}
}
public Iterator<E> iterator() {
return new Iterator<E>() {
int pos = 0;
public boolean hasNext() {
return pos < underlying.size() || elementSource.hasNext();
}
public E next() {
if (pos < underlying.size()) {
return underlying.get(pos++);
} else {
underlying.add(elementSource.next());
return next();
}
}
public void remove() {
throw new UnsupportedOperationException();
}
};
}
@Override
public int size() {
LOG.logDebug("potentially expensive size() call");
blowup();
return underlying.size();
}
}