MeVisLabToolboxReference
MeVisLab/Standard/Sources/ML/MLWEM/WEMDataStructure/WEMQueue.h
Go to the documentation of this file.
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