1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/* Licensed to the Apache Software Foundation (ASF) under one or more
2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * contributor license agreements.  See the NOTICE file distributed with
3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this work for additional information regarding copyright ownership.
4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The ASF licenses this file to You under the Apache License, Version 2.0
5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (the "License"); you may not use this file except in compliance with
6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the License.  You may obtain a copy of the License at
7f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes *
8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
9f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes *
10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * See the License for the specific language governing permissions and
14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * limitations under the License.
15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage java.util;
17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.IOException;
19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.ObjectInputStream;
20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.ObjectOutputStream;
21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.Serializable;
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * A PriorityQueue holds elements on a priority heap, which orders the elements
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * according to their natural order or according to the comparator specified at
26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * construction time. If the queue uses natural ordering, only elements that are
27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * comparable are permitted to be inserted into the queue.
28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The least element of the specified ordering is stored at the head of the
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * queue and the greatest element is stored at the tail of the queue.
31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * A PriorityQueue is not synchronized. If multiple threads will have to access
33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * it concurrently, use the {@link java.util.concurrent.PriorityBlockingQueue}.
34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class PriorityQueue<E> extends AbstractQueue<E> implements Serializable {
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static final long serialVersionUID = -7720805057305804111L;
38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static final int DEFAULT_CAPACITY = 11;
40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static final double DEFAULT_INIT_CAPACITY_RATIO = 1.1;
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static final int DEFAULT_CAPACITY_RATIO = 2;
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private int size;
46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private Comparator<? super E> comparator;
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private transient E[] elements;
50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs a priority queue with an initial capacity of 11 and natural
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * ordering.
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public PriorityQueue() {
56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this(DEFAULT_CAPACITY);
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs a priority queue with the specified capacity and natural
61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * ordering.
62f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param initialCapacity
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the specified capacity.
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the initialCapacity is less than 1.
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public PriorityQueue(int initialCapacity) {
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this(initialCapacity, null);
70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs a priority queue with the specified capacity and comparator.
74f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param initialCapacity
76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the specified capacity.
77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param comparator
78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the specified comparator. If it is null, the natural ordering
79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            will be used.
80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException
81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the initialCapacity is less than 1.
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public PriorityQueue(int initialCapacity, Comparator<? super E> comparator) {
84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (initialCapacity < 1) {
85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new IllegalArgumentException();
86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        elements = newElementArray(initialCapacity);
88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.comparator = comparator;
89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs a priority queue that contains the elements of a collection.
93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The constructed priority queue has the initial capacity of 110% of the
94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * size of the collection. The queue uses natural ordering to order its
95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * elements.
96f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param c
98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the collection whose elements will be added to the priority
99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            queue to be constructed.
100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws ClassCastException
101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if any of the elements in the collection are not comparable.
102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NullPointerException
103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if any of the elements in the collection are null.
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public PriorityQueue(Collection<? extends E> c) {
106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (c instanceof PriorityQueue) {
107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            getFromPriorityQueue((PriorityQueue<? extends E>) c);
108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } else if (c instanceof SortedSet) {
109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            getFromSortedSet((SortedSet<? extends E>) c);
110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } else {
111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            initSize(c);
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            addAll(c);
113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs a priority queue that contains the elements of another
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * priority queue. The constructed priority queue has the initial capacity
119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * of 110% of the specified one. Both priority queues have the same
120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * comparator.
121f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param c
123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the priority queue whose elements will be added to the
124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            priority queue to be constructed.
125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public PriorityQueue(PriorityQueue<? extends E> c) {
127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        getFromPriorityQueue(c);
128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs a priority queue that contains the elements of a sorted set.
132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The constructed priority queue has the initial capacity of 110% of the
133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * size of the sorted set. The priority queue will have the same comparator
134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * as the sorted set.
135f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param c
137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the sorted set whose elements will be added to the priority
138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            queue to be constructed.
139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public PriorityQueue(SortedSet<? extends E> c) {
141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        getFromSortedSet(c);
142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets the iterator of the priority queue, which will not return elements
146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * in any specified ordering.
147f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the iterator of the priority queue.
149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Iterator<E> iterator() {
152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return new PriorityIterator();
153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets the size of the priority queue. If the size of the queue is greater
157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * than the Integer.MAX, then it returns Integer.MAX.
158f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the size of the priority queue.
160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int size() {
163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return size;
164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Removes all the elements of the priority queue.
168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void clear() {
171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Arrays.fill(elements, null);
172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        size = 0;
173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Inserts the element to the priority queue.
177f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param o
179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the element to add to the priority queue.
180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return always true
181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws ClassCastException
182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the element cannot be compared with the elements in the
183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             priority queue using the ordering of the priority queue.
184f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @throws NullPointerException
185f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *             if {@code o} is {@code null}.
186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean offer(E o) {
188b46dab348e2007bc08abaf7ecae34d89a2474e50Elliott Hughes        if (o == null) {
18986acc043d3334651ee26c65467d78d6cefedd397Kenny Root            throw new NullPointerException("o == null");
190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        growToSize(size + 1);
192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        elements[size] = o;
193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        siftUp(size++);
194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return true;
195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets and removes the head of the queue.
199f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the head of the queue or null if the queue is empty.
201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public E poll() {
203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (isEmpty()) {
204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return null;
205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        E result = elements[0];
207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        removeAt(0);
208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return result;
209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets but does not remove the head of the queue.
213f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the head of the queue or null if the queue is empty.
215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public E peek() {
217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (isEmpty()) {
218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return null;
219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return elements[0];
221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets the comparator of the priority queue.
225f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the comparator of the priority queue or null if the natural
227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         ordering is used.
228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Comparator<? super E> comparator() {
230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return comparator;
231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Removes the specified object from the priority queue.
235f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param o
237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the object to be removed.
238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return true if the object was in the priority queue, false if the object
239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         was not in the priority queue.
240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @SuppressWarnings("unchecked")
243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean remove(Object o) {
244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (o == null) {
245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return false;
246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
247509ca343769fa66b6f644561f9a9384a4c5ee5d1Jeremy Sharpe        for (int targetIndex = 0; targetIndex < size; targetIndex++) {
248509ca343769fa66b6f644561f9a9384a4c5ee5d1Jeremy Sharpe            if (o.equals(elements[targetIndex])) {
249509ca343769fa66b6f644561f9a9384a4c5ee5d1Jeremy Sharpe                removeAt(targetIndex);
250509ca343769fa66b6f644561f9a9384a4c5ee5d1Jeremy Sharpe                return true;
251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
253509ca343769fa66b6f644561f9a9384a4c5ee5d1Jeremy Sharpe        return false;
254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Adds the specified object to the priority queue.
258f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param o
260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the object to be added.
261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return always true.
262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws ClassCastException
263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the element cannot be compared with the elements in the
264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             priority queue using the ordering of the priority queue.
265f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @throws NullPointerException
266f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *             if {@code o} is {@code null}.
267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean add(E o) {
270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return offer(o);
271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private class PriorityIterator implements Iterator<E> {
274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        private int currentIndex = -1;
276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        private boolean allowRemove = false;
278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public boolean hasNext() {
280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return currentIndex < size - 1;
281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public E next() {
284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (!hasNext()) {
285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                throw new NoSuchElementException();
286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            allowRemove = true;
288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return elements[++currentIndex];
289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public void remove() {
292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (!allowRemove) {
293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                throw new IllegalStateException();
294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            allowRemove = false;
296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            removeAt(currentIndex--);
297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
300adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @SuppressWarnings("unchecked")
301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private void readObject(ObjectInputStream in) throws IOException,
302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            ClassNotFoundException {
303adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        in.defaultReadObject();
304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int capacity = in.readInt();
305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        elements = newElementArray(capacity);
306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int i = 0; i < size; i++) {
307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            elements[i] = (E) in.readObject();
308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
310adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @SuppressWarnings("unchecked")
312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private E[] newElementArray(int capacity) {
313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return (E[]) new Object[capacity];
314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private void writeObject(ObjectOutputStream out) throws IOException {
317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        out.defaultWriteObject();
318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        out.writeInt(elements.length);
319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int i = 0; i < size; i++) {
320adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            out.writeObject(elements[i]);
321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @SuppressWarnings("unchecked")
325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private void getFromPriorityQueue(PriorityQueue<? extends E> c) {
326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        initSize(c);
327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        comparator = (Comparator<? super E>) c.comparator();
328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        System.arraycopy(c.elements, 0, elements, 0, c.size());
329adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        size = c.size();
330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @SuppressWarnings("unchecked")
333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private void getFromSortedSet(SortedSet<? extends E> c) {
334adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        initSize(c);
335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        comparator = (Comparator<? super E>) c.comparator();
336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Iterator<? extends E> iter = c.iterator();
337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        while (iter.hasNext()) {
338adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            elements[size++] = iter.next();
339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
340adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private void removeAt(int index) {
343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        size--;
344adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        elements[index] = elements[size];
345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        siftDown(index);
346adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        elements[size] = null;
347adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
348adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
349adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private int compare(E o1, E o2) {
350b46dab348e2007bc08abaf7ecae34d89a2474e50Elliott Hughes        if (comparator != null) {
351adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return comparator.compare(o1, o2);
352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
353adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return ((Comparable<? super E>) o1).compareTo(o2);
354adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
355adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
356adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private void siftUp(int childIndex) {
357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        E target = elements[childIndex];
358adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int parentIndex;
359adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        while (childIndex > 0) {
360adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            parentIndex = (childIndex - 1) / 2;
361adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            E parent = elements[parentIndex];
362adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (compare(parent, target) <= 0) {
363adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                break;
364adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
365adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            elements[childIndex] = parent;
366adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            childIndex = parentIndex;
367adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
368adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        elements[childIndex] = target;
369adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
370adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
371adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private void siftDown(int rootIndex) {
372adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        E target = elements[rootIndex];
373adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int childIndex;
374adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        while ((childIndex = rootIndex * 2 + 1) < size) {
375adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (childIndex + 1 < size
376adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    && compare(elements[childIndex + 1], elements[childIndex]) < 0) {
377adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                childIndex++;
378adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
379adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (compare(target, elements[childIndex]) <= 0) {
380adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                break;
381adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
382adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            elements[rootIndex] = elements[childIndex];
383adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            rootIndex = childIndex;
384adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
385adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        elements[rootIndex] = target;
386adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
387adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
388adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private void initSize(Collection<? extends E> c) {
389b46dab348e2007bc08abaf7ecae34d89a2474e50Elliott Hughes        if (c == null) {
39086acc043d3334651ee26c65467d78d6cefedd397Kenny Root            throw new NullPointerException("c == null");
391adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
392adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (c.isEmpty()) {
393adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            elements = newElementArray(1);
394adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } else {
395adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            int capacity = (int) Math.ceil(c.size()
396adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    * DEFAULT_INIT_CAPACITY_RATIO);
397adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            elements = newElementArray(capacity);
398adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
399adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
400adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
401adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private void growToSize(int size) {
402adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (size > elements.length) {
403adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            E[] newElements = newElementArray(size * DEFAULT_CAPACITY_RATIO);
404adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            System.arraycopy(elements, 0, newElements, 0, elements.length);
405adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            elements = newElements;
406adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
407adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
408adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
409