package de.tu.darmstadt.seemoo.ansian.model;
import java.lang.reflect.Array;
public class ObjectRingBuffer<T> {
private T[] array;
private Class<T> c;
private int currentIndex = 0;
private int maxIndex;
private int size;
private boolean filled;
private final static int defaultSize = 500;
@SuppressWarnings("unused")
private static final String LOGTAG = "ObjectRingBuffer";
@SuppressWarnings("unchecked")
public ObjectRingBuffer(Class<T> c, int size) {
this.c = c;
array = (T[]) Array.newInstance(c, size);
this.size = size;
maxIndex = size - 1;
filled = false;
}
@SuppressWarnings("unchecked")
public ObjectRingBuffer(Class<T> c) {
this(c, defaultSize);
}
public void add(T obj) {
if (currentIndex++ == maxIndex) {
currentIndex = 0;
filled = true;
// Log.d(LOGTAG, "full."+maxIndex);
}
if (array != null)
array[currentIndex] = obj;
}
public T getLast() {
return array[currentIndex];
}
public T[] getLast(int length) {
if (length > size)
length = size;
int tempIndex = currentIndex;
@SuppressWarnings("unchecked")
T[] result = (T[]) Array.newInstance(c, length);
// if (length > tempIndex) {
// System.arraycopy(array, tempIndex, result, 0, maxIndex-tempIndex);
// System.arraycopy(array, 0, result, maxIndex-tempIndex,
// length-tempIndex-1);
// } else
// System.arraycopy(array, tempIndex - length, result, 0, length-1);
System.arraycopy(array, 0, result, 0, length);
return result;
}
public T[] getSamples() {
return getLast(size);
}
}