/*
* Copyright 2015 the original author or authors.
* @https://github.com/scouter-project/scouter
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package scouter.util;
public class Queue<V> {
private V[] queue;
private int head = 0;
private int tail = 0;
private int count = 0;
public Queue(int capacity) {
this.queue = (V[]) new Object[capacity + 1];
}
public synchronized V push(V item) {
queue[head] = item;
inchead();
if (head == tail) {
inctail();
return null;
} else {
count++;
return item;
}
}
public synchronized V pop() {
if (head != tail) {
V o = queue[tail];
queue[tail] = null;
inctail();
count--;
return o;
}
return null;
}
public synchronized V[] pop(int n) {
Object[] out = new Object[n];
for (int i = 0; i < n && head != tail; i++) {
out[i] = queue[tail];
queue[tail] = null;
inctail();
count--;
}
return (V[]) out;
}
public synchronized V[] popAll() {
int n = count;
Object[] out = new Object[n];
for (int i = 0; i < n && head != tail; i++) {
out[i] = queue[tail];
queue[tail] = null;
inctail();
count--;
}
return (V[]) out;
}
public synchronized void clear() {
head = tail = count = 0;
}
public int size() {
return count;
}
public V enqueue(V item) {
return push(item);
}
public V dequeue() {
return pop();
}
public boolean isEmpty() {
return count == 0;
}
public boolean isFull() {
return count >= queue.length - 1;
}
private void inchead() {
head++;
if (head >= queue.length) {
head = 0;
}
}
private void inctail() {
tail++;
if (tail >= queue.length) {
tail = 0;
}
}
public static void main(String[] args) {
Integer v;
Queue<Integer> q = new Queue<Integer>(4);
q.push(1);
System.out.println("full ? " + q.isFull());
q.push(2);
System.out.println("full ? " + q.isFull());
q.push(2);
System.out.println("full ? " + q.isFull());
q.push(2);
System.out.println("full ? " + q.isFull());
q.push(2);
System.out.println("full ? " + q.isFull());
print("out = ", q.pop(q.size()));
print("out = ", q.pop(q.size()));
print("out = ", q.pop(q.size()));
}
private static void print(String msg, Object[] pop) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < pop.length; i++) {
if (i > 0)
sb.append(',');
sb.append(pop[i]);
}
System.out.println(msg + sb);
}
}