ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/main/java/util/ArrayDeque.java
(Generate patch)

Comparing jsr166/src/main/java/util/ArrayDeque.java (file contents):
Revision 1.19 by dl, Fri Sep 16 11:15:41 2005 UTC vs.
Revision 1.20 by dl, Fri Sep 16 23:11:13 2005 UTC

# Line 491 | Line 491 | public class ArrayDeque<E> extends Abstr
491       */
492      private boolean delete(int i) {
493          int mask = elements.length - 1;
494 +        int front = (i - head) & mask;
495 +        int back  = (tail - i) & mask;
496  
497          // Invariant: head <= i < tail mod circularity
498 <        if (((i - head) & mask) >= ((tail - head) & mask))
498 >        if (front >= ((tail - head) & mask))
499              throw new ConcurrentModificationException();
500  
501 <        // Case 1: Deque doesn't wrap
502 <        // Case 2: Deque does wrap and removed element is in the head portion
503 <        if (i >= head) {
504 <            System.arraycopy(elements, head, elements, head + 1, i - head);
505 <            elements[head] = null;
506 <            head = (head + 1) & mask;
501 >        // Optimize for least element motion
502 >        if (front < back) {
503 >            if (head <= i) {
504 >                System.arraycopy(elements, head, elements, head + 1, front);
505 >            } else { // Wrap around
506 >                elements[0] = elements[mask];
507 >                System.arraycopy(elements, 0, elements, 1, i);
508 >                System.arraycopy(elements, head, elements, head + 1, mask - head);
509 >            }
510 >            elements[head] = null;
511 >            head = (head + 1) & mask;
512              return false;
513 <        }
514 <
515 <        // Case 3: Deque wraps and removed element is in the tail portion
516 <        tail--;
517 <        System.arraycopy(elements, i + 1, elements, i, tail - i);
518 <        elements[tail] = null;
519 <        return true;
513 >        } else {
514 >            int t = tail;
515 >            tail = (tail - 1) & mask;
516 >            if (i < t) { // Copy the null tail as well
517 >                System.arraycopy(elements, i + 1, elements, i, back);
518 >            } else {    // Wrap around
519 >                elements[mask] = elements[0];
520 >                System.arraycopy(elements, i + 1, elements, i, mask - i);
521 >                System.arraycopy(elements, 1, elements, 0, tail);
522 >            }
523 >            return true;
524 >        }
525      }
526  
527      // *** Collection Methods ***

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines