package com.limegroup.gnutella.library;
import java.util.Iterator;
import java.util.NoSuchElementException;
import org.limewire.collection.IntSet;
import org.limewire.collection.IntSet.IntSetIterator;
/**
* This class assumes that a lock is held on the FileList being iterated.
*/
class FileViewIterator implements Iterator<FileDesc> {
private final FileView fileList;
private final IntSetIterator iter;
private FileDesc preview;
public FileViewIterator(FileView fileList, IntSet intSet) {
this.fileList = fileList;
this.iter = intSet.iterator();
}
/**
* Peeks at the next non-null FileDesc in the IntSet, and stores its value.
*
* @return true if the list has a next value, false otherwise.
*/
private boolean getPreview() {
assert preview == null;
while (iter.hasNext() && preview == null) {
preview = fileList.getFileDescForIndex(iter.next());
}
return preview != null;
}
@Override
public boolean hasNext() {
return preview != null || getPreview();
}
@Override
public FileDesc next() {
if (hasNext()) {
FileDesc item = preview;
preview = null;
return item;
}
throw new NoSuchElementException();
}
@Override
public void remove() {
throw new UnsupportedOperationException();
}
}