package de.hub.emffrag.datastore;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;
public class MapCache<KT> {
private final KeyType<KT> keyType;
private final TreeMap<KT, String> cachedValues = new TreeMap<KT, String>(new Comparator<KT>() {
@Override
public int compare(KT o1, KT o2) {
return keyType.compare(o1, o2);
}
});
private KT first = null;
private KT last = null;
public MapCache(KeyType<KT> keyType) {
super();
this.keyType = keyType;
}
public boolean contains(KT key) {
if (first == null) {
return false;
} else {
return keyType.compare(first, key) <= 0 && keyType.compare(last, key) >= 0;
}
}
public boolean add(KT key) {
if (last == null || keyType.compare(last, key) == -1) {
last = key;
}
if (first == null || keyType.compare(first, key) == 1) {
first = key;
}
return last == key;
}
public void set(KT key, String value) {
add(key);
cachedValues.put(key, value);
}
public String get(KT key) {
return cachedValues.get(key);
}
public KT exactOrNext(KT key) {
return cachedValues.ceilingKey(key);
}
public boolean exists(KT key) {
return cachedValues.containsKey(key);
}
public KT next(KT key) {
return exactOrNext(keyType.next(key));
}
public String remove(KT key) {
return cachedValues.remove(key);
}
public Map<byte[], byte[]> contents(IDataMap<KT> map) {
Map<byte[], byte[]> result = new HashMap<byte[], byte[]>();
for (java.util.Map.Entry<KT, String> entry: cachedValues.entrySet()) {
result.put(map.getStoreKey(entry.getKey()), entry.getValue().getBytes());
}
return result;
}
public void clear() {
cachedValues.clear();
}
}