package net.minecraft.util;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import java.util.ArrayList;
import java.util.List;
public class Vec3Pool
{
private final int truncateArrayResetThreshold;
private final int minimumSize;
/** items at and above nextFreeSpace are assumed to be available */
private final List vec3Cache = new ArrayList();
private int nextFreeSpace = 0;
private int maximumSizeSinceLastTruncation = 0;
private int resetCount = 0;
public Vec3Pool(int par1, int par2)
{
this.truncateArrayResetThreshold = par1;
this.minimumSize = par2;
}
/**
* extends the pool if all vecs are currently "out"
*/
public Vec3 getVecFromPool(double par1, double par3, double par5)
{
if (this.func_82589_e())
{
return new Vec3(this, par1, par3, par5);
}
else
{
Vec3 var7;
if (this.nextFreeSpace >= this.vec3Cache.size())
{
var7 = new Vec3(this, par1, par3, par5);
this.vec3Cache.add(var7);
}
else
{
var7 = (Vec3)this.vec3Cache.get(this.nextFreeSpace);
var7.setComponents(par1, par3, par5);
}
++this.nextFreeSpace;
return var7;
}
}
/**
* Will truncate the array everyN clears to the maximum size observed since the last truncation.
*/
public void clear()
{
if (!this.func_82589_e())
{
if (this.nextFreeSpace > this.maximumSizeSinceLastTruncation)
{
this.maximumSizeSinceLastTruncation = this.nextFreeSpace;
}
if (this.resetCount++ == this.truncateArrayResetThreshold)
{
int var1 = Math.max(this.maximumSizeSinceLastTruncation, this.vec3Cache.size() - this.minimumSize);
while (this.vec3Cache.size() > var1)
{
this.vec3Cache.remove(var1);
}
this.maximumSizeSinceLastTruncation = 0;
this.resetCount = 0;
}
this.nextFreeSpace = 0;
}
}
@SideOnly(Side.CLIENT)
public void clearAndFreeCache()
{
if (!this.func_82589_e())
{
this.nextFreeSpace = 0;
this.vec3Cache.clear();
}
}
public int getPoolSize()
{
return this.vec3Cache.size();
}
public int func_82590_d()
{
return this.nextFreeSpace;
}
private boolean func_82589_e()
{
return this.minimumSize < 0 || this.truncateArrayResetThreshold < 0;
}
}