diff base/src/java/util/WeakHashMap.d @ 27:1bf55a6eb092

Renamed java tree to base
author Frank Benoit <benoit@tionex.de>
date Sat, 21 Mar 2009 11:33:57 +0100
parents java/src/java/util/WeakHashMap.d@9b96950f2c3c
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/base/src/java/util/WeakHashMap.d	Sat Mar 21 11:33:57 2009 +0100
@@ -0,0 +1,68 @@
+module java.util.WeakHashMap;
+
+
+private {
+    alias void delegate(Object) DisposeEvt;
+    extern (C) void  rt_attachDisposeEvent( Object obj, DisposeEvt evt );
+    extern (C) void  rt_detachDisposeEvent( Object obj, DisposeEvt evt );
+}
+
+
+/+
+    Is not yet 'weak'
++/
+class WeakHashMap {
+
+    static class Ref {
+        size_t ptr;
+        this(Object k){
+            ptr = cast(size_t)cast(void*)k;
+        }
+        override hash_t toHash(){
+            return cast(hash_t)ptr;
+        }
+        override equals_t opEquals( Object o ){
+            if( auto other = cast(Ref)o ){
+                return ptr is other.ptr;
+            }
+            return false;
+        }
+    }
+
+    private Ref unhookKey;
+
+    private void unhook(Object o) {
+        unhookKey.ptr = cast(size_t)cast(void*)o;
+        if( auto p = unhookKey in data ){
+            rt_detachDisposeEvent(o, &unhook);
+            data.remove( unhookKey );
+        }
+    }
+
+    Object[ Ref ] data;
+    ClassInfo gcLock;
+    this(){
+        unhookKey = new Ref(null);
+        gcLock = ClassInfo.find( "gcx.GCLock" );
+    }
+
+    public void put (Object key, Object element){
+        auto k = new Ref(key);
+        rt_attachDisposeEvent(key, &unhook);
+        data[ k ] = element;
+    }
+    public void remove (Object key){
+        scope k = new Ref(key);
+        if( auto p = k in data ){
+            data.remove( k );
+            rt_detachDisposeEvent(key, &unhook);
+        }
+    }
+    public Object get(Object key){
+        scope k = new Ref(key);
+        if( auto p = k in data ){
+            return *p;
+        }
+        return null;
+    }
+}