// Copyright (C) 2007-2025 EQ2EMulator // Licensed under GPL v3 #ifndef QUEUE_H #define QUEUE_H template class MyQueue; template class MyQueueNode { public: MyQueueNode(T* data) { next = 0; this->data = data; } friend class MyQueue; private: T* data; MyQueueNode* next; }; template class MyQueue { public: MyQueue() { head = tail = 0; } ~MyQueue() { clear(); } void push(T* data) { if (head == 0) { tail = head = new MyQueueNode(data); } else { tail->next = new MyQueueNode(data); tail = tail->next; } } T* pop() { if (head == 0) { return 0; } T* data = head->data; MyQueueNode* next_node = head->next; delete head; head = next_node; return data; } T* top() { if (head == 0) { return 0; } return head->data; } bool empty() { if (head == 0) { return true; } return false; } void clear() { T* d = 0; while((d = pop())) { delete d; } return; } int count() { int count = 0; MyQueueNode* d = head; while(d != 0) { count++; d = d->next; } return(count); } private: MyQueueNode* head; MyQueueNode* tail; }; #endif