package net.minecraft.launcher.process; import java.lang.reflect.Array; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; public class LimitedCapacityList<T> { private final T[] items; private final Class<? extends T> clazz; private final ReadWriteLock locks = new ReentrantReadWriteLock(); private int size; private int head; public LimitedCapacityList(Class<? extends T> clazz, int maxSize) { this.clazz = clazz; this.items = ((T[]) Array.newInstance(clazz, maxSize)); } public T add(T value) { this.locks.writeLock().lock(); this.items[this.head] = value; this.head = ((this.head + 1) % getMaxSize()); if (this.size < getMaxSize()) this.size += 1; this.locks.writeLock().unlock(); return value; } public int getSize() { this.locks.readLock().lock(); int result = this.size; this.locks.readLock().unlock(); return result; } public int getMaxSize() { this.locks.readLock().lock(); int result = this.items.length; this.locks.readLock().unlock(); return result; } public T[] getItems() { Object[] result = (Object[]) Array.newInstance(this.clazz, this.size); this.locks.readLock().lock(); for (int i = 0; i < this.size; i++) { int pos = (this.head - this.size + i) % getMaxSize(); if (pos < 0) pos += getMaxSize(); result[i] = this.items[pos]; } this.locks.readLock().unlock(); return (T[]) result; } }