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 }