00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef _KDPQUEUE_H_
00021 #define _KDPQUEUE_H_
00022
00023 #include "Object.h"
00024 #include <stdio.h>
00025 #include <iostream>
00026 #include <math.h>
00027 #include <float.h>
00028 #include "KDPoint.h"
00029
00030
00031
00032
00033 template <class KDPQKey, class KDPQElement>
00034 class KDPQueue : public FD::Object
00035 {
00036 public:
00037
00038
00039
00040
00041
00042 KDPQueue()
00043 : m_maxKeys(0), m_numKeys(0), m_keys(NULL), m_elements(NULL)
00044 {
00045
00046 }
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056 KDPQueue(int i_maxKeys)
00057 : m_maxKeys(i_maxKeys), m_numKeys(0)
00058 {
00059 m_keys = new KDPQKey[m_maxKeys+1];
00060 m_elements = new KDPQElement[m_maxKeys+1];
00061 }
00062
00063
00064
00065
00066
00067
00068 ~KDPQueue()
00069 {
00070 delete [] m_keys;
00071 delete [] m_elements;
00072 fflush(stdout);
00073 }
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083 void printOn(std::ostream &out) const
00084 {
00085 throw new FD::GeneralException ("KDPQueue::printOn : routine not implemented",__FILE__,__LINE__);
00086 }
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096 void readFrom(std::istream &in)
00097 {
00098 throw new FD::GeneralException ("KDPQueue::readFrom : routine not implemented",__FILE__,__LINE__);
00099 }
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110 inline void Insert(KDPQKey i_key, KDPQElement *i_element)
00111 {
00112 int i;
00113
00114
00115 for (i=m_numKeys; i>0; --i) {
00116 if (m_keys[i-1] > i_key) {
00117 m_keys[i] = m_keys[i-1];
00118 m_elements[i] = m_elements[i-1];
00119 }
00120 else {
00121 break;
00122 }
00123 }
00124
00125
00126 m_keys[i] = i_key;
00127 m_elements[i] = *i_element;
00128
00129 if (m_numKeys < m_maxKeys) {
00130 m_numKeys++;
00131 }
00132
00133 }
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143 inline KDPQKey GetMaxKey() const
00144 {
00145 if (m_numKeys == m_maxKeys) {
00146 return m_keys[m_numKeys-1];
00147 }
00148 else {
00149 return (KDPQKey)DBL_MAX;
00150 }
00151 }
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161 inline KDPQKey GetMinKey() const
00162 {
00163 if (m_numKeys > 0) {
00164 return m_keys[0];
00165 }
00166 else {
00167 return (KDPQKey)DBL_MAX;
00168 }
00169 }
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182 inline KDPQKey GetIthKey(int i_idx) const
00183 {
00184 if (i_idx < m_numKeys) {
00185 return m_keys[i_idx];
00186 }
00187 else {
00188 return (KDPQKey)DBL_MAX;
00189 }
00190 }
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203 inline KDPQElement *GetIthElement(int i_idx) const
00204 {
00205 if (i_idx < m_numKeys) {
00206 return &(m_elements[i_idx]);
00207 }
00208 else {
00209 return NULL;
00210 }
00211 }
00212
00213 private:
00214
00215 int m_maxKeys;
00216
00217 int m_numKeys;
00218
00219 KDPQKey *m_keys;
00220
00221 KDPQElement *m_elements;
00222 };
00223
00224 #endif