| 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); | 
|     } | 
|   | 
| } |