Mercurial > projects > dwt-linux
annotate dwt/dwthelper/WeakHashMap.d @ 364:2bcb17ebe0be default tip
fix: thx torhu
author | Frank Benoit <benoit@tionex.de> |
---|---|
date | Sun, 08 Nov 2009 20:57:46 +0100 |
parents | 695802b523c0 |
children |
rev | line source |
---|---|
223 | 1 module dwt.dwthelper.WeakHashMap; |
2 | |
3 | |
226 | 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 | |
223 | 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 } | |
226 | 21 override hash_t toHash(){ |
22 return cast(hash_t)ptr; | |
23 } | |
24 override int 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 } | |
223 | 40 } |
41 | |
42 Object[ Ref ] data; | |
226 | 43 ClassInfo gcLock; |
44 this(){ | |
45 unhookKey = new Ref(null); | |
46 gcLock = ClassInfo.find( "gcx.GCLock" ); | |
47 } | |
223 | 48 |
292
695802b523c0
Adjustements for the container rework in dwt-addons
Frank Benoit <benoit@tionex.de>
parents:
226
diff
changeset
|
49 public void put (Object key, Object element){ |
223 | 50 auto k = new Ref(key); |
226 | 51 rt_attachDisposeEvent(key, &unhook); |
223 | 52 data[ k ] = element; |
53 } | |
292
695802b523c0
Adjustements for the container rework in dwt-addons
Frank Benoit <benoit@tionex.de>
parents:
226
diff
changeset
|
54 public void remove (Object key){ |
223 | 55 scope k = new Ref(key); |
226 | 56 if( auto p = k in data ){ |
57 data.remove( k ); | |
58 rt_detachDisposeEvent(key, &unhook); | |
59 } | |
223 | 60 } |
61 public Object get(Object key){ | |
62 scope k = new Ref(key); | |
63 if( auto p = k in data ){ | |
64 return *p; | |
65 } | |
66 return null; | |
67 } | |
68 } |