456 lines
12 KiB
Java
456 lines
12 KiB
Java
package org.apache.commons.collections;
|
|
|
|
import java.util.Collection;
|
|
import java.util.ConcurrentModificationException;
|
|
import java.util.HashMap;
|
|
import java.util.Iterator;
|
|
import java.util.Map;
|
|
import java.util.Set;
|
|
|
|
public class FastHashMap extends HashMap {
|
|
protected HashMap map = null;
|
|
|
|
protected boolean fast = false;
|
|
|
|
public FastHashMap() {
|
|
this.map = new HashMap();
|
|
}
|
|
|
|
public FastHashMap(int paramInt) {
|
|
this.map = new HashMap(paramInt);
|
|
}
|
|
|
|
public FastHashMap(int paramInt, float paramFloat) {
|
|
this.map = new HashMap(paramInt, paramFloat);
|
|
}
|
|
|
|
public FastHashMap(Map paramMap) {
|
|
this.map = new HashMap(paramMap);
|
|
}
|
|
|
|
public void clear() {
|
|
if (this.fast) {
|
|
synchronized (this) {
|
|
HashMap hashMap = (HashMap)this.map.clone();
|
|
hashMap.clear();
|
|
this.map = hashMap;
|
|
}
|
|
} else {
|
|
synchronized (this.map) {
|
|
this.map.clear();
|
|
}
|
|
}
|
|
}
|
|
|
|
public Object clone() {
|
|
FastHashMap fastHashMap = null;
|
|
if (this.fast) {
|
|
fastHashMap = new FastHashMap(this.map);
|
|
} else {
|
|
synchronized (this.map) {
|
|
fastHashMap = new FastHashMap(this.map);
|
|
}
|
|
}
|
|
fastHashMap.setFast(getFast());
|
|
return fastHashMap;
|
|
}
|
|
|
|
public boolean containsKey(Object paramObject) {
|
|
if (this.fast)
|
|
return this.map.containsKey(paramObject);
|
|
synchronized (this.map) {
|
|
return this.map.containsKey(paramObject);
|
|
}
|
|
}
|
|
|
|
public boolean containsValue(Object paramObject) {
|
|
if (this.fast)
|
|
return this.map.containsValue(paramObject);
|
|
synchronized (this.map) {
|
|
return this.map.containsValue(paramObject);
|
|
}
|
|
}
|
|
|
|
public Set entrySet() {
|
|
return new EntrySet(this);
|
|
}
|
|
|
|
public boolean equals(Object paramObject) {
|
|
if (paramObject == this)
|
|
return true;
|
|
if (!(paramObject instanceof Map))
|
|
return false;
|
|
Map map = (Map)paramObject;
|
|
if (this.fast) {
|
|
if (map.size() != this.map.size())
|
|
return false;
|
|
for (Map.Entry entry : this.map.entrySet()) {
|
|
Object object1 = entry.getKey();
|
|
Object object2 = entry.getValue();
|
|
if (object2 == null) {
|
|
if (map.get(object1) != null || !map.containsKey(object1))
|
|
return false;
|
|
continue;
|
|
}
|
|
if (!object2.equals(map.get(object1)))
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
synchronized (this.map) {
|
|
if (map.size() != this.map.size())
|
|
return false;
|
|
for (Map.Entry entry : this.map.entrySet()) {
|
|
Object object1 = entry.getKey();
|
|
Object object2 = entry.getValue();
|
|
if (object2 == null) {
|
|
if (map.get(object1) != null || !map.containsKey(object1))
|
|
return false;
|
|
continue;
|
|
}
|
|
if (!object2.equals(map.get(object1)))
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
}
|
|
|
|
public Object get(Object paramObject) {
|
|
if (this.fast)
|
|
return this.map.get(paramObject);
|
|
synchronized (this.map) {
|
|
return this.map.get(paramObject);
|
|
}
|
|
}
|
|
|
|
public boolean getFast() {
|
|
return this.fast;
|
|
}
|
|
|
|
public int hashCode() {
|
|
if (this.fast) {
|
|
int i = 0;
|
|
Iterator iterator = this.map.entrySet().iterator();
|
|
while (iterator.hasNext())
|
|
i += iterator.next().hashCode();
|
|
return i;
|
|
}
|
|
synchronized (this.map) {
|
|
int i = 0;
|
|
Iterator iterator = this.map.entrySet().iterator();
|
|
while (iterator.hasNext())
|
|
i += iterator.next().hashCode();
|
|
return i;
|
|
}
|
|
}
|
|
|
|
public boolean isEmpty() {
|
|
if (this.fast)
|
|
return this.map.isEmpty();
|
|
synchronized (this.map) {
|
|
return this.map.isEmpty();
|
|
}
|
|
}
|
|
|
|
public Set keySet() {
|
|
return new KeySet(this);
|
|
}
|
|
|
|
public Object put(Object paramObject1, Object paramObject2) {
|
|
if (this.fast)
|
|
synchronized (this) {
|
|
HashMap hashMap = (HashMap)this.map.clone();
|
|
Object object = hashMap.put(paramObject1, paramObject2);
|
|
this.map = hashMap;
|
|
return object;
|
|
}
|
|
synchronized (this.map) {
|
|
return this.map.put(paramObject1, paramObject2);
|
|
}
|
|
}
|
|
|
|
public void putAll(Map paramMap) {
|
|
if (this.fast) {
|
|
synchronized (this) {
|
|
HashMap hashMap = (HashMap)this.map.clone();
|
|
hashMap.putAll(paramMap);
|
|
this.map = hashMap;
|
|
}
|
|
} else {
|
|
synchronized (this.map) {
|
|
this.map.putAll(paramMap);
|
|
}
|
|
}
|
|
}
|
|
|
|
public Object remove(Object paramObject) {
|
|
if (this.fast)
|
|
synchronized (this) {
|
|
HashMap hashMap = (HashMap)this.map.clone();
|
|
Object object = hashMap.remove(paramObject);
|
|
this.map = hashMap;
|
|
return object;
|
|
}
|
|
synchronized (this.map) {
|
|
return this.map.remove(paramObject);
|
|
}
|
|
}
|
|
|
|
public void setFast(boolean paramBoolean) {
|
|
this.fast = paramBoolean;
|
|
}
|
|
|
|
public int size() {
|
|
if (this.fast)
|
|
return this.map.size();
|
|
synchronized (this.map) {
|
|
return this.map.size();
|
|
}
|
|
}
|
|
|
|
public Collection values() {
|
|
return new Values(this);
|
|
}
|
|
|
|
private abstract class CollectionView implements Collection {
|
|
private final FastHashMap this$0;
|
|
|
|
public CollectionView(FastHashMap this$0) {
|
|
this.this$0 = this$0;
|
|
}
|
|
|
|
public boolean add(Object param1Object) {
|
|
throw new UnsupportedOperationException();
|
|
}
|
|
|
|
public boolean addAll(Collection param1Collection) {
|
|
throw new UnsupportedOperationException();
|
|
}
|
|
|
|
public void clear() {
|
|
if (this.this$0.fast) {
|
|
synchronized (this.this$0) {
|
|
HashMap hashMap = (HashMap)this.this$0.map.clone();
|
|
get(hashMap).clear();
|
|
this.this$0.map = hashMap;
|
|
}
|
|
} else {
|
|
synchronized (this.this$0.map) {
|
|
get(this.this$0.map).clear();
|
|
}
|
|
}
|
|
}
|
|
|
|
public boolean contains(Object param1Object) {
|
|
if (this.this$0.fast)
|
|
return get(this.this$0.map).contains(param1Object);
|
|
synchronized (this.this$0.map) {
|
|
return get(this.this$0.map).contains(param1Object);
|
|
}
|
|
}
|
|
|
|
public boolean containsAll(Collection param1Collection) {
|
|
if (this.this$0.fast)
|
|
return get(this.this$0.map).containsAll(param1Collection);
|
|
synchronized (this.this$0.map) {
|
|
return get(this.this$0.map).containsAll(param1Collection);
|
|
}
|
|
}
|
|
|
|
public boolean equals(Object param1Object) {
|
|
if (param1Object == this)
|
|
return true;
|
|
if (this.this$0.fast)
|
|
return get(this.this$0.map).equals(param1Object);
|
|
synchronized (this.this$0.map) {
|
|
return get(this.this$0.map).equals(param1Object);
|
|
}
|
|
}
|
|
|
|
protected abstract Collection get(Map param1Map);
|
|
|
|
public int hashCode() {
|
|
if (this.this$0.fast)
|
|
return get(this.this$0.map).hashCode();
|
|
synchronized (this.this$0.map) {
|
|
return get(this.this$0.map).hashCode();
|
|
}
|
|
}
|
|
|
|
public boolean isEmpty() {
|
|
if (this.this$0.fast)
|
|
return get(this.this$0.map).isEmpty();
|
|
synchronized (this.this$0.map) {
|
|
return get(this.this$0.map).isEmpty();
|
|
}
|
|
}
|
|
|
|
public Iterator iterator() {
|
|
return new CollectionViewIterator(this);
|
|
}
|
|
|
|
protected abstract Object iteratorNext(Map.Entry param1Entry);
|
|
|
|
public boolean remove(Object param1Object) {
|
|
if (this.this$0.fast)
|
|
synchronized (this.this$0) {
|
|
HashMap hashMap = (HashMap)this.this$0.map.clone();
|
|
boolean bool = get(hashMap).remove(param1Object);
|
|
this.this$0.map = hashMap;
|
|
return bool;
|
|
}
|
|
synchronized (this.this$0.map) {
|
|
return get(this.this$0.map).remove(param1Object);
|
|
}
|
|
}
|
|
|
|
public boolean removeAll(Collection param1Collection) {
|
|
if (this.this$0.fast)
|
|
synchronized (this.this$0) {
|
|
HashMap hashMap = (HashMap)this.this$0.map.clone();
|
|
boolean bool = get(hashMap).removeAll(param1Collection);
|
|
this.this$0.map = hashMap;
|
|
return bool;
|
|
}
|
|
synchronized (this.this$0.map) {
|
|
return get(this.this$0.map).removeAll(param1Collection);
|
|
}
|
|
}
|
|
|
|
public boolean retainAll(Collection param1Collection) {
|
|
if (this.this$0.fast)
|
|
synchronized (this.this$0) {
|
|
HashMap hashMap = (HashMap)this.this$0.map.clone();
|
|
boolean bool = get(hashMap).retainAll(param1Collection);
|
|
this.this$0.map = hashMap;
|
|
return bool;
|
|
}
|
|
synchronized (this.this$0.map) {
|
|
return get(this.this$0.map).retainAll(param1Collection);
|
|
}
|
|
}
|
|
|
|
public int size() {
|
|
if (this.this$0.fast)
|
|
return get(this.this$0.map).size();
|
|
synchronized (this.this$0.map) {
|
|
return get(this.this$0.map).size();
|
|
}
|
|
}
|
|
|
|
public Object[] toArray() {
|
|
if (this.this$0.fast)
|
|
return get(this.this$0.map).toArray();
|
|
synchronized (this.this$0.map) {
|
|
return get(this.this$0.map).toArray();
|
|
}
|
|
}
|
|
|
|
public Object[] toArray(Object[] param1ArrayOfObject) {
|
|
if (this.this$0.fast)
|
|
return get(this.this$0.map).toArray(param1ArrayOfObject);
|
|
synchronized (this.this$0.map) {
|
|
return get(this.this$0.map).toArray(param1ArrayOfObject);
|
|
}
|
|
}
|
|
|
|
private class CollectionViewIterator implements Iterator {
|
|
private final FastHashMap.CollectionView this$1;
|
|
|
|
private Map expected;
|
|
|
|
private Map.Entry lastReturned;
|
|
|
|
private Iterator iterator;
|
|
|
|
public CollectionViewIterator(FastHashMap.CollectionView this$0) {
|
|
this.this$1 = this$0;
|
|
this.lastReturned = null;
|
|
this.expected = this$0.this$0.map;
|
|
this.iterator = this.expected.entrySet().iterator();
|
|
}
|
|
|
|
public boolean hasNext() {
|
|
if (this.expected != this.this$1.this$0.map)
|
|
throw new ConcurrentModificationException();
|
|
return this.iterator.hasNext();
|
|
}
|
|
|
|
public Object next() {
|
|
if (this.expected != this.this$1.this$0.map)
|
|
throw new ConcurrentModificationException();
|
|
this.lastReturned = this.iterator.next();
|
|
return this.this$1.iteratorNext(this.lastReturned);
|
|
}
|
|
|
|
public void remove() {
|
|
if (this.lastReturned == null)
|
|
throw new IllegalStateException();
|
|
if (this.this$1.this$0.fast) {
|
|
synchronized (this.this$1.this$0) {
|
|
if (this.expected != this.this$1.this$0.map)
|
|
throw new ConcurrentModificationException();
|
|
this.this$1.this$0.remove(this.lastReturned.getKey());
|
|
this.lastReturned = null;
|
|
this.expected = this.this$1.this$0.map;
|
|
}
|
|
} else {
|
|
this.iterator.remove();
|
|
this.lastReturned = null;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private class KeySet extends CollectionView implements Set {
|
|
private final FastHashMap this$0;
|
|
|
|
KeySet(FastHashMap this$0) {
|
|
super(this$0);
|
|
this.this$0 = this$0;
|
|
}
|
|
|
|
protected Collection get(Map param1Map) {
|
|
return param1Map.keySet();
|
|
}
|
|
|
|
protected Object iteratorNext(Map.Entry param1Entry) {
|
|
return param1Entry.getKey();
|
|
}
|
|
}
|
|
|
|
private class Values extends CollectionView {
|
|
private final FastHashMap this$0;
|
|
|
|
Values(FastHashMap this$0) {
|
|
super(this$0);
|
|
this.this$0 = this$0;
|
|
}
|
|
|
|
protected Collection get(Map param1Map) {
|
|
return param1Map.values();
|
|
}
|
|
|
|
protected Object iteratorNext(Map.Entry param1Entry) {
|
|
return param1Entry.getValue();
|
|
}
|
|
}
|
|
|
|
private class EntrySet extends CollectionView implements Set {
|
|
private final FastHashMap this$0;
|
|
|
|
EntrySet(FastHashMap this$0) {
|
|
super(this$0);
|
|
this.this$0 = this$0;
|
|
}
|
|
|
|
protected Collection get(Map param1Map) {
|
|
return param1Map.entrySet();
|
|
}
|
|
|
|
protected Object iteratorNext(Map.Entry param1Entry) {
|
|
return param1Entry;
|
|
}
|
|
}
|
|
}
|