
org.ssf4j.datafile.ListCache Maven / Gradle / Ivy
package org.ssf4j.datafile;
import java.lang.ref.Reference;
import java.lang.ref.SoftReference;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class ListCache extends ImmutableListCache {
public ListCache(List wrapped) {
super(wrapped);
}
@Override
public T set(int index, T element) {
if(index < 0 || index >= size())
throw new IndexOutOfBoundsException();
T old = get(index);
wrapped.set(index, element);
reverse.remove(cache.remove(index));
Reference extends T> ref = new SoftReference(element, refq);
cache.put(index, ref);
reverse.put(ref, index);
cleanup();
return old;
}
@Override
public void add(int index, T element) {
wrapped.add(index, element);
Map> nc = new HashMap>();
Map, Integer> nr = new HashMap, Integer>();
for(Map.Entry> e : cache.entrySet())
nc.put(e.getKey() >= index ? e.getKey() + 1 : e.getKey(), e.getValue());
for(Map.Entry, Integer> e : reverse.entrySet())
nr.put(e.getKey(), e.getValue() >= index ? e.getValue() + 1 : e.getValue());
cache = nc;
reverse = nr;
Reference extends T> ref = new SoftReference(element, refq);
cache.put(index, ref);
reverse.put(ref, index);
size++;
cleanup();
}
@Override
public T remove(int index) {
wrapped.remove(index);
T old = get(index);
Map> nc = new HashMap>();
Map, Integer> nr = new HashMap, Integer>();
for(Map.Entry> e : cache.entrySet())
if(index != e.getKey())
nc.put(e.getKey() > index ? e.getKey() - 1 : e.getKey(), e.getValue());
for(Map.Entry, Integer> e : reverse.entrySet())
if(index != e.getValue())
nr.put(e.getKey(), e.getValue() > index ? e.getValue() - 1 : e.getValue());
cache = nc;
reverse = nr;
size--;
cleanup();
return old;
}
@Override
public void clear() {
wrapped.clear();
cache.clear();
reverse.clear();
for(Reference extends T> ref = refq.poll(); ref != null; ref = refq.poll())
;
size = 0;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy