root/dwt/dwthelper/WeakHashMap.d

Revision 280:4ec36c3a04a3, 1.6 kB (checked in by Frank Benoit <benoit@tionex.de>, 4 months ago)

sync with dwt-linux

Line 
1 module dwt.dwthelper.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 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         }
40     }
41
42     Object[ Ref ] data;
43     ClassInfo gcLock;
44     this(){
45         unhookKey = new Ref(null);
46         gcLock = ClassInfo.find( "gcx.GCLock" );
47     }
48
49     public void put (Object key, Object element){
50         auto k = new Ref(key);
51         rt_attachDisposeEvent(key, &unhook);
52         data[ k ] = element;
53     }
54     public void remove (Object key){
55         scope k = new Ref(key);
56         if( auto p = k in data ){
57             data.remove( k );
58             rt_detachDisposeEvent(key, &unhook);
59         }
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 }
Note: See TracBrowser for help on using the browser.