package gueei.binding.utility;
import gueei.binding.collections.ILazyLoadRowModel;
import java.util.ArrayList;
import java.util.HashMap;
import android.util.Log;
/**
* A HashMap that will have fixed size,
* once the allocated size is over, the
* oldest entry will be removed if it is not mapped
*
*
* TODO: find a better algorithm
* @param <E>
* @author andy
*/
public class CacheHashMap<K, V extends ILazyLoadRowModel> extends HashMap<K, V> {
private static final long serialVersionUID = 1L;
private ArrayList<K> keyList = new ArrayList<K>();
private int mCacheSize = 50;
public CacheHashMap(int cacheSize) {
mCacheSize = cacheSize;
}
@Override
public synchronized V put(K key, V value) {
// Check whether it is oversize
int oversize = keyList.size() - mCacheSize;
if (oversize > 0){
ArrayList<Integer> pendingRemove = new ArrayList<Integer>(oversize);
for(int i=0; i<oversize; i++){
V rVal = this.get(keyList.get(i));
// Log.d("CacheHashMap:put", keyList.get(i) + ":" + rVal);
if (rVal != null && rVal.isMapped()) continue;
pendingRemove.add(i);
}
for (int i=0; i<pendingRemove.size(); i++){
K removed = keyList.remove(pendingRemove.get(i)-i);
this.remove(removed);
}
}
keyList.add(key);
return super.put(key, value);
}
public void reSize(int newSize) {
mCacheSize = newSize;
}
@Override
public int size() {
return mCacheSize;
}
}