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 { private final transient Class cls; private final T[] arr; private final int capacity; private int head; private int tail; { this.head = 0; this.tail = 0; } public CoolsQueue(Class 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 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); } }