package com.mandelsoft.mand.util;
import com.mandelsoft.mand.MandelName;
import com.mandelsoft.mand.QualifiedMandelName;
import com.mandelsoft.mand.cm.Colormap;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class MandelColormapCache {
private int max;
private List<QualifiedMandelName> list;
private Map<QualifiedMandelName, Colormap> map;
private Map<QualifiedMandelName, Colormap> locked;
public MandelColormapCache(int max)
{
this.max=max;
list=new ArrayList<QualifiedMandelName>();
map=new HashMap<QualifiedMandelName, Colormap>();
locked=new HashMap<QualifiedMandelName, Colormap>();
}
synchronized
public Colormap get(QualifiedMandelName n)
{
Colormap cm=map.get(n);
if (cm==null) cm=locked.get(n);
return cm;
}
synchronized
public void remove(QualifiedMandelName n)
{
list.remove(n);
map.remove(n);
locked.remove(n);
}
synchronized
public void remove(MandelName n)
{
List<QualifiedMandelName> del=new ArrayList<QualifiedMandelName>();
for (QualifiedMandelName q:list) {
if (q.getMandelName().equals(n)) del.add(q);
}
for (QualifiedMandelName q:list) {
remove(n);
}
}
synchronized
public void unlock(QualifiedMandelName n)
{
if (locked.containsKey(n)) {
Colormap cm=locked.get(n);
remove(n);
add(n,cm);
}
}
synchronized
public void lock(QualifiedMandelName n, Colormap cm)
{
remove(n);
locked.put(n,cm);
}
synchronized
public void add(QualifiedMandelName n, Colormap cm)
{
if (locked.containsKey(n)) {
locked.put(n, cm);
}
else {
if (!map.containsKey(n)&&list.size()>=max) {
map.remove(list.get(0));
list.remove(0);
}
list.remove(n);
list.add(n);
map.put(n, cm);
}
}
}