Mercurial > projects > dwt-linux
diff dwt/dwthelper/WeakHashMap.d @ 226:6da025bf255e
some fixes
author | Frank Benoit <benoit@tionex.de> |
---|---|
date | Fri, 11 Apr 2008 17:50:39 +0200 |
parents | d0081b1505da |
children | 695802b523c0 |
line wrap: on
line diff
--- a/dwt/dwthelper/WeakHashMap.d Fri Apr 11 01:26:04 2008 +0200 +++ b/dwt/dwthelper/WeakHashMap.d Fri Apr 11 17:50:39 2008 +0200 @@ -1,6 +1,13 @@ module dwt.dwthelper.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' +/ @@ -11,17 +18,45 @@ this(Object k){ ptr = cast(size_t)cast(void*)k; } + override hash_t toHash(){ + return cast(hash_t)ptr; + } + override int 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 add (Object key, Object element){ auto k = new Ref(key); + rt_attachDisposeEvent(key, &unhook); data[ k ] = element; } public void removeKey (Object key){ scope k = new Ref(key); - data.remove( k ); + if( auto p = k in data ){ + data.remove( k ); + rt_detachDisposeEvent(key, &unhook); + } } public Object get(Object key){ scope k = new Ref(key);