// A module of KPlib v1.4.2. // Written by Keith Pomakis during the summer of 1994. // Released to the public domain on October 10, 1994. // This version released on March 30, 1999. #ifndef KP_PRIORITY_QUEUE_DEFINED #define KP_PRIORITY_QUEUE_DEFINED #include #include "KPbasic.h" #include "KPList.h" // Assumes Element has a default constructor, operator=(), operator==(), // and operator<(). Note that operator<() must place a total ordering on // the set of Elements. template class KPPriorityQueue { public: KPPriorityQueue(); KPPriorityQueue(const KPPriorityQueue &queue); KPPriorityQueue(const KPList &list); KPPriorityQueue(const Element &element); ~KPPriorityQueue(); operator KPList() const; KPPriorityQueue & operator=(const KPPriorityQueue &queue); KPPriorityQueue &operator=(const Element &element); KPPriorityQueue &enqueue(const Element &element); Element dequeue(); Element &head(); const Element &head() const; Element &tail(); const Element &tail() const; bool contains(const Element &element) const; int occurrences_of(const Element &element) const; int size() const; bool is_empty() const; KPPriorityQueue &clear(); protected: static void queue_empty_error(const char *fname); KPSortableList my_list; }; /****************************************************************************/ template inline KPPriorityQueue::KPPriorityQueue(): my_list() { /* do nothing. */ } /****************************************************************************/ template inline KPPriorityQueue::KPPriorityQueue(const KPPriorityQueue &queue): my_list(queue.my_list) { /* do nothing. */ } /****************************************************************************/ template inline KPPriorityQueue::KPPriorityQueue(const KPList &list): my_list(list) { my_list.sort(); } /****************************************************************************/ template inline KPPriorityQueue::KPPriorityQueue(const Element &element): my_list(element) { /* do nothing. */ } /****************************************************************************/ template inline KPPriorityQueue::~KPPriorityQueue() { my_list.clear(); } /****************************************************************************/ template inline KPPriorityQueue::operator KPList() const { return my_list; } /****************************************************************************/ template inline KPPriorityQueue & KPPriorityQueue::operator=(const KPPriorityQueue &queue) { my_list = queue.my_list; return *this; } /****************************************************************************/ template inline KPPriorityQueue & KPPriorityQueue::operator=(const Element &element) { my_list = element; return *this; } /****************************************************************************/ template KPPriorityQueue & KPPriorityQueue::enqueue(const Element &element) { KPIterator iter(my_list); iter.end(); while (iter.ptr() && element < *iter) iter--; if (!iter.ptr()) my_list.add_to_head(element); else iter.insert_after_current(element); return *this; } /****************************************************************************/ template inline Element KPPriorityQueue::dequeue() { if (my_list.size() < 1) queue_empty_error("dequeue()"); Element element = my_list.head(); my_list.remove_head(); return element; } /****************************************************************************/ template inline Element & KPPriorityQueue::head() { if (my_list.size() < 1) queue_empty_error("head()"); return my_list.head(); } /****************************************************************************/ template inline const Element & KPPriorityQueue::head() const { if (my_list.size() < 1) queue_empty_error("head()"); return my_list.head(); } /****************************************************************************/ template inline Element & KPPriorityQueue::tail() { if (my_list.size() < 1) queue_empty_error("tail()"); return my_list.tail(); } /****************************************************************************/ template inline const Element & KPPriorityQueue::tail() const { if (my_list.size() < 1) queue_empty_error("tail()"); return my_list.tail(); } /****************************************************************************/ template bool KPPriorityQueue::contains(const Element &element) const { KPReadOnlyIterator iter(my_list); while (iter.ptr() && *iter < element) iter++; return (iter.ptr() && *iter == element); } /****************************************************************************/ template int KPPriorityQueue::occurrences_of(const Element &element) const { KPReadOnlyIterator iter(my_list); int n = 0; while (iter.ptr() && *iter < element) iter++; while (iter.ptr() && *iter == element) { n++; iter++; } return n; } /****************************************************************************/ template inline int KPPriorityQueue::size() const { return my_list.size(); } /****************************************************************************/ template inline bool KPPriorityQueue::is_empty() const { return my_list.is_empty(); } /****************************************************************************/ template inline KPPriorityQueue & KPPriorityQueue::clear() { my_list.clear(); } /****************************************************************************/ template void KPPriorityQueue::queue_empty_error(const char *fname) { cerr << "KPPriorityQueue: " << fname << " - queue empty\n"; exit(EXIT_FAILURE); } /****************************************************************************/ #endif /* KP_PRIORITY_QUEUE_DEFINED */