1 46 package groovy.lang; 47 48 import java.util.HashMap ; 49 import java.util.Map ; 50 import java.util.Iterator ; 51 52 import org.codehaus.groovy.runtime.InvokerHelper; 53 54 60 public class SpreadMap extends HashMap { 61 62 private Map mapData; 63 private int hashCode; 64 65 public SpreadMap(Object [] values) { 66 mapData = new HashMap (values.length / 2); 67 int i = 0; 68 while (i < values.length) { 69 mapData.put(values[i++], values[i++]); 71 } 72 } 74 75 public SpreadMap(Map map) { 76 this.mapData = map; 77 } 78 79 public Object get(Object obj) { 80 return mapData.get(obj); 81 } 82 83 public Object put(Object key, Object value) { 84 throw new RuntimeException ("SpreadMap: " + this + " is an immutable map, and so (" 85 + key + ": " + value + ") cannot be added."); 86 } 87 88 public Object remove(Object key) { 89 throw new RuntimeException ("SpreadMap: " + this + " is an immutable map, and so the key (" 90 + key + ") cannot be deleteded."); 91 } 92 93 public void putAll(Map t) { 94 throw new RuntimeException ("SpreadMap: " + this + " is an immutable map, and so the map (" 95 + t + ") cannot be put in this spreadMap."); 96 } 97 98 public int size() { 99 return mapData.keySet().size(); 100 } 101 102 public boolean equals(Object that) { 103 if (that instanceof SpreadMap) { 104 return equals((SpreadMap) that); 105 } 106 return false; 107 } 108 109 public boolean equals(SpreadMap that) { 110 if (this == null && that == null) 111 return true; 112 else if (this != null && that == null) 113 return false; 114 else if (this == null && that != null) 115 return false; 116 117 if (size() == that.size()) { 118 SpreadMap other = (SpreadMap) that; 119 Iterator iter = mapData.keySet().iterator(); 120 for (; iter.hasNext(); ) { 121 Object key = iter.next(); 122 if (! InvokerHelper.compareEqual(get(key), other.get(key)) ) { 123 return false; 124 } 125 } 126 return true; 127 } 128 return false; 129 } 130 131 132 public int hashCode() { 133 if (hashCode == 0) { 134 Iterator iter = mapData.keySet().iterator(); 135 for (; iter.hasNext(); ) { 136 Object key = iter.next(); 137 int hash = (key != null) ? key.hashCode() : 0xbabe; 138 hashCode ^= hash; 139 } 140 } 141 return hashCode; 142 } 143 } 144 | Popular Tags |