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.82 by jsr166, Wed Jan 16 21:18:50 2013 UTC vs.
Revision 1.99 by jsr166, Fri Apr 11 21:15:44 2014 UTC

# Line 24 | Line 24
24   */
25  
26   package java.util;
27 + import java.util.function.Consumer;
28   import java.util.stream.Stream;
28 import java.util.Spliterator;
29 import java.util.stream.Streams;
30 import java.util.function.Block;
29  
30   /**
31   * An unbounded priority {@linkplain Queue queue} based on a priority heap.
# Line 67 | Line 65 | import java.util.function.Block;
65   * java.util.concurrent.PriorityBlockingQueue} class.
66   *
67   * <p>Implementation note: this implementation provides
68 < * O(log(n)) time for the enqueing and dequeing methods
68 > * O(log(n)) time for the enqueuing and dequeuing methods
69   * ({@code offer}, {@code poll}, {@code remove()} and {@code add});
70   * linear time for the {@code remove(Object)} and {@code contains(Object)}
71   * methods; and constant time for the retrieval methods
# Line 101 | Line 99 | public class PriorityQueue<E> extends Ab
99      /**
100       * The number of elements in the priority queue.
101       */
102 <    private int size = 0;
102 >    private int size;
103  
104      /**
105       * The comparator, or null if priority queue uses elements'
# Line 451 | Line 449 | public class PriorityQueue<E> extends Ab
449       *         this queue
450       * @throws NullPointerException if the specified array is null
451       */
452 +    @SuppressWarnings("unchecked")
453      public <T> T[] toArray(T[] a) {
454 +        final int size = this.size;
455          if (a.length < size)
456              // Make a new array of a's runtime type, but my contents:
457              return (T[]) Arrays.copyOf(queue, size, a.getClass());
# Line 476 | Line 476 | public class PriorityQueue<E> extends Ab
476           * Index (into queue array) of element to be returned by
477           * subsequent call to next.
478           */
479 <        private int cursor = 0;
479 >        private int cursor;
480  
481          /**
482           * Index of element returned by most recent call to next,
# Line 496 | Line 496 | public class PriorityQueue<E> extends Ab
496           * We expect that most iterations, even those involving removals,
497           * will not need to store elements in this field.
498           */
499 <        private ArrayDeque<E> forgetMeNot = null;
499 >        private ArrayDeque<E> forgetMeNot;
500  
501          /**
502           * Element returned by the most recent call to next iff that
503           * element was drawn from the forgetMeNot list.
504           */
505 <        private E lastRetElt = null;
505 >        private E lastRetElt;
506  
507          /**
508           * The modCount value that the iterator believes that the backing
# Line 541 | Line 541 | public class PriorityQueue<E> extends Ab
541                      cursor--;
542                  else {
543                      if (forgetMeNot == null)
544 <                        forgetMeNot = new ArrayDeque<E>();
544 >                        forgetMeNot = new ArrayDeque<>();
545                      forgetMeNot.add(moved);
546                  }
547              } else if (lastRetElt != null) {
# Line 743 | Line 743 | public class PriorityQueue<E> extends Ab
743       *             emitted (int), followed by all of its elements
744       *             (each an {@code Object}) in the proper order.
745       * @param s the stream
746 +     * @throws java.io.IOException if an I/O error occurs
747       */
748      private void writeObject(java.io.ObjectOutputStream s)
749          throws java.io.IOException {
# Line 762 | Line 763 | public class PriorityQueue<E> extends Ab
763       * (that is, deserializes it).
764       *
765       * @param s the stream
766 +     * @throws ClassNotFoundException if the class of a serialized object
767 +     *         could not be found
768 +     * @throws java.io.IOException if an I/O error occurs
769       */
770      private void readObject(java.io.ObjectInputStream s)
771          throws java.io.IOException, ClassNotFoundException {
# Line 782 | Line 786 | public class PriorityQueue<E> extends Ab
786          heapify();
787      }
788  
789 <    // wrapping constructor in method avoids transient javac problems
790 <    final PriorityQueueSpliterator<E> spliterator(int origin, int fence,
791 <                                                  int expectedModCount) {
792 <        return new PriorityQueueSpliterator(this, origin, fence,
793 <                                            expectedModCount);
794 <    }
795 <
796 <    public Stream<E> stream() {
797 <        int flags = Streams.STREAM_IS_SIZED;
794 <        return Streams.stream
795 <            (() -> spliterator(0, size, modCount), flags);
796 <    }
797 <    public Stream<E> parallelStream() {
798 <        int flags = Streams.STREAM_IS_SIZED;
799 <        return Streams.parallelStream
800 <            (() -> spliterator(0, size, modCount), flags);
801 <    }
802 <
803 <    /** Index-based split-by-two Spliterator */
804 <    static final class PriorityQueueSpliterator<E>
805 <        implements Spliterator<E>, Iterator<E> {
789 >    public Spliterator<E> spliterator() {
790 >        return new PriorityQueueSpliterator<E>(this, 0, -1, 0);
791 >    }
792 >
793 >    /**
794 >     * This is very similar to ArrayList Spliterator, except for extra
795 >     * null checks.
796 >     */
797 >    static final class PriorityQueueSpliterator<E> implements Spliterator<E> {
798          private final PriorityQueue<E> pq;
799 <        private int index;           // current index, modified on advance/split
800 <        private final int fence;     // one past last index
801 <        private final int expectedModCount; // for comodification checks
799 >        private int index;            // current index, modified on advance/split
800 >        private int fence;            // -1 until first use
801 >        private int expectedModCount; // initialized when fence set
802  
803 <        /** Create new spliterator covering the given  range */
803 >        /** Creates new spliterator covering the given range */
804          PriorityQueueSpliterator(PriorityQueue<E> pq, int origin, int fence,
805                               int expectedModCount) {
806 <            this.pq = pq; this.index = origin; this.fence = fence;
806 >            this.pq = pq;
807 >            this.index = origin;
808 >            this.fence = fence;
809              this.expectedModCount = expectedModCount;
810          }
811  
812 <        public PriorityQueueSpliterator<E> trySplit() {
813 <            int lo = index, mid = (lo + fence) >>> 1;
812 >        private int getFence() { // initialize fence to size on first use
813 >            int hi;
814 >            if ((hi = fence) < 0) {
815 >                expectedModCount = pq.modCount;
816 >                hi = fence = pq.size;
817 >            }
818 >            return hi;
819 >        }
820 >
821 >        public Spliterator<E> trySplit() {
822 >            int hi = getFence(), lo = index, mid = (lo + hi) >>> 1;
823              return (lo >= mid) ? null :
824                  new PriorityQueueSpliterator<E>(pq, lo, index = mid,
825 <                                            expectedModCount);
825 >                                                expectedModCount);
826          }
827  
828 <        public void forEach(Block<? super E> block) {
829 <            Object[] a; int i, hi; // hoist accesses and checks from loop
830 <            if (block == null)
828 >        @SuppressWarnings("unchecked")
829 >        public void forEachRemaining(Consumer<? super E> action) {
830 >            int i, hi, mc; // hoist accesses and checks from loop
831 >            PriorityQueue<E> q; Object[] a;
832 >            if (action == null)
833                  throw new NullPointerException();
834 <            if ((a = pq.queue).length >= (hi = fence) &&
835 <                (i = index) >= 0 && i < hi) {
836 <                index = hi;
837 <                do {
838 <                    @SuppressWarnings("unchecked") E e = (E) a[i];
839 <                    block.accept(e);
840 <                } while (++i < hi);
841 <                if (pq.modCount != expectedModCount)
842 <                    throw new ConcurrentModificationException();
834 >            if ((q = pq) != null && (a = q.queue) != null) {
835 >                if ((hi = fence) < 0) {
836 >                    mc = q.modCount;
837 >                    hi = q.size;
838 >                }
839 >                else
840 >                    mc = expectedModCount;
841 >                if ((i = index) >= 0 && (index = hi) <= a.length) {
842 >                    for (E e;; ++i) {
843 >                        if (i < hi) {
844 >                            if ((e = (E) a[i]) == null) // must be CME
845 >                                break;
846 >                            action.accept(e);
847 >                        }
848 >                        else if (q.modCount != mc)
849 >                            break;
850 >                        else
851 >                            return;
852 >                    }
853 >                }
854              }
855 +            throw new ConcurrentModificationException();
856          }
857  
858 <        public boolean tryAdvance(Block<? super E> block) {
859 <            if (index >= 0 && index < fence) {
858 >        public boolean tryAdvance(Consumer<? super E> action) {
859 >            int hi = getFence(), lo = index;
860 >            if (lo >= 0 && lo < hi) {
861 >                index = lo + 1;
862 >                @SuppressWarnings("unchecked") E e = (E)pq.queue[lo];
863 >                if (e == null)
864 >                    throw new ConcurrentModificationException();
865 >                action.accept(e);
866                  if (pq.modCount != expectedModCount)
867                      throw new ConcurrentModificationException();
845                @SuppressWarnings("unchecked") E e =
846                    (E)pq.queue[index++];
847                block.accept(e);
868                  return true;
869              }
870              return false;
871          }
872  
873 <        public long estimateSize() { return (long)(fence - index); }
874 <        public boolean hasExactSize() { return true; }
875 <        public boolean hasExactSplits() { return true; }
856 <
857 <        // Iterator support
858 <        public Iterator<E> iterator() { return this; }
859 <        public void remove() { throw new UnsupportedOperationException(); }
860 <        public boolean hasNext() { return index >= 0 && index < fence; }
873 >        public long estimateSize() {
874 >            return (long) (getFence() - index);
875 >        }
876  
877 <        public E next() {
878 <            if (index < 0 || index >= fence)
864 <                throw new NoSuchElementException();
865 <            if (pq.modCount != expectedModCount)
866 <                throw new ConcurrentModificationException();
867 <            @SuppressWarnings("unchecked") E e =
868 <                (E) pq.queue[index++];
869 <            return e;
877 >        public int characteristics() {
878 >            return Spliterator.SIZED | Spliterator.SUBSIZED | Spliterator.NONNULL;
879          }
880      }
881   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines