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