1 module java.util.WeakHashMap;
2 
3 
4 private {
5     alias void delegate(Object) DisposeEvt;
6     extern (C) void  rt_attachDisposeEvent( Object obj, DisposeEvt evt );
7     extern (C) void  rt_detachDisposeEvent( Object obj, DisposeEvt evt );
8 }
9 
10 
11 /+
12     Is not yet 'weak'
13 +/
14 class WeakHashMap {
15 
16     static class Ref {
17         size_t ptr;
18         this(Object k){
19             ptr = cast(size_t)cast(void*)k;
20         }
21         override hash_t toHash(){
22             return cast(hash_t)ptr;
23         }
24         override equals_t opEquals( Object o ){
25             if( auto other = cast(Ref)o ){
26                 return ptr is other.ptr;
27             }
28             return false;
29         }
30     }
31 
32     private Ref unhookKey;
33 
34     private void unhook(Object o) {
35         unhookKey.ptr = cast(size_t)cast(void*)o;
36         if( auto p = unhookKey in data ){
37             rt_detachDisposeEvent(o, &unhook);
38             data.remove( unhookKey );
39         }
40     }
41 
42     Object[ Ref ] data;
43     version(Tango){
44         ClassInfo gcLock;
45     } else { // Phobos
46         mixin("const ClassInfo gcLock;");
47     }
48     this(){
49         unhookKey = new Ref(null);
50         gcLock = ClassInfo.find( "gcx.GCLock" );
51     }
52 
53     public void put (Object key, Object element){
54         auto k = new Ref(key);
55         rt_attachDisposeEvent(key, &unhook);
56         data[ k ] = element;
57     }
58     public void remove (Object key){
59         scope k = new Ref(key);
60         if( auto p = k in data ){
61             data.remove( k );
62             rt_detachDisposeEvent(key, &unhook);
63         }
64     }
65     public Object get(Object key){
66         scope k = new Ref(key);
67         if( auto p = k in data ){
68             return *p;
69         }
70         return null;
71     }
72 }