package com.vincent.rsf.common.utils;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
import java.lang.reflect.Array;
|
import java.util.Arrays;
|
import java.util.List;
|
|
/**
|
* news stories for zoneyung
|
* Created by vincent on 2022/12/22
|
*/
|
@Slf4j
|
@SuppressWarnings({"all"})
|
public class CoolsQueue<T> {
|
|
private final transient Class<T> cls;
|
private final T[] arr;
|
private final int capacity;
|
private int head;
|
private int tail;
|
|
{ this.head = 0; this.tail = 0; }
|
|
public CoolsQueue(Class<T> cls, int capacity) {
|
this.cls = cls;
|
this.arr = (T[]) Array.newInstance(cls, capacity);
|
this.capacity = capacity;
|
}
|
|
public synchronized boolean offer(T t) {
|
if (this.tail == this.capacity) {
|
this.peek();
|
}
|
this.reform();
|
this.arr[this.tail] = t;
|
this.tail ++;
|
return true;
|
}
|
|
public synchronized boolean put(T t) {
|
if (this.tail == this.capacity) {
|
return false;
|
} else {
|
this.reform();
|
}
|
this.arr[this.tail] = t;
|
this.tail ++;
|
return true;
|
}
|
|
public synchronized T peek() {
|
if (this.head == this.tail) {
|
return null;
|
}
|
T t = this.arr[this.head];
|
this.head ++;
|
this.reform();
|
return t;
|
}
|
|
private void reform() {
|
for (int i = this.head; i < this.tail; i++) {
|
this.arr[i-this.head] = this.arr[i];
|
}
|
this.tail -= this.head;
|
this.head = 0;
|
}
|
|
public synchronized int size() {
|
return this.tail - this.head;
|
}
|
|
public synchronized List<T> data() {
|
T[] ts = (T[]) Array.newInstance(this.cls, size());
|
if (this.tail - this.head >= 0) {
|
System.arraycopy(this.arr, this.head, ts, 0, this.tail - this.head);
|
}
|
return Arrays.asList(ts);
|
}
|
|
}
|