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.18 by jsr166, Fri Sep 16 04:41:04 2005 UTC vs.
Revision 1.21 by dl, Fri Sep 16 23:17:05 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, t);
522 >            }
523 >            return true;
524 >        }
525      }
526  
527      // *** Collection Methods ***
# Line 790 | Line 802 | public class ArrayDeque<E> extends Abstr
802          s.defaultWriteObject();
803  
804          // Write out size
805 <        int size = size();
794 <        s.writeInt(size);
805 >        s.writeInt(size());
806  
807          // Write out elements in order.
797        int i = head;
808          int mask = elements.length - 1;
809 <        for (int j = 0; j < size; j++) {
809 >        for (int i = head; i != tail; i = (i + 1) & mask)
810              s.writeObject(elements[i]);
801            i = (i + 1) & mask;
802        }
811      }
812  
813      /**

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines