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