diff options
author | Darrell Anderson <humanreadable@yahoo.com> | 2014-01-08 20:06:00 +0100 |
---|---|---|
committer | Slávek Banko <slavek.banko@axis.cz> | 2014-01-08 20:06:00 +0100 |
commit | 636f509299122d02087c6fd62e1e4a46dbd22026 (patch) | |
tree | 70e43efceeb5b00e7f19cdac8da44928bd2fb459 /qtjava/javalib/org/trinitydesktop/qt/WeakValueMap.java | |
parent | 719b61750c08343f530068ed4127623aeac71cf0 (diff) | |
download | tdebindings-636f509299122d02087c6fd62e1e4a46dbd22026.tar.gz tdebindings-636f509299122d02087c6fd62e1e4a46dbd22026.zip |
Rename many classes to avoid conflicts with KDE
Diffstat (limited to 'qtjava/javalib/org/trinitydesktop/qt/WeakValueMap.java')
-rw-r--r-- | qtjava/javalib/org/trinitydesktop/qt/WeakValueMap.java | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/qtjava/javalib/org/trinitydesktop/qt/WeakValueMap.java b/qtjava/javalib/org/trinitydesktop/qt/WeakValueMap.java new file mode 100644 index 00000000..25989191 --- /dev/null +++ b/qtjava/javalib/org/trinitydesktop/qt/WeakValueMap.java @@ -0,0 +1,68 @@ +/** From Section 12.5.3, Reference Queues page 324-326 + of 'The Java Programming Language, Third Edition'. + + But why wasn't it included in the java.util Collection package? + */ + + +package org.trinitydesktop.qt; + +import java.lang.ref.*; +import java.util.*; + +public class WeakValueMap extends HashMap { + private ReferenceQueue reaped = new ReferenceQueue(); + + private static class ValueRef extends WeakReference { + private final Object key; // key for value + + ValueRef(Object val, Object key, ReferenceQueue q) { + super(val, q); + this.key = key; + } + } + + public Object put(Object key, Object value) { + reap(); + ValueRef vr = new ValueRef(value, key, reaped); + return super.put(key, vr); + } + + public Object get(Object key) { + reap(); + ValueRef vr = (ValueRef) super.get(key); + if (vr == null) { + return null; + } else { + return vr.get(); + } + } + + /** Force an entry to be removed if it is known to be invalid, + rather than waiting for the garbage collector to put it + on the reaped queue. + */ + public Object remove(Object key) { + reap(); + ValueRef vr = (ValueRef) super.get(key); + if (vr == null) { + return null; + } else { + vr.clear(); + super.remove(key); + return null; + } + } + + public int size() { + reap(); + return super.size(); + } + + public void reap() { + ValueRef ref; + while ((ref = (ValueRef) reaped.poll()) != null) { + super.remove(ref.key); + } + } +} |