// 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_QUEUE_DEFINED #define KP_QUEUE_DEFINED #include #include "KPbasic.h" #include "KPList.h" // Assumes Element has a default constructor and operator=(). template class KPQueue { public: KPQueue(); KPQueue(const KPQueue &queue); KPQueue(const KPList &list); KPQueue(const Element &element); ~KPQueue(); operator KPList() const; KPQueue &operator=(const KPQueue &queue); KPQueue &operator=(const Element &element); KPQueue &enqueue(const Element &element); Element dequeue(); Element &head(); const Element &head() const; Element &tail(); const Element &tail() const; int size() const; bool is_empty() const; KPQueue &clear(); protected: static void queue_empty_error(const char *fname); KPList my_list; }; /****************************************************************************/ template inline KPQueue::KPQueue(): my_list() { /* do nothing */ } /****************************************************************************/ template inline KPQueue::KPQueue(const KPQueue &queue): my_list(queue.my_list) { /* do nothing */ } /****************************************************************************/ template inline KPQueue::KPQueue(const KPList &list): my_list(list) { /* do nothing */ } /****************************************************************************/ template inline KPQueue::KPQueue(const Element &element): my_list(element) { /* do nothing */ } /****************************************************************************/ template inline KPQueue::~KPQueue() { my_list.clear(); } /****************************************************************************/ template inline KPQueue::operator KPList() const { return my_list; } /****************************************************************************/ template inline KPQueue & KPQueue::operator=(const KPQueue &queue) { my_list = queue.my_list; return *this; } /****************************************************************************/ template inline KPQueue & KPQueue::operator=(const Element &element) { my_list = element; return *this; } /****************************************************************************/ template inline KPQueue & KPQueue::enqueue(const Element &element) { my_list.add_to_tail(element); return *this; } /****************************************************************************/ template inline Element KPQueue::dequeue() { if (my_list.size() < 1) queue_empty_error("dequeue()"); Element element = my_list.head(); my_list.remove_head(); return element; } /****************************************************************************/ template inline Element & KPQueue::head() { if (my_list.size() < 1) queue_empty_error("head()"); return my_list.head(); } /****************************************************************************/ template inline const Element & KPQueue::head() const { if (my_list.size() < 1) queue_empty_error("head()"); return my_list.head(); } /****************************************************************************/ template inline Element & KPQueue::tail() { if (my_list.size() < 1) queue_empty_error("tail()"); return my_list.tail(); } /****************************************************************************/ template inline const Element & KPQueue::tail() const { if (my_list.size() < 1) queue_empty_error("tail()"); return my_list.tail(); } /****************************************************************************/ template inline int KPQueue::size() const { return my_list.size(); } /****************************************************************************/ template inline bool KPQueue::is_empty() const { return my_list.is_empty(); } /****************************************************************************/ template inline KPQueue & KPQueue::clear() { my_list.clear(); return *this; } /****************************************************************************/ template void KPQueue::queue_empty_error(const char *fname) { cerr << "KPQueue: " << fname << " - queue empty\n"; exit(EXIT_FAILURE); } /****************************************************************************/ #endif /* KP_QUEUE_DEFINED */