/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package automenta.spacenet.var.map; import java.util.Collection; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; /** * * @author seh */ public class MapVar<K,V> implements Map<K,V> { private Map<K,V> m = new HashMap(); public interface IfMapChanges<K,V> { public void onMapChanged(MapVar<K,V> map); } //TODO lazy-instantiate private List<IfMapChanges<K,V>> mapChanges = new LinkedList(); public MapVar() { this(16, false); } public MapVar(int initialCapacity, boolean concurrent) { super(); if (concurrent) { m = new ConcurrentHashMap(initialCapacity); } else { m = new HashMap(initialCapacity); } } public void add(IfMapChanges<K,V> c) { mapChanges.add(c); } public void remove(IfMapChanges<K,V> c) { mapChanges.remove(c); } protected void notifyChanged() { for (IfMapChanges<K,V> c : mapChanges) { c.onMapChanged(this); } } @Override public int size() { return m.size(); } @Override public boolean isEmpty() { return m.isEmpty(); } @Override public boolean containsKey(Object key) { return m.containsKey(key); } @Override public boolean containsValue(Object value) { return m.containsValue(value); } @Override public V get(Object key) { return m.get(key); } @Override public V put(K key, V value) { V replaced = m.put(key, value); notifyChanged(); return replaced; } @Override public V remove(Object key) { V removed = m.remove(key); if (removed!=null) notifyChanged(); return removed; } @Override public void putAll(Map<? extends K, ? extends V> o) { m.putAll(o); notifyChanged(); } @Override public void clear() { m.clear(); notifyChanged(); } @Override public Set<K> keySet() { return m.keySet(); } @Override public Collection<V> values() { return m.values(); } @Override public Set<Entry<K, V>> entrySet() { return m.entrySet(); } }