package me.corriekay.simplymodular.util; import java.util.HashMap; import java.util.Map; import com.google.common.collect.MapMaker; import com.google.inject.Provider; /** * HashCache is a cache designed to store both strong and weak references to objects. This is designed to help with data concurrency. * @author Corrie */ public class HashCache { private final Map map = new HashMap<>(); private final Map cache = new MapMaker().weakValues().makeMap(); public V get(K k) { if(cache.containsKey(k)) return cache.get(k); return map.get(k); } public V optGet(K k, Provider p) { V v = get(k); if(v == null) { v = p.get(); cache.put(k, v); } return v; } public void put(K k, Provider p) { if(!cache.containsKey(k)) { V v = p.get(); cache.put(k, v); map.put(k, v); } else { map.put(k, cache.get(k)); } } public void remove(K k) { map.remove(k); } public void hardRemove(K k) { remove(k); cache.remove(k); } }