    001package net.minecraft.util;
    002
    003import cpw.mods.fml.relauncher.Side;
    004import cpw.mods.fml.relauncher.SideOnly;
    005import java.util.ArrayList;
    006import java.util.List;
    007
    008public class Vec3Pool
    009{
    010    private final int truncateArrayResetThreshold;
    011    private final int minimumSize;
    012
    013    /** items at and above nextFreeSpace are assumed to be available */
    014    private final List vec3Cache = new ArrayList();
    015    private int nextFreeSpace = 0;
    016    private int maximumSizeSinceLastTruncation = 0;
    017    private int resetCount = 0;
    018
    019    public Vec3Pool(int par1, int par2)
    020    {
    021        this.truncateArrayResetThreshold = par1;
    022        this.minimumSize = par2;
    023    }
    024
    025    /**
    026     * extends the pool if all vecs are currently "out"
    027     */
    028    public Vec3 getVecFromPool(double par1, double par3, double par5)
    029    {
    030        if (this.func_82589_e())
    031        {
    032            return new Vec3(this, par1, par3, par5);
    033        }
    034        else
    035        {
    036            Vec3 vec3;
    037
    038            if (this.nextFreeSpace >= this.vec3Cache.size())
    039            {
    040                vec3 = new Vec3(this, par1, par3, par5);
    041                this.vec3Cache.add(vec3);
    042            }
    043            else
    044            {
    045                vec3 = (Vec3)this.vec3Cache.get(this.nextFreeSpace);
    046                vec3.setComponents(par1, par3, par5);
    047            }
    048
    049            ++this.nextFreeSpace;
    050            return vec3;
    051        }
    052    }
    053
    054    /**
    055     * Will truncate the array everyN clears to the maximum size observed since the last truncation.
    056     */
    057    public void clear()
    058    {
    059        if (!this.func_82589_e())
    060        {
    061            if (this.nextFreeSpace > this.maximumSizeSinceLastTruncation)
    062            {
    063                this.maximumSizeSinceLastTruncation = this.nextFreeSpace;
    064            }
    065
    066            if (this.resetCount++ == this.truncateArrayResetThreshold)
    067            {
    068                int i = Math.max(this.maximumSizeSinceLastTruncation, this.vec3Cache.size() - this.minimumSize);
    069
    070                while (this.vec3Cache.size() > i)
    071                {
    072                    this.vec3Cache.remove(i);
    073                }
    074
    075                this.maximumSizeSinceLastTruncation = 0;
    076                this.resetCount = 0;
    077            }
    078
    079            this.nextFreeSpace = 0;
    080        }
    081    }
    082
    083    @SideOnly(Side.CLIENT)
    084    public void clearAndFreeCache()
    085    {
    086        if (!this.func_82589_e())
    087        {
    088            this.nextFreeSpace = 0;
    089            this.vec3Cache.clear();
    090        }
    091    }
    092
    093    public int getPoolSize()
    094    {
    095        return this.vec3Cache.size();
    096    }
    097
    098    public int func_82590_d()
    099    {
    100        return this.nextFreeSpace;
    101    }
    102
    103    private boolean func_82589_e()
    104    {
    105        return this.minimumSize < 0 || this.truncateArrayResetThreshold < 0;
    106    }
    107}