001    package net.minecraft.world.gen.layer;
002    
003    import java.util.ArrayList;
004    import java.util.List;
005    
006    public class IntCache
007    {
008        private static int intCacheSize = 256;
009    
010        /**
011         * A list of pre-allocated int[256] arrays that are currently unused and can be returned by getIntCache()
012         */
013        private static List freeSmallArrays = new ArrayList();
014    
015        /**
016         * A list of pre-allocated int[256] arrays that were previously returned by getIntCache() and which will not be re-
017         * used again until resetIntCache() is called.
018         */
019        private static List inUseSmallArrays = new ArrayList();
020    
021        /**
022         * A list of pre-allocated int[cacheSize] arrays that are currently unused and can be returned by getIntCache()
023         */
024        private static List freeLargeArrays = new ArrayList();
025    
026        /**
027         * A list of pre-allocated int[cacheSize] arrays that were previously returned by getIntCache() and which will not
028         * be re-used again until resetIntCache() is called.
029         */
030        private static List inUseLargeArrays = new ArrayList();
031    
032        public static synchronized int[] getIntCache(int par0)
033        {
034            int[] var1;
035    
036            if (par0 <= 256)
037            {
038                if (freeSmallArrays.isEmpty())
039                {
040                    var1 = new int[256];
041                    inUseSmallArrays.add(var1);
042                    return var1;
043                }
044                else
045                {
046                    var1 = (int[])freeSmallArrays.remove(freeSmallArrays.size() - 1);
047                    inUseSmallArrays.add(var1);
048                    return var1;
049                }
050            }
051            else if (par0 > intCacheSize)
052            {
053                intCacheSize = par0;
054                freeLargeArrays.clear();
055                inUseLargeArrays.clear();
056                var1 = new int[intCacheSize];
057                inUseLargeArrays.add(var1);
058                return var1;
059            }
060            else if (freeLargeArrays.isEmpty())
061            {
062                var1 = new int[intCacheSize];
063                inUseLargeArrays.add(var1);
064                return var1;
065            }
066            else
067            {
068                var1 = (int[])freeLargeArrays.remove(freeLargeArrays.size() - 1);
069                inUseLargeArrays.add(var1);
070                return var1;
071            }
072        }
073    
074        /**
075         * Mark all pre-allocated arrays as available for re-use by moving them to the appropriate free lists.
076         */
077        public static synchronized void resetIntCache()
078        {
079            if (!freeLargeArrays.isEmpty())
080            {
081                freeLargeArrays.remove(freeLargeArrays.size() - 1);
082            }
083    
084            if (!freeSmallArrays.isEmpty())
085            {
086                freeSmallArrays.remove(freeSmallArrays.size() - 1);
087            }
088    
089            freeLargeArrays.addAll(inUseLargeArrays);
090            freeSmallArrays.addAll(inUseSmallArrays);
091            inUseLargeArrays.clear();
092            inUseSmallArrays.clear();
093        }
094    
095        public static synchronized String func_85144_b()
096        {
097            return "cache: " + freeLargeArrays.size() + ", tcache: " + freeSmallArrays.size() + ", allocated: " + inUseLargeArrays.size() + ", tallocated: " + inUseSmallArrays.size();
098        }
099    }