package amidst.map; import java.util.Vector; import amidst.logging.Log; public class ByteArrayCache extends CacheManager { public static final int CACHE_SIZE = 32, CACHE_SHIFT = 5; public static final int HEADER_SIZE = (CACHE_SIZE*CACHE_SIZE) >> 3; public static final int CACHE_MAX_SIZE = CACHE_SIZE*CACHE_SIZE; // TODO : Change name to CACHE_LENGTH ? private int maxUnits; private byte unitSize; private Vector<ByteArrayHub> cacheMap; private byte[] byteCache; public ByteArrayCache(byte unitSize, int maxUnits) { cacheMap = new Vector<ByteArrayHub>(); this.unitSize = unitSize; this.maxUnits = maxUnits; byteCache = new byte[unitSize*maxUnits]; } @Override public void save(Fragment frag) { } @Override public void load(Fragment frag, int layerID) { long keyX = frag.getFragmentX() >> CACHE_SHIFT; long keyY = frag.getFragmentY() >> CACHE_SHIFT; long key = (keyX << 32) | (keyY & 0xFFFFFFFFL); ByteArrayHub hub = getHub(key); if (hub == null) { hub = new ByteArrayHub(key, unitSize, maxUnits, cachePath); Log.i("Loading [X:" + keyX + " Y:" + keyY + " KEY:" + key + "]"); // TODO : Remove cacheMap.add(hub); } int subKeyX = Math.abs(frag.getFragmentX()) % CACHE_SIZE; int subKeyY = Math.abs(frag.getFragmentY()) % CACHE_SIZE; int subKey = (subKeyX << CACHE_SHIFT) + subKeyY; //Log.i("FragX:" + frag.getFragmentX() + " FragY:" + frag.getFragmentY() + " |keyX:" + keyX + " keyY:" + keyY + " key:" + key + "| X:" + subKeyX + " Y:" + subKeyY + " Key:" + subKey + " TKey:" + hub.getKey()); byte[] tempData = null; if (hub.exists(subKey)) { tempData = hub.get(subKey); } else { //tempData = (byte[]) ((NativeJavaArray)PluginManager.call(funcSave, frag)).unwrap(); hub.put(subKey, tempData); } //PluginManager.call(funcLoad, frag, tempData, layerID); hub.activeFragments++; } @Override public void unload(Fragment frag) { long keyX = frag.getFragmentX() >> CACHE_SHIFT; long keyY = frag.getFragmentY() >> CACHE_SHIFT; long key = (keyX << 32) | (keyY & 0xFFFFFFFFL); ByteArrayHub hub = getHub(key); hub.activeFragments--; //Log.i(masterCount); if (hub.activeFragments == 0) { Log.i("Unloading [X:" + keyX + " Y:" + keyY + " KEY:" + key + "]"); // TODO : Remove hub.unload(); cacheMap.remove(hub); } } private ByteArrayHub getHub(long key) { for (ByteArrayHub hub : cacheMap) { if (hub.getKey() == key) return hub; } return null; } // JS Shortcut // TODO : Add more? public byte[] intToCachedBytes(int[] data) { for (int i = 0; i < byteCache.length; i++) { byteCache[i] = (byte) data[i]; } return byteCache; } }