package com.indyforge.twod.engine.util.iteration; import java.util.Iterator; import java.util.NoSuchElementException; /** * A simple array iterator. You can specify the direction of iteration. The * {@link Iterator#remove()} is not supported. * * @author Christopher Probst * * @param <E> * The iteration type. */ public final class ArrayIterator<E> implements Iterator<E>, Iterable<E> { // The internal array private final Object[] elements; // The ascending flag private final boolean ascending; // The index of this iterator private int index; /** * Creates a new ascending array iterator. * * @param elements * The elements. */ public ArrayIterator(E... elements) { this(true, elements); } /** * Creates a new array iterator. * * @param ascending * The ascending-flag. * @param elements * The elements. */ public ArrayIterator(boolean ascending, E... elements) { // Save the elements this.elements = elements; // Save the ascending-flag this.ascending = ascending; // Evaluate the flag and setup the index index = elements != null && elements.length > 0 ? (ascending ? 0 : elements.length - 1) : -1; } /* * (non-Javadoc) * * @see java.lang.Iterable#iterator() */ @SuppressWarnings("unchecked") @Override public Iterator<E> iterator() { return new ArrayIterator<E>(ascending, (E[]) elements); } /* * (non-Javadoc) * * @see java.util.Iterator#hasNext() */ @Override public boolean hasNext() { return index >= 0 && index < elements.length; } /* * (non-Javadoc) * * @see java.util.Iterator#next() */ @SuppressWarnings("unchecked") @Override public E next() { if (!hasNext()) { throw new NoSuchElementException(); } return (E) elements[ascending ? index++ : index--]; } /* * (non-Javadoc) * * @see java.util.Iterator#remove() */ @Override public void remove() { throw new UnsupportedOperationException(); } }