/*******************************************************************************
* Copyright (c) MOBAC developers
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
******************************************************************************/
package mobac.utilities.collections;
import java.lang.ref.SoftReference;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/**
* A HashMap that uses internally SoftReferences for the value (if the app is
* running out of memory the values stored in a {@link SoftReference} will be
* automatically freed.
*
* Therefore it may happen that this map "looses" values.
*
* @param <K>
* @param <V>
*/
public class SoftHashMap<K, V> implements Map<K, V> {
HashMap<K, SoftReference<V>> map;
public SoftHashMap(int initialCapacity) {
map = new HashMap<K, SoftReference<V>>(initialCapacity);
}
public V get(Object key) {
SoftReference<V> ref = map.get(key);
return (ref != null) ? ref.get() : null;
}
public V put(K key, V value) {
SoftReference<V> ref = map.put(key, new SoftReference<V>(value));
return (ref != null) ? ref.get() : null;
}
public V remove(Object key) {
SoftReference<V> ref = map.remove(key);
return (ref != null) ? ref.get() : null;
}
public void clear() {
map.clear();
}
public boolean containsKey(Object key) {
return map.containsKey(key);
}
public boolean containsValue(Object value) {
return map.containsValue(value);
}
public boolean isEmpty() {
return map.isEmpty();
}
public Set<K> keySet() {
return map.keySet();
}
public int size() {
return map.size();
}
public Set<Map.Entry<K, V>> entrySet() {
throw new RuntimeException("Not implemented");
}
public void putAll(Map<? extends K, ? extends V> m) {
throw new RuntimeException("Not implemented");
}
public Collection<V> values() {
throw new RuntimeException("Not implemented");
}
}