1 module java.util.HashMap;
2 
3 import java.lang.all;
4 import java.util.Map;
5 import java.util.Collection;
6 import java.util.Set;
7 import java.util.HashSet;
8 import java.util.ArrayList;
9 
10 version(Tango){
11     static import tango.util.container.HashMap;
12     private struct ObjRef {
13         Object obj;
14         static ObjRef opCall( Object obj ){
15             ObjRef res;
16             res.obj = obj;
17             return res;
18         }
19         public hash_t toHash(){
20             return obj is null ? 0 : obj.toHash();
21         }
22         public equals_t opEquals( ObjRef other ){
23             return obj is null ? other.obj is null : obj.opEquals( other.obj );
24         }
25         public equals_t opEquals( Object other ){
26             return obj is null ? other is null : obj.opEquals( other );
27         }
28     }
29 } else { // Phobos
30 }
31 
32 class HashMap : Map {
33     // The HashMap  class is roughly equivalent to Hashtable, except that it is unsynchronized and permits nulls.
34     version(Tango){
35         alias tango.util.container.HashMap.HashMap!(ObjRef,ObjRef) MapType;
36         private MapType map;
37     } else { // Phobos
38     }
39 
40     public this(){
41         version(Tango){
42             map = new MapType();
43         } else { // Phobos
44             implMissingInPhobos();
45         }
46     }
47     public this(int initialCapacity){
48         this();
49     }
50     public this(int initialCapacity, float loadFactor){
51         version(Tango){
52             map = new MapType(loadFactor);
53         } else { // Phobos
54             implMissingInPhobos();
55         }
56     }
57     public this(Map m){
58         this();
59         putAll(m);
60     }
61     public void clear(){
62         version(Tango){
63             map.clear();
64         } else { // Phobos
65             implMissingInPhobos();
66         }
67     }
68     public bool containsKey(Object key){
69         version(Tango){
70             ObjRef v;
71             ObjRef keyr = ObjRef(key);
72             return map.get(keyr, v );
73         } else { // Phobos
74             implMissingInPhobos();
75             return false;
76         }
77     }
78     public bool containsKey(String key){
79         return containsKey(stringcast(key));
80     }
81     public bool containsValue(Object value){
82         version(Tango){
83             ObjRef valuer = ObjRef(value);
84             return map.contains(valuer);
85         } else { // Phobos
86             implMissingInPhobos();
87             return false;
88         }
89     }
90     public Set  entrySet(){
91         version(Tango){
92             HashSet res = new HashSet();
93             foreach( k, v; map ){
94                 res.add( new MapEntry(this,k.obj));
95             }
96             return res;
97         } else { // Phobos
98             implMissingInPhobos();
99             return null;
100         }
101     }
102     public override equals_t opEquals(Object o){
103         version(Tango){
104             if( auto other = cast(HashMap) o ){
105                 if( other.size() !is size() ){
106                     return false;
107                 }
108                 foreach( k, v; map ){
109                     auto vo = other.get(k.obj);
110                     if( v != vo ){
111                         return false;
112                     }
113                 }
114                 return true;
115             }
116             return false;
117         } else { // Phobos
118             implMissingInPhobos();
119             return false;
120         }
121     }
122     public Object get(Object key){
123         version(Tango){
124             ObjRef keyr = ObjRef(key);
125             if( auto v = keyr in map ){
126                 return (*v).obj;
127             }
128             return null;
129         } else { // Phobos
130             implMissingInPhobos();
131             return null;
132         }
133     }
134     public Object get(String key){
135         return get(stringcast(key));
136     }
137     public override hash_t toHash(){
138         return super.toHash();
139     }
140     public bool isEmpty(){
141         version(Tango){
142             return map.isEmpty();
143         } else { // Phobos
144             implMissingInPhobos();
145             return false;
146         }
147     }
148     public Set    keySet(){
149         version(Tango){
150             HashSet res = new HashSet();
151             foreach( k, v; map ){
152                 res.add(k.obj);
153             }
154             return res;
155         } else { // Phobos
156             implMissingInPhobos();
157             return null;
158         }
159     }
160     public Object put(Object key, Object value){
161         version(Tango){
162             ObjRef valuer = ObjRef(value);
163             ObjRef keyr = ObjRef(key);
164             Object res = null;
165             if( auto vold = keyr in map ){
166                 res = (*vold).obj;
167             }
168             map[ keyr ] = valuer;
169             return res;
170         } else { // Phobos
171             implMissingInPhobos();
172             return null;
173         }
174     }
175     public Object put(String key, Object value){
176         return put( stringcast(key), value );
177     }
178     public Object put(Object key, String value){
179         return put( key, stringcast(value) );
180     }
181     public Object put(String key, String value){
182         return put( stringcast(key), stringcast(value) );
183     }
184     public void   putAll(Map t){
185         version(Tango){
186             foreach( k, v; t ){
187                 map[ObjRef(k)] = ObjRef(v);
188             }
189         } else { // Phobos
190             implMissingInPhobos();
191         }
192     }
193     public Object remove(Object key){
194         version(Tango){
195             ObjRef keyr = ObjRef(key);
196             if( auto v = keyr in map ){
197                 Object res = (*v).obj;
198                 map.removeKey(keyr);
199                 return res;
200             }
201             return null;
202         } else { // Phobos
203             implMissingInPhobos();
204             return null;
205         }
206     }
207     public Object remove(String key){
208         return remove(stringcast(key));
209     }
210     public int    size(){
211         version(Tango){
212             return map.size();
213         } else { // Phobos
214             implMissingInPhobos();
215             return 0;
216         }
217     }
218     public Collection values(){
219         version(Tango){
220             ArrayList res = new ArrayList( size() );
221             foreach( k, v; map ){
222                 res.add( v.obj );
223             }
224             return res;
225         } else { // Phobos
226             implMissingInPhobos();
227             return null;
228         }
229     }
230 
231     public int opApply (int delegate(ref Object value) dg){
232         version(Tango){
233             int ldg( ref ObjRef or ){
234                 return dg( or.obj );
235             }
236             return map.opApply( &ldg );
237         } else { // Phobos
238             implMissingInPhobos();
239             return 0;
240         }
241     }
242     public int opApply (int delegate(ref Object key, ref Object value) dg){
243         version(Tango){
244             int ldg( ref ObjRef key, ref ObjRef value ){
245                 return dg( key.obj, value.obj );
246             }
247             return map.opApply( &ldg );
248         } else { // Phobos
249             implMissingInPhobos();
250             return 0;
251         }
252     }
253 
254 }
255