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

Comparing jsr166/src/main/java/util/PriorityQueue.java (file contents):
Revision 1.109 by jsr166, Wed Jun 1 16:08:04 2016 UTC vs.
Revision 1.118 by jsr166, Thu Dec 29 23:14:34 2016 UTC

# Line 54 | Line 54 | import java.util.function.Consumer;
54   * <p>This class and its iterator implement all of the
55   * <em>optional</em> methods of the {@link Collection} and {@link
56   * Iterator} interfaces.  The Iterator provided in method {@link
57 < * #iterator()} is <em>not</em> guaranteed to traverse the elements of
57 > * #iterator()} and the Spliterator provided in method {@link #spliterator()}
58 > * are <em>not</em> guaranteed to traverse the elements of
59   * the priority queue in any particular order. If you need ordered
60   * traversal, consider using {@code Arrays.sort(pq.toArray())}.
61   *
# Line 521 | Line 522 | public class PriorityQueue<E> extends Ab
522           */
523          private int expectedModCount = modCount;
524  
525 +        Itr() {}                        // prevent access constructor creation
526 +
527          public boolean hasNext() {
528              return cursor < size ||
529                  (forgetMeNot != null && !forgetMeNot.isEmpty());
# Line 630 | Line 633 | public class PriorityQueue<E> extends Ab
633       * promoting x up the tree until it is greater than or equal to
634       * its parent, or is the root.
635       *
636 <     * To simplify and speed up coercions and comparisons. the
636 >     * To simplify and speed up coercions and comparisons, the
637       * Comparable and Comparator versions are separated into different
638       * methods that are otherwise identical. (Similarly for siftDown.)
639       *
# Line 726 | Line 729 | public class PriorityQueue<E> extends Ab
729      /**
730       * Establishes the heap invariant (described above) in the entire tree,
731       * assuming nothing about the order of the elements prior to the call.
732 +     * This classic algorithm due to Floyd (1964) is known to be O(size).
733       */
734      @SuppressWarnings("unchecked")
735      private void heapify() {
736 <        for (int i = (size >>> 1) - 1; i >= 0; i--)
737 <            siftDown(i, (E) queue[i]);
736 >        final Object[] es = queue;
737 >        int i = (size >>> 1) - 1;
738 >        if (comparator == null)
739 >            for (; i >= 0; i--)
740 >                siftDownComparable(i, (E) es[i]);
741 >        else
742 >            for (; i >= 0; i--)
743 >                siftDownUsingComparator(i, (E) es[i]);
744      }
745  
746      /**
# Line 749 | Line 759 | public class PriorityQueue<E> extends Ab
759      /**
760       * Saves this queue to a stream (that is, serializes it).
761       *
762 +     * @param s the stream
763 +     * @throws java.io.IOException if an I/O error occurs
764       * @serialData The length of the array backing the instance is
765       *             emitted (int), followed by all of its elements
766       *             (each an {@code Object}) in the proper order.
755     * @param s the stream
756     * @throws java.io.IOException if an I/O error occurs
767       */
768      private void writeObject(java.io.ObjectOutputStream s)
769          throws java.io.IOException {
# Line 799 | Line 809 | public class PriorityQueue<E> extends Ab
809      /**
810       * Creates a <em><a href="Spliterator.html#binding">late-binding</a></em>
811       * and <em>fail-fast</em> {@link Spliterator} over the elements in this
812 <     * queue.
812 >     * queue. The spliterator does not traverse elements in any particular order
813 >     * (the {@link Spliterator#ORDERED ORDERED} characteristic is not reported).
814       *
815       * <p>The {@code Spliterator} reports {@link Spliterator#SIZED},
816       * {@link Spliterator#SUBSIZED}, and {@link Spliterator#NONNULL}.
# Line 810 | Line 821 | public class PriorityQueue<E> extends Ab
821       * @since 1.8
822       */
823      public final Spliterator<E> spliterator() {
824 <        return new PriorityQueueSpliterator<>(this, 0, -1, 0);
824 >        return new PriorityQueueSpliterator(0, -1, 0);
825      }
826  
827 <    static final class PriorityQueueSpliterator<E> implements Spliterator<E> {
817 <        /*
818 <         * This is very similar to ArrayList Spliterator, except for
819 <         * extra null checks.
820 <         */
821 <        private final PriorityQueue<E> pq;
827 >    final class PriorityQueueSpliterator implements Spliterator<E> {
828          private int index;            // current index, modified on advance/split
829          private int fence;            // -1 until first use
830          private int expectedModCount; // initialized when fence set
831  
832          /** Creates new spliterator covering the given range. */
833 <        PriorityQueueSpliterator(PriorityQueue<E> pq, int origin, int fence,
828 <                                 int expectedModCount) {
829 <            this.pq = pq;
833 >        PriorityQueueSpliterator(int origin, int fence, int expectedModCount) {
834              this.index = origin;
835              this.fence = fence;
836              this.expectedModCount = expectedModCount;
# Line 835 | Line 839 | public class PriorityQueue<E> extends Ab
839          private int getFence() { // initialize fence to size on first use
840              int hi;
841              if ((hi = fence) < 0) {
842 <                expectedModCount = pq.modCount;
843 <                hi = fence = pq.size;
842 >                expectedModCount = modCount;
843 >                hi = fence = size;
844              }
845              return hi;
846          }
847  
848 <        public PriorityQueueSpliterator<E> trySplit() {
848 >        public PriorityQueueSpliterator trySplit() {
849              int hi = getFence(), lo = index, mid = (lo + hi) >>> 1;
850              return (lo >= mid) ? null :
851 <                new PriorityQueueSpliterator<>(pq, lo, index = mid,
848 <                                               expectedModCount);
851 >                new PriorityQueueSpliterator(lo, index = mid, expectedModCount);
852          }
853  
854          @SuppressWarnings("unchecked")
855          public void forEachRemaining(Consumer<? super E> action) {
853            int i, hi, mc; // hoist accesses and checks from loop
854            PriorityQueue<E> q; Object[] a;
856              if (action == null)
857                  throw new NullPointerException();
858 <            if ((q = pq) != null && (a = q.queue) != null) {
859 <                if ((hi = fence) < 0) {
860 <                    mc = q.modCount;
861 <                    hi = q.size;
862 <                }
863 <                else
864 <                    mc = expectedModCount;
864 <                if ((i = index) >= 0 && (index = hi) <= a.length) {
865 <                    for (E e;; ++i) {
866 <                        if (i < hi) {
867 <                            if ((e = (E) a[i]) == null) // must be CME
868 <                                break;
869 <                            action.accept(e);
870 <                        }
871 <                        else if (q.modCount != mc)
872 <                            break;
873 <                        else
874 <                            return;
875 <                    }
876 <                }
858 >            if (fence < 0) { fence = size; expectedModCount = modCount; }
859 >            final Object[] a = queue;
860 >            int i, hi; E e;
861 >            for (i = index, index = hi = fence; i < hi; i++) {
862 >                if ((e = (E) a[i]) == null)
863 >                    break;      // must be CME
864 >                action.accept(e);
865              }
866 <            throw new ConcurrentModificationException();
866 >            if (modCount != expectedModCount)
867 >                throw new ConcurrentModificationException();
868          }
869  
870 +        @SuppressWarnings("unchecked")
871          public boolean tryAdvance(Consumer<? super E> action) {
872              if (action == null)
873                  throw new NullPointerException();
874 <            int hi = getFence(), lo = index;
875 <            if (lo >= 0 && lo < hi) {
876 <                index = lo + 1;
877 <                @SuppressWarnings("unchecked") E e = (E)pq.queue[lo];
878 <                if (e == null)
874 >            if (fence < 0) { fence = size; expectedModCount = modCount; }
875 >            int i;
876 >            if ((i = index) < fence) {
877 >                index = i + 1;
878 >                E e;
879 >                if ((e = (E) queue[i]) == null
880 >                    || modCount != expectedModCount)
881                      throw new ConcurrentModificationException();
882                  action.accept(e);
891                if (pq.modCount != expectedModCount)
892                    throw new ConcurrentModificationException();
883                  return true;
884              }
885              return false;
886          }
887  
888          public long estimateSize() {
889 <            return (long) (getFence() - index);
889 >            return getFence() - index;
890          }
891  
892          public int characteristics() {

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines