package de.invesdwin.util.collections.iterable.collection;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.annotation.concurrent.NotThreadSafe;
import de.invesdwin.util.collections.IFastToListProvider;
import de.invesdwin.util.collections.iterable.ICloseableIterator;
import de.invesdwin.util.error.FastNoSuchElementException;
@NotThreadSafe
public class ArrayCloseableIterator<E> implements ICloseableIterator<E>, IFastToListProvider<E> {
private final E[] array;
private final int size;
private int offset;
public ArrayCloseableIterator(final E[] array, final int offset, final int count) {
this.array = array;
this.offset = offset;
this.size = count + offset;
}
public ArrayCloseableIterator(final E[] array) {
this(array, 0, array.length);
}
@Override
public boolean hasNext() {
return offset < size;
}
@Override
public E next() {
if (!hasNext()) {
throw new FastNoSuchElementException("ListCloseableIterator: hasNext returned false");
}
return array[offset++];
}
@Override
public void close() {
offset = size;
}
@Override
public List<E> toList() {
try {
if (offset == 0 && size == array.length) {
return Arrays.asList(array);
} else {
final ArrayList<E> list = new ArrayList<E>();
addAllTo(list);
return list;
}
} finally {
close();
}
}
@Override
public List<E> toList(final List<E> list) {
try {
if (offset == 0 && size == array.length) {
list.addAll(Arrays.asList(array));
} else {
addAllTo(list);
}
return list;
} finally {
close();
}
}
protected void addAllTo(final List<E> list) {
for (int i = offset; i < size; i++) {
list.add(array[i]);
}
}
}