OpenMoHAA 0.82.1
Loading...
Searching...
No Matches
queue.h
1/*
2===========================================================================
3Copyright (C) 2015 the OpenMoHAA team
4
5This file is part of OpenMoHAA source code.
6
7OpenMoHAA source code is free software; you can redistribute it
8and/or modify it under the terms of the GNU General Public License as
9published by the Free Software Foundation; either version 2 of the License,
10or (at your option) any later version.
11
12OpenMoHAA source code is distributed in the hope that it will be
13useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
18along with OpenMoHAA source code; if not, write to the Free Software
19Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20===========================================================================
21*/
22
23// queue.h: Generic Queue object
24//
25
26#pragma once
27
28#include "class.h"
29
30template<class T>
31class QueueNode : public Class
32{
33public:
34 T data;
35 QueueNode *next;
36
37 QueueNode();
38};
39
40template<class T>
41QueueNode<T>::QueueNode()
42{
43 data = NULL;
44 next = NULL;
45}
46
47template<class T>
48class Queue : public Class
49{
50private:
51 QueueNode<T> *head;
52 QueueNode<T> *tail;
53
54public:
55 Queue();
56 ~Queue();
57 void Clear(void);
58 qboolean Empty(void);
59 void Enqueue(T data);
60 T Dequeue(void);
61 void Remove(T data);
62 qboolean Inqueue(T data);
63};
64
65template<class T>
66qboolean Queue<T>::Empty(void)
67{
68 if (head == NULL) {
69 assert(!tail);
70 return true;
71 }
72
73 assert(tail);
74 return false;
75}
76
77template<class T>
78void Queue<T>::Enqueue(T data)
79{
80 QueueNode<T> *tmp;
81
82 tmp = new QueueNode<T>;
83 assert(tmp);
84
85 tmp->data = data;
86
87 assert(!tmp->next);
88 if (!head) {
89 assert(!tail);
90 head = tmp;
91 } else {
92 assert(tail);
93 tail->next = tmp;
94 }
95 tail = tmp;
96}
97
98template<class T>
99T Queue<T>::Dequeue(void)
100{
101 T ptr;
102 QueueNode<T> *node;
103
104 if (!head) {
105 assert(!tail);
106 return NULL;
107 }
108
109 node = head;
110 ptr = node->data;
111
112 head = node->next;
113 if (head == NULL) {
114 assert(tail == node);
115 tail = NULL;
116 }
117
118 delete node;
119
120 return ptr;
121}
122
123template<class T>
124void Queue<T>::Clear(void)
125{
126 while (!Empty()) {
127 Dequeue();
128 }
129}
130
131template<class T>
132Queue<T>::Queue()
133{
134 head = NULL;
135 tail = NULL;
136}
137
138template<class T>
139Queue<T>::~Queue()
140{
141 Clear();
142}
143
144template<class T>
145void Queue<T>::Remove(T data)
146{
147 QueueNode<T> *node;
148 QueueNode<T> *prev;
149
150 if (!head) {
151 assert(!tail);
152
153 gi.DPrintf("Queue::Remove : Data not found in queue\n");
154 return;
155 }
156
157 for (prev = NULL, node = head; node != NULL; prev = node, node = node->next) {
158 if (node->data == data) {
159 break;
160 }
161 }
162
163 if (!node) {
164 gi.DPrintf("Queue::Remove : Data not found in queue\n");
165 } else {
166 if (!prev) {
167 // at head
168 assert(node == head);
169 head = node->next;
170 if (head == NULL) {
171 assert(tail == node);
172 tail = NULL;
173 }
174 } else {
175 prev->next = node->next;
176 if (prev->next == NULL) {
177 // at tail
178 assert(tail == node);
179 tail = prev;
180 }
181 }
182
183 delete node;
184 }
185}
186
187template<class T>
188qboolean Queue<T>::Inqueue(T data)
189{
190 QueueNode<T> *node;
191
192 for (node = head; node != NULL; node = node->next) {
193 if (node->data == data) {
194 return true;
195 }
196 }
197
198 return false;
199}
Definition queue.h:32