All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.ssf4j.datafile.ListCache Maven / Gradle / Ivy

There is a newer version: 0.4
Show newest version
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 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 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 ref = refq.poll(); ref != null; ref = refq.poll())
			;
		size = 0;
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy