Mercurial > projects > dwt2
comparison base/src/java/util/WeakHashMap.d @ 27:1bf55a6eb092
Renamed java tree to base
author | Frank Benoit <benoit@tionex.de> |
---|---|
date | Sat, 21 Mar 2009 11:33:57 +0100 |
parents | java/src/java/util/WeakHashMap.d@9b96950f2c3c |
children |
comparison
equal
deleted
inserted
replaced
26:f589fc20a5f9 | 27:1bf55a6eb092 |
---|---|
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 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 } |