package org.mafagafogigante.dungeon.util;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
/**
* CircularList class that provides a list with a maximum capacity.
*
* <p>After the specified maximum capacity is reached, when a new element is added, the oldest element on the list is
* removed.
*/
public final class CircularList<T> implements Serializable {
private final int capacity;
private final List<T> list;
/**
* The index where the element that should be at 0 actually is. Initially 0.
*/
private int zeroIndex;
/**
* Constructs an empty CircularList of the specified capacity.
*/
public CircularList(int capacity) {
if (capacity < 1) {
throw new IllegalArgumentException("capacity must be positive.");
}
this.capacity = capacity;
this.list = new ArrayList<>(capacity);
}
/**
* Add an element to this CircularList.
*
* @param element the element to be added
*/
public void add(T element) {
if (isFull()) {
list.set(zeroIndex, element);
incrementZeroIndex();
} else {
list.add(element);
}
}
/**
* Increments the zeroIndex variable, setting it to 0 if it is equal to the capacity.
*/
private void incrementZeroIndex() {
zeroIndex = (zeroIndex + 1) % capacity;
}
/**
* Returns the number of elements in this CircularList.
*
* @return the number of elements in this CircularList
*/
public int size() {
return list.size();
}
/**
* Returns true if this CircularList is at its maximum capacity. False otherwise.
*
* @return true if this CircularList is full
*/
boolean isFull() {
return size() == capacity;
}
/**
* Returns true if this CircularList contains no elements.
*
* @return true if this CircularList contains no elements
*/
public boolean isEmpty() {
return list.isEmpty();
}
/**
* Returns the element at the specified position in this list.
*
* @param index index of the element to return
* @return the element at the specified position in this list
* @throws IndexOutOfBoundsException if the index is bigger than the size of this CircularList
*/
public T get(final int index) {
if (index > size()) {
throw new IndexOutOfBoundsException();
}
return list.get((index + zeroIndex) % capacity);
}
}