package jetbrains.mps.internal.collections.runtime.impl;
/*Generated by MPS */
import jetbrains.mps.internal.collections.runtime.IEnumerator;
import java.util.NoSuchElementException;
import jetbrains.mps.internal.collections.runtime.Sequence;
public class EnumeratorIterator<T> implements IEnumerator.Iterator<T> {
private final java.util.Iterator<T> delegate;
private T current;
private boolean hasCurrent = false;
private EnumeratorIterator(java.util.Iterator<T> iterator) {
if (iterator == null) {
throw new NullPointerException();
}
delegate = iterator;
}
@Override
public boolean hasNext() {
return delegate.hasNext();
}
@Override
public T next() {
primMoveNext();
return primCurrent();
}
@Override
public void remove() {
delegate.remove();
}
@Override
public T current() {
return primCurrent();
}
@Override
public boolean moveNext() {
return primMoveNext();
}
private T primCurrent() {
if (!(hasCurrent)) {
throw new NoSuchElementException();
}
return current;
}
private boolean primMoveNext() {
hasCurrent = delegate.hasNext();
current = (hasCurrent ? delegate.next() : null);
return hasCurrent;
}
public static <U> IEnumerator.Iterator<U> fromIterator(java.util.Iterator<U> itr) {
if (Sequence.IGNORE_NULL_VALUES) {
if (itr == null) {
return EnumeratorIterator.Empty.instance();
}
}
if (itr instanceof IEnumerator.Iterator) {
return (IEnumerator.Iterator<U>) itr;
}
return new EnumeratorIterator<U>(itr);
}
protected static class Empty<U> implements IEnumerator.Iterator<U> {
private static EnumeratorIterator.Empty<Object> INSTANCE = new EnumeratorIterator.Empty<Object>();
protected Empty() {
}
@Override
public U current() {
throw new NoSuchElementException();
}
@Override
public boolean hasNext() {
return false;
}
@Override
public boolean moveNext() {
return false;
}
@Override
public U next() {
throw new NoSuchElementException();
}
@Override
public void remove() {
throw new UnsupportedOperationException();
}
@SuppressWarnings(value = "unchecked")
public static <V> EnumeratorIterator.Empty<V> instance() {
return (EnumeratorIterator.Empty<V>) INSTANCE;
}
}
}