00001
00002
00003
00004
00005
00006
00007
00014 #ifndef OSCL_PRIQUEUE_H_INCLUDED
00015 #define OSCL_PRIQUEUE_H_INCLUDED
00016
00017
00018
00030 #ifndef OSCL_BASE_H_INCLUDED
00031 #include "oscl_base.h"
00032 #endif
00033
00034
00035 #ifndef OSCL_VECTOR_H_INCLUDED
00036 #include "oscl_vector.h"
00037 #endif
00038
00046 class OsclPriorityQueueBase
00047 {
00048 protected:
00049 virtual ~OsclPriorityQueueBase()
00050 {}
00051
00052 OSCL_IMPORT_REF void push_heap(OsclAny* first, OsclAny* last) ;
00053
00054 OSCL_IMPORT_REF void pop_heap(OsclAny* first, OsclAny* last) ;
00055
00056 OSCL_IMPORT_REF OsclAny* find_heap(const OsclAny* input, OsclAny* first, OsclAny* last) ;
00057
00058 OSCL_IMPORT_REF int remove(const OsclAny* input) ;
00059
00060 void construct(Oscl_Opaque_Type_Compare* ot, Oscl_Vector_Base* vec)
00061 {
00062 pOpaqueType = ot;
00063 pVec = vec;
00064 }
00065
00066 private:
00067
00068
00069 int delta_T(OsclAny*first, OsclAny*last)
00070 {
00071 return ((int)last -(int)first) / pVec->sizeof_T;
00072 }
00073
00074 Oscl_Opaque_Type_Compare* pOpaqueType;
00075 Oscl_Vector_Base* pVec;
00076 };
00077
00078 template < class T> class OsclCompareLess
00079 {
00080 public:
00081 int compare(T& a, T& b) const
00082 {
00083 return (a < b);
00084 }
00085 };
00086
00087
00088
00089
00090
00091
00092
00093
00094 template < class Qelem, class Alloc,
00095 class Container = Oscl_Vector<Qelem, Alloc>,
00096 class Compare = OsclCompareLess<Qelem> >
00097
00098 class OsclPriorityQueue : public OsclPriorityQueueBase
00099 , public Oscl_Opaque_Type_Compare
00100 {
00101
00102 public:
00103 typedef typename Container::value_type value_type;
00104 typedef Container container_type;
00105 typedef typename Container::iterator iterator;
00106 typedef typename Container::const_reference const_reference;
00107
00108 bool empty() const
00109 {
00110 return c.empty();
00111 };
00112 uint32 size() const
00113 {
00114 return c.size();
00115 };
00116 void reserve(uint32 n)
00117 {
00118 c.reserve(n);
00119 };
00120 const_reference top() const
00121 {
00122 return c.front();
00123 };
00124 const Container & vec()
00125 {
00126 return c;
00127 }
00128
00129 void push(const value_type& input)
00130 {
00131 c.push_back(input);
00132 push_heap(c.begin(), c.end());
00133 }
00134
00135
00136 void pop()
00137 {
00138 pop_heap(c.begin(), c.end());
00139 c.pop_back();
00140 }
00141
00142
00143
00144
00145 int remove(const value_type& input)
00146 {
00147 return OsclPriorityQueueBase::remove(&input);
00148 }
00149
00150
00151 OsclPriorityQueue(): OsclPriorityQueueBase(), Oscl_Opaque_Type_Compare()
00152 , c()
00153 {
00154 OsclPriorityQueueBase::construct(this, &c);
00155 }
00156
00157 virtual ~OsclPriorityQueue()
00158 {}
00159
00160 protected:
00161 Container c;
00162 Compare comp;
00163
00164
00165 void push_heap(iterator first, iterator last)
00166 {
00167 OsclPriorityQueueBase::push_heap(first, last);
00168 }
00169
00170 void pop_heap(iterator first, iterator last)
00171 {
00172 OsclPriorityQueueBase::pop_heap(first, last);
00173 }
00174
00175 iterator find_heap(const value_type& input, iterator first, iterator last)
00176 {
00177 return OsclPriorityQueueBase::find_heap(&input, first, last);
00178 }
00179
00180
00181 int validate()
00182 {
00183 unsigned int ch;
00184 for (unsigned int par = 0;par < c.size();par++)
00185 {
00186 ch = 2 * par + 1;
00187 if (ch < c.size() && comp.compare(c[par], c[ch]))
00188 return par;
00189 ch++;
00190 if (ch < c.size() && comp.compare(c[par], c[ch]))
00191 return par;
00192 }
00193 return -1;
00194 }
00195
00196 friend class oscl_priqueue_test;
00197
00198
00199 void swap(OsclAny* dest, const OsclAny* src)
00200 {
00201 OSCL_ASSERT(dest);
00202 OSCL_ASSERT(src);
00203 if (dest != src)
00204 {
00205 value_type temp(*((value_type*)dest));
00206 *((value_type*)dest) = *((value_type*)src);
00207 *((value_type*)src) = temp;
00208 }
00209 }
00210
00211
00212 int compare_LT(OsclAny* a, OsclAny* b) const
00213 {
00214 OSCL_ASSERT(a);
00215 OSCL_ASSERT(b);
00216 return comp.compare(*((value_type*)a), *((value_type*)b));
00217 }
00218
00219
00220 int compare_EQ(const OsclAny* a, const OsclAny* b) const
00221 {
00222 OSCL_ASSERT(a);
00223 OSCL_ASSERT(b);
00224 return (*((value_type*)a)) == (*((value_type*)b));
00225
00226 }
00227
00228 };
00229
00230 #endif
00231