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 }