Introduces specialized iterator impl for ArrayList

This enables better optimizations via type-tightening and
enables further code removal with upcoming configurable
checks.

Change-Id: I48346aee653f41326c1d081c5bbb17d31206d7b2
diff --git a/user/super/com/google/gwt/emul/java/util/ArrayList.java b/user/super/com/google/gwt/emul/java/util/ArrayList.java
index d5c200e..6268efb 100644
--- a/user/super/com/google/gwt/emul/java/util/ArrayList.java
+++ b/user/super/com/google/gwt/emul/java/util/ArrayList.java
@@ -16,9 +16,11 @@
 package java.util;
 
 import static javaemul.internal.InternalPreconditions.checkArgument;
+import static javaemul.internal.InternalPreconditions.checkElement;
 import static javaemul.internal.InternalPreconditions.checkElementIndex;
 import static javaemul.internal.InternalPreconditions.checkPositionIndex;
 import static javaemul.internal.InternalPreconditions.checkPositionIndexes;
+import static javaemul.internal.InternalPreconditions.checkState;
 
 import java.io.Serializable;
 
@@ -135,6 +137,34 @@
   }
 
   @Override
+  public Iterator<E> iterator() {
+    return new Iterator<E>() {
+      int i = 0, last = -1;
+
+      @Override
+      public boolean hasNext() {
+        return i < array.length;
+      }
+
+      @Override
+      public E next() {
+        checkElement(hasNext());
+
+        last = i++;
+        return array[last];
+      }
+
+      @Override
+      public void remove() {
+        checkState(last != -1);
+
+        ArrayList.this.remove(i = last);
+        last = -1;
+      }
+    };
+  }
+
+  @Override
   public boolean isEmpty() {
     return array.length == 0;
   }