// -*- c++ -*- //------------------------------------------------------------------------------ // PriorityQueue.h //------------------------------------------------------------------------------ // Copyright (c) 1999 by Vladislav Grinchenko // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Library General Public // License as published by the Free Software Foundation; either // version 2 of the License, or (at your option) any later version. //------------------------------------------------------------------------------ #ifndef PRIORITY_QUEUE_H #define PRIORITY_QUEUE_H #include #include #include "assa/Assure.h" #include "assa/PriorityQueue_Impl.h" #include "assa/PriorityQueue_Heap.h" namespace ASSA { /** @file PriorityQueue.h Priority Queue class that allows removal of arbitrariy element from the queue. This is Abstraction part of the Bridge pattern. */ template class PriorityQueue_Impl; template class PriorityQueue { public: PriorityQueue (size_t max_ = 20); PriorityQueue (size_t max_, const Compare&); virtual ~PriorityQueue (); virtual void insert (const T&); virtual T pop (); virtual const T& top () const; virtual bool remove (T&); virtual size_t size (); virtual T& operator[] (int); virtual void setHeapImpl (size_t, const Compare&); protected: const PriorityQueue_Impl* getPriorityQueueImpl () const; Compare m_comp; PriorityQueue (const PriorityQueue&); PriorityQueue& operator= (const PriorityQueue&); private: PriorityQueue_Impl< T, Compare >* m_impl; }; //---------------------------------------------------------------------------- // Member functions //---------------------------------------------------------------------------- template inline PriorityQueue:: PriorityQueue (size_t maxsz_) : m_impl (0) { // This is a perfect place for using Factory to decide which // implementation to use // const char self[]="PriorityQueue::PriorityQueue(maxsz)"; trace(); setHeapImpl (maxsz_, m_comp); } template inline PriorityQueue:: PriorityQueue (size_t maxsz_, const Compare& x_) : m_comp (x_), m_impl (0) { // This is perfect place for using Factory to decide which // implementation to use setHeapImpl (maxsz_, m_comp); } template inline void PriorityQueue:: setHeapImpl (size_t maxsz_, const Compare& x_) { // Maybe here you would want to copy contents of the old // implementation to the new one? // if (m_impl != 0) delete m_impl; m_impl = new PriorityQueue_Heap (maxsz_, x_); } template inline PriorityQueue:: ~PriorityQueue () { delete m_impl; } template void inline PriorityQueue:: insert (const T& el_) { m_impl->insert (el_); } template T inline PriorityQueue:: pop () { return m_impl->pop (); } template inline const T& PriorityQueue:: top () const { return m_impl->top (); } template inline bool PriorityQueue:: remove (T& t_) { return m_impl->remove (t_); } template inline size_t PriorityQueue:: size () { return m_impl->size (); } template inline const PriorityQueue_Impl* PriorityQueue:: getPriorityQueueImpl () const { return (const PriorityQueue_Impl*) m_impl; } template inline T& PriorityQueue:: operator[] (int idx) { return (*m_impl)[idx]; } } // end namespace ASSA #endif /* PRIORITY_QUEUE_H */