package br.com.etyllica.storage;
import java.util.ArrayList;
import java.util.List;
public class RingBuffer<T> {
private List<T> copyList;
private List<T> list;
private Class<T> cls;
private int usedSlot = 0;
private int minimumSlots = 0;
public RingBuffer(Class<T> cls) {
super();
this.cls = cls;
list = new ArrayList<T>();
copyList = new ArrayList<T>();
}
public T getSlot() {
T slot;
if(usedSlot < list.size() ) {
slot = list.get(usedSlot);
} else {
slot = create();
list.add(slot);
}
usedSlot++;
return slot;
}
public void pack() {
int lastPack = usedSlot+1;
if(list.size() > lastPack && list.size() > minimumSlots ) {
removeLast(list.size() - usedSlot);
}
usedSlot = 0;
}
private void removeLast(int capacity) {
if(capacity > list.size())
return;
for(int i = 0; i < capacity; i++) {
list.remove(0);
}
}
private T create() {
try{
return cls.newInstance();
} catch(Exception e) {
e.printStackTrace();
return null;
}
}
public List<T> getList() {
copyList.clear();
copyList.addAll(list.subList(0, usedSlot));
return copyList;
}
public int getMinimumSlots() {
return minimumSlots;
}
public void setMinimumSlots(int minimumSlots) {
this.minimumSlots = minimumSlots;
}
public int size() {
return list.size();
}
}