package org.andork.tracker.model; import java.util.Map; import java.util.Objects; import org.andork.tracker.Dependency; public class TrackableMap<K, V> { final Map<K, V> m; final Dependency sizeDep = new Dependency(); final KeyedDependency<K> entryDeps = new KeyedDependency<>(); public TrackableMap(Map<K, V> map) { m = Objects.requireNonNull(map); } public void clear() { if (m.size() > 0) { sizeDep.changed(); } m.clear(); } public boolean containsKey(K key) { entryDeps.depend(key); return m.containsKey(key); } @Override public boolean equals(Object o) { entryDeps.depend(); return m.equals(o); } public V get(K key) { entryDeps.depend(key); return m.get(key); } @Override public int hashCode() { entryDeps.depend(); return m.hashCode(); } public boolean isEmpty() { return size() == 0; } public void put(K key, V value) { int oldSize = m.size(); if (m.put(key, value) != value) { entryDeps.changed(key); } if (m.size() != oldSize) { sizeDep.changed(); } } public void putAll(Map<K, V> map) { int oldSize = m.size(); for (Map.Entry<K, V> entry : map.entrySet()) { if (m.put(entry.getKey(), entry.getValue()) != entry.getValue()) { entryDeps.changed(entry.getKey()); } } if (m.size() != oldSize) { sizeDep.changed(); } } public void remove(K key) { int oldSize = m.size(); m.remove(key); if (oldSize != m.size()) { entryDeps.changed(key); sizeDep.changed(); } } public void remove(K key, V value) { if (m.remove(key, value)) { entryDeps.changed(key); sizeDep.changed(); } } public int size() { sizeDep.depend(); return m.size(); } }