1 16 17 package com.google.gwt.user.client.ui; 18 19 import com.google.gwt.core.client.GWT; 20 import com.google.gwt.core.client.JavaScriptObject; 21 22 import java.util.AbstractMap ; 23 import java.util.AbstractSet ; 24 import java.util.ArrayList ; 25 import java.util.Collection ; 26 import java.util.Iterator ; 27 import java.util.List ; 28 import java.util.Map ; 29 import java.util.Set ; 30 31 36 37 class FastStringMap extends AbstractMap { 38 private static class ImplMapEntry implements Map.Entry { 39 40 private Object key; 41 42 private Object value; 43 44 ImplMapEntry(String key, Object value) { 45 this.key = key; 46 this.value = value; 47 } 48 49 public boolean equals(Object a) { 50 if (a instanceof Map.Entry ) { 51 Map.Entry s = (Map.Entry ) a; 52 if (equalsWithNullCheck(key, s.getKey()) 53 && equalsWithNullCheck(value, s.getValue())) { 54 return true; 55 } 56 } 57 return false; 58 } 59 60 public Object getKey() { 62 return key; 63 } 64 65 public Object getValue() { 66 return value; 67 } 68 69 public int hashCode() { 70 int keyHash = 0; 71 int valueHash = 0; 72 if (key != null) { 73 keyHash = key.hashCode(); 74 } 75 if (value != null) { 76 valueHash = value.hashCode(); 77 } 78 return keyHash ^ valueHash; 79 } 80 81 public Object setValue(Object object) { 82 Object old = value; 83 value = object; 84 return old; 85 } 86 87 private boolean equalsWithNullCheck(Object a, Object b) { 88 if (a == b) { 89 return true; 90 } else if (a == null) { 91 return false; 92 } else { 93 return a.equals(b); 94 } 95 } 96 } 97 98 102 private JavaScriptObject map; 103 104 public FastStringMap() { 105 init(); 106 } 107 108 public void clear() { 109 init(); 110 } 111 112 public boolean containsKey(Object key) { 113 return containsKey(keyMustBeString(key), map); 114 } 115 116 public boolean containsValue(Object arg0) { 117 return values().contains(arg0); 118 } 119 120 public Set entrySet() { 121 return new AbstractSet () { 122 123 public boolean contains(Object key) { 124 Map.Entry s = (Map.Entry ) key; 125 Object value = get(s.getKey()); 126 if (value == null) { 127 return value == s.getValue(); 128 } else { 129 return value.equals(s.getValue()); 130 } 131 } 132 133 public Iterator iterator() { 134 135 Iterator custom = new Iterator () { 136 Iterator keys = keySet().iterator(); 137 138 public boolean hasNext() { 139 return keys.hasNext(); 140 } 141 142 public Object next() { 143 String key = (String ) keys.next(); 144 return new ImplMapEntry(key, get(key)); 145 } 146 147 public void remove() { 148 keys.remove(); 149 } 150 }; 151 return custom; 152 } 153 154 public int size() { 155 return FastStringMap.this.size(); 156 } 157 158 }; 159 } 160 161 public Object get(Object key) { 162 return get(keyMustBeString(key)); 163 } 164 165 public native Object get(String key) ; 171 172 public boolean isEmpty() { 173 return size() == 0; 174 } 175 176 public Set keySet() { 177 return new AbstractSet () { 178 public boolean contains(Object key) { 179 return containsKey(key); 180 } 181 182 public Iterator iterator() { 183 List l = new ArrayList (); 184 addAllKeysFromJavascriptObject(l, map); 185 return l.iterator(); 186 } 187 188 public int size() { 189 return FastStringMap.this.size(); 190 } 191 }; 192 } 193 194 public Object put(Object key, Object widget) { 195 return put(keyMustBeString(key), widget); 196 } 197 198 public native Object put(String key, Object widget) ; 205 206 public void putAll(Map arg0) { 207 Iterator iter = arg0.entrySet().iterator(); 208 while (iter.hasNext()) { 209 Map.Entry entry = (Entry) iter.next(); 210 put(entry.getKey(), entry.getValue()); 211 } 212 } 213 214 public Object remove(Object key) { 215 return remove(keyMustBeString(key)); 216 } 217 218 public native int size() ; 227 228 public Collection values() { 229 List values = new ArrayList (); 230 addAllValuesFromJavascriptObject(values, map); 231 return values; 232 } 233 234 private native void addAllKeysFromJavascriptObject(Collection s, 236 JavaScriptObject javaScriptObject) ; 242 243 private native void addAllValuesFromJavascriptObject(Collection s, 245 JavaScriptObject javaScriptObject) ; 252 253 private native boolean containsKey(String key, JavaScriptObject obj); 257 258 private native void init() ; 261 262 private String keyMustBeString(Object key) { 263 if (key instanceof String ) { 264 return (String ) key; 265 } else { 266 throw new IllegalArgumentException (GWT.getTypeName(this) 267 + " can only have Strings as keys, not" + key); 268 } 269 } 270 271 private native Object remove(String key) ; 278 } 279 | Popular Tags |