0
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
1 /*
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
2 CircularQueue
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
3 Copyright (C) 2002 Eric Wing
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
4
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
5 This library is free software; you can redistribute it and/or
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
6 modify it under the terms of the GNU Library General Public
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
7 License as published by the Free Software Foundation; either
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
8 version 2 of the License, or (at your option) any later version.
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
9
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
10 This library is distributed in the hope that it will be useful,
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
13 Library General Public License for more details.
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
14
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
15 You should have received a copy of the GNU Library General Public
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
16 License along with this library; if not, write to the Free
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
17 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
18 */
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
19
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
20 #include "CircularQueue.h"
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
21 #include <stddef.h> /* for NULL */
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
22 #include <stdlib.h> /* for malloc/free */
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
23 #include <stdio.h> /* for debugging */
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
24
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
25 CircularQueueUnsignedInt* CircularQueueUnsignedInt_CreateQueue(unsigned int max_size)
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
26 {
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
27 CircularQueueUnsignedInt* ret_ptr;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
28 if(max_size < 1)
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
29 {
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
30 return NULL;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
31 }
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
32 ret_ptr = (CircularQueueUnsignedInt*)malloc(sizeof(CircularQueueUnsignedInt));
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
33 if(NULL == ret_ptr)
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
34 {
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
35 /* Out of memory */
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
36 return NULL;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
37 }
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
38 ret_ptr->internalQueue = (unsigned int*)malloc(sizeof(unsigned int) * max_size);
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
39 if(NULL == ret_ptr->internalQueue)
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
40 {
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
41 /* Out of memory */
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
42 free(ret_ptr);
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
43 return NULL;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
44 }
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
45 ret_ptr->maxSize = max_size;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
46 ret_ptr->currentSize = 0;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
47 ret_ptr->headIndex = 0;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
48 ret_ptr->tailIndex = 0;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
49
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
50 return ret_ptr;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
51 }
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
52
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
53 void CircularQueueUnsignedInt_FreeQueue(CircularQueueUnsignedInt* queue)
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
54 {
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
55 if(NULL == queue)
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
56 {
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
57 return;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
58 }
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
59
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
60 free(queue->internalQueue);
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
61 free(queue);
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
62 }
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
63
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
64 /**
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
65 * Returns 1 if successful, 0 if failure.
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
66 */
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
67 unsigned int CircularQueueUnsignedInt_PushBack(CircularQueueUnsignedInt* queue, unsigned int value)
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
68 {
|
2
|
69 // printf("pushBack: %d\n", value);
|
|
70
|
0
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
71 unsigned int temp_index;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
72 if(NULL == queue)
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
73 {
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
74 return 0;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
75 }
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
76 if(queue->currentSize >= queue->maxSize)
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
77 {
|
2
|
78 printf("failed to pushBack: %d\n", value);
|
|
79
|
0
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
80 return 0;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
81 }
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
82 temp_index = queue->tailIndex + 1;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
83 if(temp_index >= queue->maxSize)
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
84 {
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
85 /* need to wrap tail index around */
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
86 temp_index = 0;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
87 }
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
88 /* So with my implementation, the tail index actually points
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
89 * to the slot right after the last value.
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
90 * So we will enter the value in the current tail, and then increment
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
91 * the tail.
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
92 * Note that in a full queue, the head and tail will be the same (I think).
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
93 */
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
94 queue->internalQueue[queue->tailIndex] = value;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
95 queue->tailIndex = temp_index;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
96 queue->currentSize++;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
97
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
98 return 1;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
99 }
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
100
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
101 /**
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
102 * Returns 1 if successful, 0 if failure.
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
103 */
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
104 unsigned int CircularQueueUnsignedInt_PushFront(CircularQueueUnsignedInt* queue, unsigned int value)
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
105 {
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
106 unsigned int temp_index;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
107 if(NULL == queue)
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
108 {
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
109 return 0;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
110 }
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
111 if(queue->currentSize >= queue->maxSize)
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
112 {
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
113 return 0;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
114 }
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
115
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
116 /* This check is needed to prevent the unsigned int from overflowing. */
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
117 if(0 == queue->headIndex)
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
118 {
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
119 /* Need to wrap head index around */
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
120 temp_index = queue->maxSize - 1;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
121 }
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
122 else
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
123 {
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
124 temp_index = queue->headIndex - 1;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
125 }
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
126 /* So unlike the tail, the head index actually points to the element
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
127 * at the head, and not an element before (or after) the head.
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
128 */
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
129 queue->internalQueue[temp_index] = value;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
130 queue->headIndex = temp_index;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
131 queue->currentSize++;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
132 return 1;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
133 }
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
134
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
135 unsigned int CircularQueueUnsignedInt_PopFront(CircularQueueUnsignedInt* queue)
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
136 {
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
137 unsigned int temp_index;
|
2
|
138 // printf("PopFront: %d, %d\n", queue->headIndex,queue->internalQueue[queue->headIndex] );
|
|
139
|
0
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
140 if(NULL == queue)
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
141 {
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
142 return 0;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
143 }
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
144 if(queue->currentSize == 0)
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
145 {
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
146 return 0;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
147 }
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
148 temp_index = queue->headIndex + 1;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
149 if(temp_index >= queue->maxSize)
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
150 {
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
151 /* need to wrap tail index around */
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
152 temp_index = 0;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
153 }
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
154 queue->headIndex = temp_index;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
155 queue->currentSize--;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
156 return 1;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
157 }
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
158
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
159
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
160 unsigned int CircularQueueUnsignedInt_PopBack(CircularQueueUnsignedInt* queue)
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
161 {
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
162 unsigned int temp_index;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
163 if(NULL == queue)
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
164 {
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
165 return 0;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
166 }
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
167 if(queue->currentSize == 0)
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
168 {
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
169 return 0;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
170 }
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
171
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
172 /* This check is needed to prevent the unsigned int from overflowing. */
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
173 if(0 == queue->tailIndex)
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
174 {
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
175 temp_index = queue->maxSize - 1;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
176 }
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
177 else
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
178 {
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
179 temp_index = queue->tailIndex - 1;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
180 }
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
181
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
182 queue->tailIndex = temp_index;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
183 queue->currentSize--;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
184 return 1;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
185 }
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
186
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
187 unsigned int CircularQueueUnsignedInt_Front(CircularQueueUnsignedInt* queue)
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
188 {
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
189 if(NULL == queue)
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
190 {
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
191 return 0;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
192 }
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
193 if(0 == queue->currentSize)
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
194 {
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
195 return 0;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
196 }
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
197 return queue->internalQueue[queue->headIndex];
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
198 }
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
199
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
200
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
201 unsigned int CircularQueueUnsignedInt_Back(CircularQueueUnsignedInt* queue)
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
202 {
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
203 unsigned int temp_index;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
204 if(NULL == queue)
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
205 {
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
206 return 0;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
207 }
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
208 if(0 == queue->currentSize)
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
209 {
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
210 return 0;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
211 }
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
212 if(0 == queue->tailIndex)
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
213 {
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
214 /* need to wrap tail index around */
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
215 temp_index = queue->maxSize-1;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
216 }
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
217 else
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
218 {
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
219 temp_index = queue->tailIndex-1;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
220 }
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
221
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
222 return queue->internalQueue[temp_index];
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
223 }
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
224
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
225 unsigned int CircularQueueUnsignedInt_Size(CircularQueueUnsignedInt* queue)
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
226 {
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
227 if(NULL == queue)
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
228 {
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
229 return 0;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
230 }
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
231 return queue->currentSize;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
232 }
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
233
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
234 unsigned int CircularQueueUnsignedInt_MaxSize(CircularQueueUnsignedInt* queue)
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
235 {
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
236 if(NULL == queue)
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
237 {
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
238 return 0;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
239 }
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
240 return queue->maxSize;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
241 }
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
242
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
243 void CircularQueueUnsignedInt_Clear(CircularQueueUnsignedInt* queue)
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
244 {
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
245 if(NULL == queue)
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
246 {
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
247 return;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
248 }
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
249
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
250 queue->currentSize = 0;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
251 queue->headIndex = 0;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
252 queue->tailIndex = 0;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
253 }
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
254
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
255 void CircularQueueUnsignedInt_Print(CircularQueueUnsignedInt* queue)
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
256 {
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
257 unsigned int i;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
258 unsigned int count;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
259 if(NULL == queue)
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
260 {
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
261 return;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
262 }
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
263 fprintf(stderr, "Queue: ");
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
264 for(count=0, i=queue->headIndex; count<queue->currentSize; count++, i++)
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
265 {
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
266 if(i >= queue->maxSize)
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
267 {
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
268 i=0;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
269 }
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
270 fprintf(stderr, "%d ", queue->internalQueue[i]);
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
271 }
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
272 fprintf(stderr, "\n");
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
273 }
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
274
|
1
|
275 unsigned int CircularQueueUnsignedInt_ValueAtIndex(CircularQueueUnsignedInt* queue, unsigned int the_index)
|
|
276 {
|
|
277 unsigned int i;
|
|
278 if(NULL == queue)
|
|
279 {
|
|
280 return 0;
|
|
281 }
|
|
282 if(the_index >= queue->currentSize)
|
|
283 {
|
|
284 return 0;
|
|
285 }
|
|
286 i = (queue->headIndex + the_index) % queue->currentSize;
|
|
287 // fprintf(stderr, "%d\n", queue->internalQueue[i]);
|
|
288 return queue->internalQueue[i];
|
|
289 }
|
|
290
|
0
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
291 /*
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
292 * Implementation for void* version starts here.
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
293 */
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
294
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
295 CircularQueueVoid* CircularQueueVoid_CreateQueue(unsigned int max_size)
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
296 {
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
297 CircularQueueVoid* ret_ptr;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
298 if(max_size < 1)
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
299 {
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
300 return NULL;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
301 }
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
302 ret_ptr = (CircularQueueVoid*)malloc(sizeof(CircularQueueVoid));
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
303 if(NULL == ret_ptr)
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
304 {
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
305 /* Out of memory */
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
306 return NULL;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
307 }
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
308 ret_ptr->internalQueue = (void**)malloc(sizeof(void*) * max_size);
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
309 if(NULL == ret_ptr->internalQueue)
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
310 {
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
311 /* Out of memory */
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
312 free(ret_ptr);
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
313 return NULL;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
314 }
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
315 ret_ptr->maxSize = max_size;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
316 ret_ptr->currentSize = 0;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
317 ret_ptr->headIndex = 0;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
318 ret_ptr->tailIndex = 0;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
319
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
320 return ret_ptr;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
321 }
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
322
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
323 void CircularQueueVoid_FreeQueue(CircularQueueVoid* queue)
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
324 {
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
325 if(NULL == queue)
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
326 {
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
327 return;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
328 }
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
329
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
330 free(queue->internalQueue);
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
331 free(queue);
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
332 }
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
333
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
334 /**
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
335 * Returns 1 if successful, 0 if failure.
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
336 */
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
337 unsigned int CircularQueueVoid_PushBack(CircularQueueVoid* queue, void* value)
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
338 {
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
339 unsigned int temp_index;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
340 if(NULL == queue)
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
341 {
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
342 return 0;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
343 }
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
344 if(queue->currentSize >= queue->maxSize)
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
345 {
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
346 return 0;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
347 }
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
348 temp_index = queue->tailIndex + 1;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
349 if(temp_index >= queue->maxSize)
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
350 {
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
351 /* need to wrap tail index around */
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
352 temp_index = 0;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
353 }
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
354 queue->internalQueue[queue->tailIndex] = value;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
355 queue->tailIndex = temp_index;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
356 queue->currentSize++;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
357
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
358 return 1;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
359 }
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
360
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
361 /**
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
362 * Returns 1 if successful, 0 if failure.
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
363 */
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
364 unsigned int CircularQueueVoid_PushFront(CircularQueueVoid* queue, void* value)
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
365 {
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
366 unsigned int temp_index;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
367 if(NULL == queue)
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
368 {
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
369 return 0;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
370 }
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
371 if(queue->currentSize >= queue->maxSize)
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
372 {
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
373 return 0;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
374 }
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
375
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
376 /* This check is needed to prevent the unsigned int from overflowing. */
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
377 if(0 == queue->headIndex)
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
378 {
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
379 /* Need to wrap head index around */
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
380 temp_index = queue->maxSize - 1;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
381 }
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
382 else
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
383 {
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
384 temp_index = queue->headIndex - 1;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
385 }
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
386 queue->internalQueue[temp_index] = value;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
387 queue->headIndex = temp_index;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
388 queue->currentSize++;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
389 return 1;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
390 }
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
391
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
392 unsigned int CircularQueueVoid_PopFront(CircularQueueVoid* queue)
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
393 {
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
394 unsigned int temp_index;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
395 if(NULL == queue)
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
396 {
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
397 return 0;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
398 }
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
399 if(queue->currentSize == 0)
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
400 {
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
401 return 0;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
402 }
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
403 temp_index = queue->headIndex + 1;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
404 if(temp_index >= queue->maxSize)
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
405 {
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
406 /* need to wrap tail index around */
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
407 temp_index = 0;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
408 }
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
409 queue->headIndex = temp_index;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
410 queue->currentSize--;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
411 return 1;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
412 }
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
413
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
414
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
415 unsigned int CircularQueueVoid_PopBack(CircularQueueVoid* queue)
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
416 {
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
417 unsigned int temp_index;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
418 if(NULL == queue)
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
419 {
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
420 return 0;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
421 }
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
422 if(queue->currentSize == 0)
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
423 {
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
424 return 0;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
425 }
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
426
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
427 /* This check is needed to prevent the unsigned int from overflowing. */
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
428 if(0 == queue->tailIndex)
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
429 {
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
430 temp_index = queue->maxSize - 1;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
431 }
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
432 else
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
433 {
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
434 temp_index = queue->tailIndex - 1;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
435 }
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
436
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
437 queue->tailIndex = temp_index;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
438 queue->currentSize--;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
439 return 1;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
440 }
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
441
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
442 void* CircularQueueVoid_Front(CircularQueueVoid* queue)
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
443 {
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
444 if(NULL == queue)
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
445 {
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
446 return 0;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
447 }
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
448 if(0 == queue->currentSize)
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
449 {
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
450 return 0;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
451 }
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
452 return queue->internalQueue[queue->headIndex];
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
453 }
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
454
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
455
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
456 void* CircularQueueVoid_Back(CircularQueueVoid* queue)
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
457 {
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
458 unsigned int temp_index;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
459 if(NULL == queue)
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
460 {
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
461 return 0;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
462 }
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
463 if(0 == queue->currentSize)
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
464 {
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
465 return 0;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
466 }
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
467 if(0 == queue->tailIndex)
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
468 {
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
469 /* need to wrap tail index around */
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
470 temp_index = queue->maxSize-1;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
471 }
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
472 else
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
473 {
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
474 temp_index = queue->tailIndex-1;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
475 }
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
476
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
477 return queue->internalQueue[temp_index];
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
478 }
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
479
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
480 unsigned int CircularQueueVoid_Size(CircularQueueVoid* queue)
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
481 {
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
482 if(NULL == queue)
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
483 {
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
484 return 0;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
485 }
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
486 return queue->currentSize;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
487 }
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
488
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
489 unsigned int CircularQueueVoid_MaxSize(CircularQueueVoid* queue)
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
490 {
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
491 if(NULL == queue)
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
492 {
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
493 return 0;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
494 }
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
495 return queue->maxSize;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
496 }
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
497
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
498 void CircularQueueVoid_Clear(CircularQueueVoid* queue)
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
499 {
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
500 if(NULL == queue)
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
501 {
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
502 return;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
503 }
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
504
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
505 queue->currentSize = 0;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
506 queue->headIndex = 0;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
507 queue->tailIndex = 0;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
508 }
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
509
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
510 void CircularQueueVoid_Print(CircularQueueVoid* queue)
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
511 {
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
512 unsigned int i;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
513 unsigned int count;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
514 if(NULL == queue)
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
515 {
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
516 return;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
517 }
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
518 fprintf(stderr, "Queue: ");
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
519 for(count=0, i=queue->headIndex; count<queue->currentSize; count++, i++)
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
520 {
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
521 if(i >= queue->maxSize)
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
522 {
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
523 i=0;
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
524 }
|
1
|
525 fprintf(stderr, "%x ", (unsigned int)queue->internalQueue[i]);
|
0
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
526 }
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
527 fprintf(stderr, "\n");
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
528 }
|
1
|
529
|
|
530 void* CircularQueueVoid_ValueAtIndex(CircularQueueVoid* queue, unsigned int the_index)
|
|
531 {
|
|
532 unsigned int i;
|
|
533 if(NULL == queue)
|
|
534 {
|
|
535 return NULL;
|
|
536 }
|
|
537 if(the_index >= queue->currentSize)
|
|
538 {
|
|
539 return NULL;
|
|
540 }
|
|
541 i = (queue->headIndex + the_index) % queue->currentSize;
|
|
542 // fprintf(stderr, "%d\n", queue->internalQueue[i]);
|
|
543 return queue->internalQueue[i];
|
|
544 }
|
0
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
545
|
Eric Wing <ewing . public |-at-| gmail . com>
parents:
diff
changeset
|
546
|