// by Apache; modified
sclass WeakIdentityHashMap<K, V> implements Map<K, V> {
private final ReferenceQueue<K> queue = new ReferenceQueue<K>();
private Map<IdentityWeakReference, V> backingStore
= new HashMap<IdentityWeakReference, V>();
*() {
_registerWeakMap(this);
}
public synchronized void clear() {
backingStore.clear();
reap();
}
public synchronized boolean containsKey(Object key) {
reap();
return backingStore.containsKey(new IdentityWeakReference(key));
}
public synchronized boolean containsValue(Object value) {
reap();
return backingStore.containsValue(value);
}
public synchronized Set<Map.Entry<K, V>> entrySet() {
reap();
Set<Map.Entry<K, V>> ret = new HashSet<Map.Entry<K, V>>();
for (Map.Entry<IdentityWeakReference, V> ref : backingStore.entrySet()) {
final K key = ref.getKey().get();
final V value = ref.getValue();
Map.Entry<K, V> entry = new Map.Entry<K, V>() {
public synchronized K getKey() {
return key;
}
public synchronized V getValue() {
return value;
}
public synchronized V setValue(V value) {
throw new UnsupportedOperationException();
}
};
ret.add(entry);
}
return Collections.unmodifiableSet(ret);
}
public synchronized Set<K> keySet() {
reap();
new IdentityHashMap<K, Bool> map;
for (IdentityWeakReference ref : backingStore.keySet()) {
K k = ref.get();
if (k != null) map.put(k, Bool.TRUE);
}
return map.keySet();
}
public synchronized boolean equals(Object o) {
if (!(o instanceof WeakIdentityHashMap)) {
return false;
}
return backingStore.equals(((WeakIdentityHashMap)o).backingStore);
}
public synchronized V get(Object key) {
reap();
return backingStore.get(new IdentityWeakReference(key));
}
// return value seems unreliable (see ButtonImageLoader)
public synchronized V put(K key, V value) {
reap();
return backingStore.put(new IdentityWeakReference(key), value);
}
public synchronized int hashCode() {
reap();
return backingStore.hashCode();
}
public synchronized boolean isEmpty() {
reap();
return backingStore.isEmpty();
}
public synchronized void putAll(Map t) {
throw new UnsupportedOperationException();
}
// TODO: the IdentityWeakReference made is later enqueued,
// even though it's not added to the map. Is that a problem?
public synchronized V remove(Object key) {
reap();
return backingStore.remove(new IdentityWeakReference(key));
}
public synchronized int size() {
reap();
return backingStore.size();
}
public synchronized Collection<V> values() {
reap();
return backingStore.values();
}
private synchronized void reap() {
O zombie = queue.poll();
while (zombie != null) {
IdentityWeakReference victim = (IdentityWeakReference) zombie;
ifdef WeakIdentityHashMap_debug
print("WeakIdentityHashMap removing: " + victim.get());
endifdef
backingStore.remove(victim);
zombie = queue.poll();
}
}
class IdentityWeakReference extends WeakReference<K> {
int hash;
@SuppressWarnings("unchecked")
IdentityWeakReference(Object obj) {
super((K)obj, queue);
hash = System.identityHashCode(obj);
}
public synchronized int hashCode() {
return hash;
}
public synchronized boolean equals(Object o) {
if (this == o) {
return true;
}
if (!(o instanceof WeakIdentityHashMap.IdentityWeakReference)) {
return false;
}
IdentityWeakReference ref = (IdentityWeakReference)o;
if (this.get() == ref.get()) {
return true;
}
return false;
}
}
}/** * Implements a combination of WeakHashMap and IdentityHashMap. * Useful for caches that need to key off of a == comparison * instead of a .equals. * * <b> * This class is not a general-purpose Map implementation! While * this class implements the Map interface, it intentionally violates * Map's general contract, which mandates the use of the equals method * when comparing objects. This class is designed for use only in the * rare cases wherein reference-equality semantics are required. * * Note that this implementation is not synchronized. * </b> */
download show line numbers debug dex old transpilations
Travelled to 14 computer(s): aoiabmzegqzx, bhatertpkbcr, cbybwowwnfue, cfunsshuasjs, gwrvuhgaqvyk, ishqpsrjomds, lpdgvwnxivlt, mqqgnosmbjvj, onxytkatvevr, pyentgdyhuwx, pzhvpgtvlbxg, tslmcundralx, tvejysmllsmz, vouqrxazstgt
No comments. add comment
| Snippet ID: | #1010613 |
| Snippet name: | WeakIdentityHashMap |
| Eternal ID of this version: | #1010613/10 |
| Text MD5: | 14f1e5c9bc0f22afaded52438ab1040f |
| Author: | stefan |
| Category: | javax |
| Type: | JavaX fragment (include) |
| Public (visible to everyone): | Yes |
| Archived (hidden from active list): | No |
| Created/modified: | 2018-06-06 12:25:09 |
| Source code size: | 3959 bytes / 143 lines |
| Pitched / IR pitched: | No / No |
| Views / Downloads: | 921 / 2189 |
| Version history: | 9 change(s) |
| Referenced in: | [show references] |