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;
}