Mercurial > projects > dwt-linux
view dwt/dwthelper/WeakHashMap.d @ 339:c317081df76f
Mozilla module complete (first phase complete)
author | John Reimer <terminal.node@gmail.com> |
---|---|
date | Sat, 25 Oct 2008 21:01:54 -0700 |
parents | 695802b523c0 |
children |
line wrap: on
line source
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' +/ 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 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 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; } }