#ifndef MISC_QUEUE_H #define MISC_QUEUE_H //////////////////////////////////////////// // Created by Sam Svensson 2013 ///////////////////////////////////////////// #include "IQueue.h" namespace Utility { namespace Container { template class Queue : public IQueue { public: Queue(); virtual ~Queue(); virtual void Push( Type item ); virtual Type Pop(); virtual Type Front(); virtual Type Back(); virtual int Size(); virtual bool IsEmpty(); virtual void Swap( IQueue &queue ); private: class Node { public: Type item; Node *next; Node(Type item){ this->item = item; this->next = NULL; }; ~Node() {}; }; Node *front; Node *back; int nrOfNodes; }; //---------------------------------------------- //implemented template functions //---------------------------------------------- template < typename Type > Queue::Queue() { this->front = NULL; this->back = NULL; this->nrOfNodes = 0; } template < typename Type > Queue::~Queue() { if(!nrOfNodes) return; if(this->front != NULL) { Node *destroyer; Node *walker = this->front; for(int i = 0; i < this->nrOfNodes; i++) { destroyer = walker; walker = walker->next; delete destroyer; } this->front = NULL; this->back = NULL; } } template < typename Type > void Queue::Push(Type item) { Node *e = new Node(item); if(this->front != NULL) { this->back->next = e; this->back = e; } else { this->front = e; this->back = e; } this->nrOfNodes++; } template < typename Type > Type Queue::Pop() { Type item = this->front->item; Node *destroyer = this->front; this->front = front->next; delete destroyer; this->nrOfNodes--; if(nrOfNodes == 0) { this->front = NULL; this->back = NULL; } return item; } template < typename Type > Type Queue::Front() { Type temp = this->front->item; return temp; } template < typename Type > Type Queue::Back() { Type temp = this->back->item; return temp; } template < typename Type > int Queue::Size() { int size = this->nrOfNodes; return size; } template < typename Type > bool Queue::IsEmpty() { if(nrOfNodes == 0 || this->front == NULL) { return true; } return false; } template < typename Type > void Queue::Swap(IQueue &queue ) { int prevNrOfNodes = this->nrOfNodes; int size = queue.Size(); for(int i = 0; i < size; i++) { this->Push(queue.Pop()); } for(int i = 0; i < prevNrOfNodes; i++) { queue.Push(this->Pop()); } } } } #endif