1 /* =============================================================================
5 * =============================================================================
7 * Copyright (C) Stanford University, 2006. All Rights Reserved.
12 * University of California, Irvine
14 * =============================================================================
16 * Unless otherwise noted, the following license applies to STAMP files:
18 * Copyright (c) 2007, Stanford University
19 * All rights reserved.
21 * Redistribution and use in source and binary forms, with or without
22 * modification, are permitted provided that the following conditions are
25 * * Redistributions of source code must retain the above copyright
26 * notice, this list of conditions and the following disclaimer.
28 * * Redistributions in binary form must reproduce the above copyright
29 * notice, this list of conditions and the following disclaimer in
30 * the documentation and/or other materials provided with the
33 * * Neither the name of Stanford University nor the names of its
34 * contributors may be used to endorse or promote products derived
35 * from this software without specific prior written permission.
37 * THIS SOFTWARE IS PROVIDED BY STANFORD UNIVERSITY ``AS IS'' AND ANY
38 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
39 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
40 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD UNIVERSITY BE LIABLE
41 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
42 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
43 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
44 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
45 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
46 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
47 * THE POSSIBILITY OF SUCH DAMAGE.
49 * =============================================================================
52 #define QUEUE_GROWTH_FACTOR 2
54 public class Queue_t {
55 int pop; /* points before element to pop */
60 /* =============================================================================
62 * =============================================================================
64 public Queue_t(int initCapacity) {
65 int capacity = ((initCapacity < 2) ? 2 : initCapacity);
66 elements = new Object[capacity];
69 this.capacity = capacity;
73 /* =============================================================================
75 * =============================================================================
78 Pqueue_alloc (int initCapacity)
80 Queue_t queuePtr = new Queue_t();
82 int capacity = ((initCapacity < 2) ? 2 : initCapacity);
83 queuePtr.elements = new Object[capacity];
84 if (queuePtr.elements == null) {
88 queuePtr.pop = capacity - 1;
90 queuePtr.capacity = capacity;
95 /* =============================================================================
97 * =============================================================================
99 public void queue_free (Queue_t queuePtr) {
100 queuePtr.elements = null;
105 /* =============================================================================
107 * =============================================================================
110 Pqueue_free (Queue_t queuePtr)
112 queuePtr.elements = null;
117 /* =============================================================================
119 * =============================================================================
122 TMqueue_free (TM_ARGDECL Queue* queuePtr)
124 queuePtr.elements = null;
129 /* =============================================================================
131 * =============================================================================
133 public boolean queue_isEmpty () {
134 //int pop = queuePtr.pop;
135 //int push = queuePtr.push;
136 //int capacity = queuePtr.capacity;
138 return (pop + 1) % capacity == push;
142 /* =============================================================================
144 * =============================================================================
154 /* =============================================================================
156 * =============================================================================
161 /* =============================================================================
163 * =============================================================================
165 public boolean queue_push (Object dataPtr) {
168 System.out.println("push == pop in Queue.java");
174 int newPush = (push + 1) % capacity;
175 if (newPush == pop) {
177 int newCapacity = capacity * QUEUE_GROWTH_FACTOR;
178 Object[] newElements = new Object[newCapacity];
179 if (newElements == null) {
184 Object[] tmpelements = elements;
187 for (src = (pop + 1); src < push; src++, dst++) {
188 newElements[dst] = elements[src];
192 for (src = (pop + 1); src < capacity; src++, dst++) {
193 newElements[dst] = elements[src];
195 for (src = 0; src < push; src++, dst++) {
196 newElements[dst] = elements[src];
201 elements = newElements;
202 pop = newCapacity - 1;
203 capacity = newCapacity;
205 newPush = push + 1; /* no need modulo */
208 elements[push] = dataPtr;
215 /* =============================================================================
217 * =============================================================================
220 Pqueue_push (Queue_t queuePtr, Object dataPtr)
222 int pop = queuePtr.pop;
223 int push = queuePtr.push;
224 int capacity = queuePtr.capacity;
227 System.out.println("push == pop in Queue.java");
232 int newPush = (push + 1) % capacity;
233 if (newPush == pop) {
235 int newCapacity = capacity * QUEUE_GROWTH_FACTOR;
236 Object[] newElements = new Object[newCapacity];
237 if (newElements == null) {
242 Object[] elements = queuePtr.elements;
245 for (src = (pop + 1); src < push; src++, dst++) {
246 newElements[dst] = elements[src];
250 for (src = (pop + 1); src < capacity; src++, dst++) {
251 newElements[dst] = elements[src];
253 for (src = 0; src < push; src++, dst++) {
254 newElements[dst] = elements[src];
259 queuePtr.elements = newElements;
260 queuePtr.pop = newCapacity - 1;
261 queuePtr.capacity = newCapacity;
263 newPush = push + 1; /* no need modulo */
267 queuePtr.elements[push] = dataPtr;
268 queuePtr.push = newPush;
273 /* =============================================================================
275 * =============================================================================
277 public Object queue_pop () {
278 int newPop = (pop + 1) % capacity;
279 if (newPop == push) {
283 //Object dataPtr = queuePtr.elements[newPop];
284 //queuePtr.pop = newPop;
285 Object dataPtr = elements[newPop];
293 /* =============================================================================
297 * =============================================================================