001    package net.minecraft.util;
002    
003    import cpw.mods.fml.relauncher.Side;
004    import cpw.mods.fml.relauncher.SideOnly;
005    import java.util.ArrayList;
006    import java.util.List;
007    
008    public 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 var7;
037    
038                if (this.nextFreeSpace >= this.vec3Cache.size())
039                {
040                    var7 = new Vec3(this, par1, par3, par5);
041                    this.vec3Cache.add(var7);
042                }
043                else
044                {
045                    var7 = (Vec3)this.vec3Cache.get(this.nextFreeSpace);
046                    var7.setComponents(par1, par3, par5);
047                }
048    
049                ++this.nextFreeSpace;
050                return var7;
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 var1 = Math.max(this.maximumSizeSinceLastTruncation, this.vec3Cache.size() - this.minimumSize);
069    
070                    while (this.vec3Cache.size() > var1)
071                    {
072                        this.vec3Cache.remove(var1);
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    }