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