32#ifndef QPRIORITY_QUEUE_H
33#define QPRIORITY_QUEUE_H
35#include <QtCore/qalgorithms.h>
46template <
class T,
typename LessThan = std::less<T>>
47class QPriorityQueuePrivate {
49 inline QPriorityQueuePrivate(LessThan l) : lessThan(l), d() {}
50 inline ~QPriorityQueuePrivate() {}
52 inline void clear() {
return d.clear(); }
53 inline int size()
const {
return d.size(); }
54 inline bool empty()
const {
return d.empty(); }
56 inline T &top() {
return d.front(); }
59 void push(
const T &value);
62 inline int parent(
int i) {
return (i - 1) / 2; }
63 inline int leftChild(
int i) {
return 2 * i + 1; }
64 inline int rightChild(
int i) {
return 2 * i + 2; }
71template <
class T,
typename LessThan = std::less<T>>
72class Q_CORE_EXPORT QPriorityQueue {
74 inline QPriorityQueue(LessThan l = std::less<T>())
75 : lessThan(l), d(lessThan) {}
76 inline QPriorityQueue(
const QPriorityQueue<T> &q)
77 : lessThan(q.lessThan), d(q.d) {}
78 inline ~QPriorityQueue() {}
80 QPriorityQueue<T> &operator=(
const QPriorityQueue<T> &q) {
85 inline int size()
const {
return d.size(); }
86 inline bool isEmpty()
const {
return empty(); }
90 void append(
const T &t) {
return enqueue(t); }
92 T takeFirst() {
return dequeue(); }
93 inline int length()
const {
return size(); }
94 inline T &first() {
return head(); }
95 inline const T &first()
const {
return head(); }
96 inline void removeFirst() { pop(); }
97 inline bool startsWith(
const T &t)
const {
98 return !isEmpty() && first() == t;
102 inline void enqueue(
const T &t) { push(t); }
108 inline T &head() {
return const_cast<T &
>(top()); }
109 inline const T &head()
const {
return top(); }
112 typedef int size_type;
113 typedef T value_type;
115 inline bool empty()
const {
return d.empty(); }
116 inline const value_type &top() {
117 Q_ASSERT(!isEmpty());
120 inline void push(
const value_type &x) {
return d.push(x); }
122 Q_ASSERT(!isEmpty());
127 inline QPriorityQueue<T> &operator+=(
const T &t) {
131 inline QPriorityQueue<T> &operator<<(
const T &t) {
135 inline QPriorityQueue<T> &operator>>(T &t) {
142 static inline QPriorityQueue<T>
143 fromStdPriorityQueue(
const std::priority_queue<T> &q) {
144 QPriorityQueue<T> tmp;
148 inline std::priority_queue<T> toStdPriorityQueue()
const {
return d; }
154 std::priority_queue<T, std::vector<T>, LessThan> d;
156 QPriorityQueuePrivate<T> d;
162template <
typename T,
typename LessThan>
163Q_INLINE_TEMPLATE
void QPriorityQueue<T, LessThan>::clear() {
164 d = std::priority_queue<T, std::vector<T>, LessThan>(lessThan);
170template <
typename T,
typename LessThan>
171Q_INLINE_TEMPLATE
void QPriorityQueue<T, LessThan>::clear() {
177template <
typename T,
typename LessThan>
178Q_OUTOFLINE_TEMPLATE
void
179QPriorityQueue<T, LessThan>::append(
const QList<T> &t) {
193template <
typename T,
typename LessThan>
194Q_OUTOFLINE_TEMPLATE
void QPriorityQueuePrivate<T, LessThan>::pop() {
196 ssize_t size = d.size();
206 while (i < size - 1) {
207 int left = leftChild(i);
208 int right = rightChild(i);
209 bool validLeft = left < size;
210 bool validRight = right < size;
212 if (validLeft && lessThan(d.at(i), d.at(left)))
213 if (validRight && !lessThan(d.at(right), d.at(left))) {
220 else if (validRight && lessThan(d.at(i), d.at(right))) {
233template <
typename T,
typename LessThan>
234Q_OUTOFLINE_TEMPLATE
void
235QPriorityQueuePrivate<T, LessThan>::push(
const T &value) {
238 while (i != 0 && !lessThan(d.at(i), d.at(parent(i)))) {
239 d.swap(i, parent(i));
Definition qpriorityqueue.h:39