MeVisLabToolboxReference
|
00001 // **InsertLicense** code 00002 //---------------------------------------------------------------------------------- 00004 00011 #ifndef __WEMQueue_H 00012 #define __WEMQueue_H 00013 00014 #include "MLWEMIncludes.h" 00015 00016 ML_START_NAMESPACE 00017 00019 00021 template <class T> 00022 class WEMQueueElement 00023 { 00024 public: 00025 00027 WEMQueueElement(); 00030 WEMQueueElement(T* elem); 00032 ~WEMQueueElement(); 00034 inline T* get() { return _elem; } 00036 inline const T* get() const { return get(); } 00038 inline WEMQueueElement<T>* getNextQueueElement() { return _next; } 00040 void setNextQueueElement(WEMQueueElement<T> *next); 00041 00042 private: 00043 00045 T* _elem; 00047 WEMQueueElement<T>* _next; 00048 00049 }; 00050 00052 00056 template <class T> 00057 class WEMQueue 00058 { 00059 public: 00060 00062 WEMQueue(); 00066 WEMQueue(T* elem); 00068 ~WEMQueue(); 00070 void append(T* elem); 00072 void prepend(T* elem); 00074 void popFront(); 00076 inline unsigned int getSize() const { return _size; }; 00078 inline WEMQueueElement<T>* getHead() const { return _head; }; 00080 inline WEMQueueElement<T>* getTail() const { return _tail;}; 00081 00082 00083 private: 00084 00086 unsigned int _size; 00088 WEMQueueElement<T>* _head; 00090 WEMQueueElement<T>* _tail; 00091 00092 }; 00093 00096 00097 template <class T> 00098 WEMQueueElement<T>::WEMQueueElement() 00099 { 00100 _elem = NULL; 00101 _next = NULL; 00102 } 00103 00105 00106 template <class T> 00107 WEMQueueElement<T>::WEMQueueElement(T* elem) 00108 { 00109 _elem = elem; 00110 _next = NULL; 00111 } 00112 00114 00115 template <class T> 00116 WEMQueueElement<T>::~WEMQueueElement() 00117 { 00118 _elem = NULL; 00119 _next = NULL; 00120 } 00121 00123 00124 template <class T> 00125 void WEMQueueElement<T>::setNextQueueElement(WEMQueueElement<T> *next) 00126 { 00127 _next = next; 00128 } 00129 00131 00132 template <class T> 00133 WEMQueue<T>::WEMQueue() 00134 { 00135 _head = _tail = NULL; 00136 00137 _size = 0; 00138 } 00139 00141 00142 template <class T> 00143 WEMQueue<T>::WEMQueue(T* elem) 00144 { 00145 WEMQueueElement<T>* newElement = NULL; 00146 ML_CHECK_NEW(newElement, WEMQueueElement<T>(elem)); 00147 00148 _head = newElement; 00149 _tail = newElement; 00150 00151 _size = 1; 00152 } 00153 00155 00156 template <class T> 00157 WEMQueue<T>::~WEMQueue() 00158 { 00159 if (_size > 0) 00160 { 00161 WEMQueueElement<T>* tHead = _head; 00162 00163 while (tHead) 00164 { 00165 _head = tHead->getNextQueueElement(); 00166 ML_DELETE(tHead); 00167 tHead = _head; 00168 } 00169 } 00170 } 00171 00173 00174 template <class T> 00175 void WEMQueue<T>::append(T* elem) 00176 { 00177 WEMQueueElement<T>* newElement = NULL; 00178 ML_CHECK_NEW(newElement, WEMQueueElement<T>(elem)); 00179 00180 if (_size > 0) 00181 { 00182 _tail->setNextQueueElement(newElement); 00183 _tail = newElement; 00184 } 00185 else 00186 { 00187 _head = newElement; 00188 _tail = newElement; 00189 } 00190 _size ++; 00191 } 00192 00194 00195 template <class T> 00196 void WEMQueue<T>::prepend(T* elem) 00197 { 00198 WEMQueueElement<T>* newElement = NULL; 00199 ML_CHECK_NEW(newElement, WEMQueueElement<T>(elem)); 00200 00201 if (_size > 0) 00202 { 00203 newElement->setNextQueueElement(_head); 00204 _head = newElement; 00205 } 00206 else 00207 { 00208 _head = newElement; 00209 _tail = newElement; 00210 } 00211 _size ++; 00212 } 00213 00215 00216 template <class T> 00217 void WEMQueue<T>::popFront() 00218 { 00219 WEMQueueElement<T>* dHead = _head; 00220 00221 _head = dHead->getNextQueueElement(); 00222 ML_DELETE(dHead); 00223 _size --; 00224 } 00225 00227 00228 ML_END_NAMESPACE 00229 00230 #endif