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.16 by dl, Wed Sep 14 23:49:59 2005 UTC vs.
Revision 1.19 by dl, Fri Sep 16 11:15:41 2005 UTC

# Line 538 | Line 538 | public class ArrayDeque<E> extends Abstr
538       * order that elements would be dequeued (via successive calls to
539       * {@link #remove} or popped (via successive calls to {@link #pop}).
540       *
541 <     * @return an <tt>Iterator</tt> over the elements in this deque
541 >     * @return an iterator over the elements in this deque
542       */
543      public Iterator<E> iterator() {
544          return new DeqIterator();
545      }
546  
547    /**
548     * Returns an iterator over the elements in this deque in reverse
549     * sequential order.  The elements will be returned in order from
550     * last (tail) to first (head).
551     *
552     * @return an iterator over the elements in this deque in reverse
553     * sequence
554     */
547      public Iterator<E> descendingIterator() {
548          return new DescendingIterator();
549      }
# Line 594 | Line 586 | public class ArrayDeque<E> extends Abstr
586          public void remove() {
587              if (lastRet < 0)
588                  throw new IllegalStateException();
589 <            if (delete(lastRet))
590 <                cursor--;
589 >            if (delete(lastRet)) // if left-shifted, undo increment in next()
590 >                cursor = (cursor - 1) & (elements.length - 1);
591              lastRet = -1;
592              fence = tail;
593          }
# Line 603 | Line 595 | public class ArrayDeque<E> extends Abstr
595  
596  
597      private class DescendingIterator implements Iterator<E> {
598 <        /*
599 <         * This class is nearly a mirror-image of DeqIterator. It
600 <         * shares the same structure, but not many actual lines of
601 <         * code. The only asymmetric part is that to simplify some
602 <         * checks, indices are anded with length mask only on array
603 <         * access rather than on each update.
598 >        /*
599 >         * This class is nearly a mirror-image of DeqIterator, using
600 >         * (tail-1) instead of head for initial cursor, (head-1)
601 >         * instead of tail for fence, and elements.length instead of -1
602 >         * for sentinel. It shares the same structure, but not many
603 >         * actual lines of code.
604           */
605 <        private int cursor = tail - 1;
606 <        private int fence = head - 1;
605 >        private int cursor = (tail - 1) & (elements.length - 1);
606 >        private int fence =  (head - 1) & (elements.length - 1);
607          private int lastRet = elements.length;
608  
609          public boolean hasNext() {
# Line 622 | Line 614 | public class ArrayDeque<E> extends Abstr
614              E result;
615              if (cursor == fence)
616                  throw new NoSuchElementException();
617 <            if ((head - 1) != fence ||
618 <                (result = elements[cursor & (elements.length-1)]) == null)
617 >            if (((head - 1) & (elements.length - 1)) != fence ||
618 >                (result = elements[cursor]) == null)
619                  throw new ConcurrentModificationException();
620              lastRet = cursor;
621 <            cursor--;
621 >            cursor = (cursor - 1) & (elements.length - 1);
622              return result;
623          }
624  
625          public void remove() {
626              if (lastRet >= elements.length)
627                  throw new IllegalStateException();
628 <            if (delete(lastRet & (elements.length-1)))
629 <                cursor++;
628 >            if (!delete(lastRet))
629 >                cursor = (cursor + 1) & (elements.length - 1);
630              lastRet = elements.length;
631 <            fence = head - 1;
631 >            fence = (head - 1) & (elements.length - 1);
632          }
633      }
634  
# Line 798 | Line 790 | public class ArrayDeque<E> extends Abstr
790          s.defaultWriteObject();
791  
792          // Write out size
793 <        int size = size();
802 <        s.writeInt(size);
793 >        s.writeInt(size());
794  
795          // Write out elements in order.
805        int i = head;
796          int mask = elements.length - 1;
797 <        for (int j = 0; j < size; j++) {
797 >        for (int i = head; i != tail; i = (i + 1) & mask)
798              s.writeObject(elements[i]);
809            i = (i + 1) & mask;
810        }
799      }
800  
801      /**

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines