19#ifndef priority_queue_h
20#define priority_queue_h
24#include <tqasciidict.h>
57 template<
class T>
class PriorityQueue {
61 PriorityQueue(
const PriorityQueue<T>& rhs ) : m_vector( rhs.m_vector ) {}
62 PriorityQueue(
const TQAsciiDict<T>& items );
65 PriorityQueue<T> &operator=(
const PriorityQueue<T>& rhs ) { m_vector = rhs.m_vector;
return *
this; }
66 bool operator==(
const PriorityQueue<T>& rhs ) {
return m_vector == rhs.m_vector; }
68 unsigned int count()
const {
return m_vector.size(); }
69 bool isEmpty()
const {
return m_vector.empty(); }
71 void insert( T* item );
78 void keyDecreased( T* item );
89 int parent(
int i ) {
return ( ( i + 1 ) >> 1 ) - 1; }
90 int left(
int i ) {
return ( ( i + 1 ) << 1 ) - 1; }
91 int right(
int i ) {
return ( i + 1 ) << 1; }
93 void heapify(
int i );
95 void bubbleUp( T* item,
int i );
99 std::vector<T*> m_vector;
103 PriorityQueue<T>::PriorityQueue(
const TQAsciiDict<T>& items ) : m_vector( items.count() )
106 TQAsciiDictIterator<T> it( items );
107 for (
int i = 0; it.current(); ++it, ++i ) {
108 it.current()->setIndex( i );
109 m_vector[ i ] = it.current();
116 void PriorityQueue<T>::insert( T* item )
120 int i =
static_cast<int>( m_vector.size() );
121 m_vector.push_back( 0 );
126 void PriorityQueue<T>::keyDecreased( T* item )
130 bubbleUp( item, item->index() );
134 T* PriorityQueue<T>::extractMinimum()
136 if ( m_vector.size() < 1 )
138 T *min = m_vector[ 0 ];
139 m_vector[ 0 ] = m_vector[ m_vector.size() - 1 ];
141 m_vector[ 0 ]->setIndex( 0 );
148 void PriorityQueue<T>::dump()
const
150 kdDebug( 30500 ) <<
"++++++++++ PriorityQueue::dump ++++++++++" << endl;
152 int size =
static_cast<int>( m_vector.size() );
153 for (
int i = 0; i < size; ++i ) {
154 if ( m_vector[ i ]->index() != i )
155 out +=
" ERROR: index out of sync. Should be " + TQString::number( i ) +
", is " +
156 TQString::number( m_vector[ i ]->index() ) +
". ";
157 out += TQString::number( m_vector[ i ]->key() );
162 kdDebug( 30500 ) << out << endl;
163 kdDebug( 30500 ) <<
"++++++++++ PriorityQueue::dump (done) ++++++++++" << endl;
167 void PriorityQueue<T>::heapify(
int i )
169 int l = left( i ), r = right( i ), size =
static_cast<int>( m_vector.size() );
172 if ( l < size && m_vector[ l ]->key() < m_vector[ i ]->key() )
176 if ( r < size && m_vector[ r ]->key() < m_vector[ smallest ]->key() )
179 if ( smallest != i ) {
180 T* tmp = m_vector[ i ];
181 m_vector[ i ] = m_vector[ smallest ];
183 m_vector[ i ]->setIndex( i );
184 tmp->setIndex( smallest );
185 m_vector[ smallest ] = tmp;
191 void PriorityQueue<T>::bubbleUp( T* item,
int i )
194 while ( i > 0 && m_vector[ p ]->key() > item->key() ) {
196 m_vector[ p ]->setIndex( i );
198 m_vector[ i ] = m_vector[ p ];
203 m_vector[ i ] = item;
207 void PriorityQueue<T>::buildHeap()
210 for (
int i = ( m_vector.size() >> 1 ) - 1; i >= 0; --i )
Namespace for general KOFFICE functions.