--- jsr166/src/main/java/util/ArrayDeque.java 2016/10/29 21:04:52 1.96 +++ jsr166/src/main/java/util/ArrayDeque.java 2016/10/30 16:32:40 1.99 @@ -370,10 +370,10 @@ public class ArrayDeque extends Abstr int s, h; if ((s = size) <= 0) return null; - final Object[] elements = this.elements; - @SuppressWarnings("unchecked") E e = (E) elements[h = head]; - elements[h] = null; - if (++h >= elements.length) h = 0; + final Object[] es = elements; + @SuppressWarnings("unchecked") E e = (E) es[h = head]; + es[h] = null; + if (++h >= es.length) h = 0; head = h; size = s - 1; return e; @@ -384,10 +384,10 @@ public class ArrayDeque extends Abstr final int s, tail; if ((s = size) <= 0) return null; - final Object[] elements = this.elements; + final Object[] es = elements; @SuppressWarnings("unchecked") - E e = (E) elements[tail = add(head, s - 1, elements.length)]; - elements[tail] = null; + E e = (E) es[tail = add(head, s - 1, es.length)]; + es[tail] = null; size = s - 1; return e; } @@ -409,8 +409,8 @@ public class ArrayDeque extends Abstr // checkInvariants(); final int s; if ((s = size) <= 0) throw new NoSuchElementException(); - final Object[] elements = this.elements; - return (E) elements[add(head, s - 1, elements.length)]; + final Object[] es = elements; + return (E) es[add(head, s - 1, es.length)]; } public E peekFirst() { @@ -423,8 +423,8 @@ public class ArrayDeque extends Abstr // checkInvariants(); final int s; if ((s = size) <= 0) return null; - final Object[] elements = this.elements; - return (E) elements[add(head, s - 1, elements.length)]; + final Object[] es = elements; + return (E) es[add(head, s - 1, es.length)]; } /** @@ -441,14 +441,13 @@ public class ArrayDeque extends Abstr */ public boolean removeFirstOccurrence(Object o) { if (o != null) { - final Object[] elements = this.elements; - final int capacity = elements.length; + final Object[] es = elements; int i, end, to, todo; todo = (end = (i = head) + size) - - (to = (capacity - end >= 0) ? end : capacity); + - (to = (es.length - end >= 0) ? end : es.length); for (;; to = todo, i = 0, todo = 0) { for (; i < to; i++) - if (o.equals(elements[i])) { + if (o.equals(es[i])) { delete(i); return true; } @@ -472,13 +471,12 @@ public class ArrayDeque extends Abstr */ public boolean removeLastOccurrence(Object o) { if (o != null) { - final Object[] elements = this.elements; - final int capacity = elements.length; + final Object[] es = elements; int i, to, end, todo; todo = (to = ((end = (i = tail()) - size) >= -1) ? end : -1) - end; - for (;; to = (i = capacity - 1) - todo, todo = 0) { + for (;; to = (i = es.length - 1) - todo, todo = 0) { for (; i > to; i--) - if (o.equals(elements[i])) { + if (o.equals(es[i])) { delete(i); return true; } @@ -614,8 +612,8 @@ public class ArrayDeque extends Abstr */ boolean delete(int i) { // checkInvariants(); - final Object[] elements = this.elements; - final int capacity = elements.length; + final Object[] es = elements; + final int capacity = es.length; final int h = head; int front; // number of elements before to-be-deleted elt if ((front = i - h) < 0) front += capacity; @@ -623,13 +621,13 @@ public class ArrayDeque extends Abstr if (front < back) { // move front elements forwards if (h <= i) { - System.arraycopy(elements, h, elements, h + 1, front); + System.arraycopy(es, h, es, h + 1, front); } else { // Wrap around - System.arraycopy(elements, 0, elements, 1, i); - elements[0] = elements[capacity - 1]; - System.arraycopy(elements, h, elements, h + 1, front - (i + 1)); + System.arraycopy(es, 0, es, 1, i); + es[0] = es[capacity - 1]; + System.arraycopy(es, h, es, h + 1, front - (i + 1)); } - elements[h] = null; + es[h] = null; if ((head = (h + 1)) >= capacity) head = 0; size--; // checkInvariants(); @@ -638,14 +636,14 @@ public class ArrayDeque extends Abstr // move back elements backwards int tail = tail(); if (i <= tail) { - System.arraycopy(elements, i + 1, elements, i, back); + System.arraycopy(es, i + 1, es, i, back); } else { // Wrap around int firstLeg = capacity - (i + 1); - System.arraycopy(elements, i + 1, elements, i, firstLeg); - elements[capacity - 1] = elements[0]; - System.arraycopy(elements, 1, elements, 0, back - firstLeg - 1); + System.arraycopy(es, i + 1, es, i, firstLeg); + es[capacity - 1] = es[0]; + System.arraycopy(es, 1, es, 0, back - firstLeg - 1); } - elements[tail] = null; + es[tail] = null; size--; // checkInvariants(); return true; @@ -710,10 +708,10 @@ public class ArrayDeque extends Abstr public E next() { if (remaining <= 0) throw new NoSuchElementException(); - final Object[] elements = ArrayDeque.this.elements; - E e = nonNullElementAt(elements, cursor); + final Object[] es = elements; + E e = nonNullElementAt(es, cursor); lastRet = cursor; - if (++cursor >= elements.length) cursor = 0; + if (++cursor >= es.length) cursor = 0; remaining--; return e; } @@ -731,6 +729,7 @@ public class ArrayDeque extends Abstr } public void forEachRemaining(Consumer action) { + Objects.requireNonNull(action); final int k; if ((k = remaining) > 0) { remaining = 0; @@ -747,10 +746,10 @@ public class ArrayDeque extends Abstr public final E next() { if (remaining <= 0) throw new NoSuchElementException(); - final Object[] elements = ArrayDeque.this.elements; - E e = nonNullElementAt(elements, cursor); + final Object[] es = elements; + E e = nonNullElementAt(es, cursor); lastRet = cursor; - if (--cursor < 0) cursor = elements.length - 1; + if (--cursor < 0) cursor = es.length - 1; remaining--; return e; } @@ -761,12 +760,20 @@ public class ArrayDeque extends Abstr } public final void forEachRemaining(Consumer action) { + Objects.requireNonNull(action); final int k; if ((k = remaining) > 0) { remaining = 0; - forEachRemainingDescending(action, elements, cursor, k); + final Object[] es = elements; + int i, end, to, todo; + todo = (to = ((end = (i = cursor) - k) >= -1) ? end : -1) - end; + for (;; to = (i = es.length - 1) - todo, todo = 0) { + for (; i > to; i--) + action.accept(nonNullElementAt(es, i)); + if (todo == 0) break; + } if ((lastRet = cursor - (k - 1)) < 0) - lastRet += elements.length; + lastRet += es.length; } } } @@ -824,6 +831,7 @@ public class ArrayDeque extends Abstr } public void forEachRemaining(Consumer action) { + Objects.requireNonNull(action); final int k = remaining(); // side effect! remaining = 0; ArrayDeque.forEachRemaining(action, elements, cursor, k); @@ -855,14 +863,13 @@ public class ArrayDeque extends Abstr @SuppressWarnings("unchecked") public void forEach(Consumer action) { Objects.requireNonNull(action); - final Object[] elements = this.elements; - final int capacity = elements.length; + final Object[] es = elements; int i, end, to, todo; todo = (end = (i = head) + size) - - (to = (capacity - end >= 0) ? end : capacity); + - (to = (es.length - end >= 0) ? end : es.length); for (;; to = todo, i = 0, todo = 0) { for (; i < to; i++) - action.accept((E) elements[i]); + action.accept((E) es[i]); if (todo == 0) break; } // checkInvariants(); @@ -874,28 +881,13 @@ public class ArrayDeque extends Abstr * checks for concurrent modification, for use in iterators. */ static void forEachRemaining( - Consumer action, Object[] elements, int i, int remaining) { - Objects.requireNonNull(action); - final int capacity = elements.length; + Consumer action, Object[] es, int i, int remaining) { int end, to, todo; todo = (end = i + remaining) - - (to = (capacity - end >= 0) ? end : capacity); + - (to = (es.length - end >= 0) ? end : es.length); for (;; to = todo, i = 0, todo = 0) { for (; i < to; i++) - action.accept(nonNullElementAt(elements, i)); - if (todo == 0) break; - } - } - - static void forEachRemainingDescending( - Consumer action, Object[] elements, int i, int remaining) { - Objects.requireNonNull(action); - final int capacity = elements.length; - int end, to, todo; - todo = (to = ((end = i - remaining) >= -1) ? end : -1) - end; - for (;; to = (i = capacity - 1) - todo, todo = 0) { - for (; i > to; i--) - action.accept(nonNullElementAt(elements, i)); + action.accept(nonNullElementAt(es, i)); if (todo == 0) break; } } @@ -907,16 +899,16 @@ public class ArrayDeque extends Abstr * @param operator the operator to apply to each element * @since TBD */ + @SuppressWarnings("unchecked") /* public */ void replaceAll(UnaryOperator operator) { Objects.requireNonNull(operator); - final Object[] elements = this.elements; - final int capacity = elements.length; + final Object[] es = elements; int i, end, to, todo; todo = (end = (i = head) + size) - - (to = (capacity - end >= 0) ? end : capacity); + - (to = (es.length - end >= 0) ? end : es.length); for (;; to = todo, i = 0, todo = 0) { for (; i < to; i++) - elements[i] = operator.apply(elementAt(i)); + es[i] = operator.apply((E) es[i]); if (todo == 0) break; } // checkInvariants(); @@ -949,17 +941,17 @@ public class ArrayDeque extends Abstr /** Implementation of bulk remove methods. */ private boolean bulkRemove(Predicate filter) { // checkInvariants(); - final Object[] elements = this.elements; - final int capacity = elements.length; + final Object[] es = elements; + final int capacity = es.length; int i = head, j = i, remaining = size, deleted = 0; try { for (; remaining > 0; remaining--) { - @SuppressWarnings("unchecked") E e = (E) elements[i]; + @SuppressWarnings("unchecked") E e = (E) es[i]; if (filter.test(e)) deleted++; else { if (j != i) - elements[j] = e; + es[j] = e; if (++j >= capacity) j = 0; } if (++i >= capacity) i = 0; @@ -968,14 +960,14 @@ public class ArrayDeque extends Abstr } catch (Throwable ex) { if (deleted > 0) for (; remaining > 0; remaining--) { - elements[j] = elements[i]; + es[j] = es[i]; if (++i >= capacity) i = 0; if (++j >= capacity) j = 0; } throw ex; } finally { size -= deleted; - clearSlice(elements, j, deleted); + clearSlice(es, j, deleted); // checkInvariants(); } } @@ -990,14 +982,13 @@ public class ArrayDeque extends Abstr */ public boolean contains(Object o) { if (o != null) { - final Object[] elements = this.elements; - final int capacity = elements.length; + final Object[] es = elements; int i, end, to, todo; todo = (end = (i = head) + size) - - (to = (capacity - end >= 0) ? end : capacity); + - (to = (es.length - end >= 0) ? end : es.length); for (;; to = todo, i = 0, todo = 0) { for (; i < to; i++) - if (o.equals(elements[i])) + if (o.equals(es[i])) return true; if (todo == 0) break; } @@ -1033,14 +1024,16 @@ public class ArrayDeque extends Abstr } /** - * Nulls out count elements, starting at array index from. + * Nulls out count elements, starting at array index i. */ - private static void clearSlice(Object[] es, int from, int count) { - final int capacity = es.length, end = from + count; - final int leg = (capacity - end >= 0) ? end : capacity; - Arrays.fill(es, from, leg, null); - if (leg != end) - Arrays.fill(es, 0, end - capacity, null); + private static void clearSlice(Object[] es, int i, int count) { + int end, to, todo; + todo = (end = i + count) + - (to = (es.length - end >= 0) ? end : es.length); + for (;; to = todo, i = 0, todo = 0) { + Arrays.fill(es, i, to, null); + if (todo == 0) break; + } } /** @@ -1061,19 +1054,19 @@ public class ArrayDeque extends Abstr } private T[] toArray(Class klazz) { - final Object[] elements = this.elements; - final int capacity = elements.length; + final Object[] es = elements; + final int capacity = es.length; final int head = this.head, end = head + size; final T[] a; if (end >= 0) { - a = Arrays.copyOfRange(elements, head, end, klazz); + a = Arrays.copyOfRange(es, head, end, klazz); } else { // integer overflow! - a = Arrays.copyOfRange(elements, 0, size, klazz); - System.arraycopy(elements, head, a, 0, capacity - head); + a = Arrays.copyOfRange(es, 0, size, klazz); + System.arraycopy(es, head, a, 0, capacity - head); } if (end - capacity > 0) - System.arraycopy(elements, 0, a, capacity - head, end - capacity); + System.arraycopy(es, 0, a, capacity - head, end - capacity); return a; } @@ -1115,16 +1108,15 @@ public class ArrayDeque extends Abstr */ @SuppressWarnings("unchecked") public T[] toArray(T[] a) { - final int size = this.size; - if (size > a.length) + final int size; + if ((size = this.size) > a.length) return toArray((Class) a.getClass()); - final Object[] elements = this.elements; - final int capacity = elements.length; + final Object[] es = elements; final int head = this.head, end = head + size; - final int front = (capacity - end >= 0) ? size : capacity - head; - System.arraycopy(elements, head, a, 0, front); - if (front != size) - System.arraycopy(elements, 0, a, capacity - head, end - capacity); + final int front = (es.length - end >= 0) ? size : es.length - head; + System.arraycopy(es, head, a, 0, front); + if (front < size) + System.arraycopy(es, 0, a, front, size - front); if (size < a.length) a[size] = null; return a; @@ -1167,14 +1159,13 @@ public class ArrayDeque extends Abstr s.writeInt(size); // Write out elements in order. - final Object[] elements = this.elements; - final int capacity = elements.length; + final Object[] es = elements; int i, end, to, todo; todo = (end = (i = head) + size) - - (to = (capacity - end >= 0) ? end : capacity); + - (to = (es.length - end >= 0) ? end : es.length); for (;; to = todo, i = 0, todo = 0) { for (; i < to; i++) - s.writeObject(elements[i]); + s.writeObject(es[i]); if (todo == 0) break; } }