Refactor Map, Set implementations.
- Implement LinkedHashMap.EntrySet.remove method
- Implement clear and remove methods for
AbstractMap's keySet() and values()
- Remove initialization block in LinkedHashMap
- Ignore capacity and loadFactor parameters in
LinkedHashSet
- Remove toArray method in Collections.SetFromMap
Change-Id: Ie590954cb37356269489be385c14379313934df7
diff --git a/user/super/com/google/gwt/emul/java/util/AbstractMap.java b/user/super/com/google/gwt/emul/java/util/AbstractMap.java
index c9f838e..eae9667 100644
--- a/user/super/com/google/gwt/emul/java/util/AbstractMap.java
+++ b/user/super/com/google/gwt/emul/java/util/AbstractMap.java
@@ -160,27 +160,35 @@
return size() == 0;
}
+ @Override
public Set<K> keySet() {
- final Set<Entry<K, V>> entrySet = entrySet();
return new AbstractSet<K>() {
@Override
+ public void clear() {
+ AbstractMap.this.clear();
+ }
+
+ @Override
public boolean contains(Object key) {
return containsKey(key);
}
@Override
public Iterator<K> iterator() {
- final Iterator<Entry<K, V>> outerIter = entrySet.iterator();
+ final Iterator<Entry<K, V>> outerIter = entrySet().iterator();
return new Iterator<K>() {
+ @Override
public boolean hasNext() {
return outerIter.hasNext();
}
+ @Override
public K next() {
- Map.Entry<K, V> entry = outerIter.next();
+ Entry<K, V> entry = outerIter.next();
return entry.getKey();
}
+ @Override
public void remove() {
outerIter.remove();
}
@@ -188,8 +196,17 @@
}
@Override
+ public boolean remove(Object key) {
+ if (containsKey(key)) {
+ AbstractMap.this.remove(key);
+ return true;
+ }
+ return false;
+ }
+
+ @Override
public int size() {
- return entrySet.size();
+ return AbstractMap.this.size();
}
};
}
@@ -233,27 +250,35 @@
return s + "}";
}
+ @Override
public Collection<V> values() {
- final Set<Entry<K, V>> entrySet = entrySet();
return new AbstractCollection<V>() {
@Override
+ public void clear() {
+ AbstractMap.this.clear();
+ }
+
+ @Override
public boolean contains(Object value) {
return containsValue(value);
}
@Override
public Iterator<V> iterator() {
- final Iterator<Entry<K, V>> outerIter = entrySet.iterator();
+ final Iterator<Entry<K, V>> outerIter = entrySet().iterator();
return new Iterator<V>() {
+ @Override
public boolean hasNext() {
return outerIter.hasNext();
}
+ @Override
public V next() {
- V value = outerIter.next().getValue();
- return value;
+ Entry<K, V> entry = outerIter.next();
+ return entry.getValue();
}
+ @Override
public void remove() {
outerIter.remove();
}
@@ -262,7 +287,7 @@
@Override
public int size() {
- return entrySet.size();
+ return AbstractMap.this.size();
}
};
}
diff --git a/user/super/com/google/gwt/emul/java/util/AbstractSet.java b/user/super/com/google/gwt/emul/java/util/AbstractSet.java
index dc30516..cfc81b4 100644
--- a/user/super/com/google/gwt/emul/java/util/AbstractSet.java
+++ b/user/super/com/google/gwt/emul/java/util/AbstractSet.java
@@ -36,18 +36,10 @@
}
Set<?> other = (Set<?>) o;
-
if (other.size() != size()) {
return false;
}
-
- for (Iterator<?> iter = other.iterator(); iter.hasNext();) {
- Object otherItem = iter.next();
- if (!contains(otherItem)) {
- return false;
- }
- }
- return true;
+ return containsAll(other);
}
@Override
diff --git a/user/super/com/google/gwt/emul/java/util/Collections.java b/user/super/com/google/gwt/emul/java/util/Collections.java
index 88f474c..d0aeddd 100644
--- a/user/super/com/google/gwt/emul/java/util/Collections.java
+++ b/user/super/com/google/gwt/emul/java/util/Collections.java
@@ -253,11 +253,6 @@
}
@Override
- public <T> T[] toArray(T[] a) {
- return keySet().toArray(a);
- }
-
- @Override
public String toString() {
return keySet().toString();
}
diff --git a/user/super/com/google/gwt/emul/java/util/LinkedHashMap.java b/user/super/com/google/gwt/emul/java/util/LinkedHashMap.java
index 51a7e5a..6b7f958 100644
--- a/user/super/com/google/gwt/emul/java/util/LinkedHashMap.java
+++ b/user/super/com/google/gwt/emul/java/util/LinkedHashMap.java
@@ -51,7 +51,6 @@
public ChainEntry(K key, V value) {
super(key, value);
- next = prev = null;
}
/**
@@ -147,8 +146,18 @@
}
@Override
+ public boolean remove(Object entry) {
+ if (contains(entry)) {
+ Object key = ((Map.Entry<?, ?>) entry).getKey();
+ LinkedHashMap.this.remove(key);
+ return true;
+ }
+ return false;
+ }
+
+ @Override
public int size() {
- return map.size();
+ return LinkedHashMap.this.size();
}
}
@@ -172,35 +181,37 @@
*/
private final transient HashMap<K, ChainEntry> map = new HashMap<K, ChainEntry>();
- {
- // Initialize the empty linked list.
- head.prev = head;
- head.next = head;
- }
-
public LinkedHashMap() {
+ resetChainEntries();
}
public LinkedHashMap(int ignored) {
- super(ignored);
+ this(ignored, 0);
}
public LinkedHashMap(int ignored, float alsoIgnored) {
super(ignored, alsoIgnored);
+ resetChainEntries();
}
public LinkedHashMap(int ignored, float alsoIgnored, boolean accessOrder) {
super(ignored, alsoIgnored);
this.accessOrder = accessOrder;
+ resetChainEntries();
}
public LinkedHashMap(Map<? extends K, ? extends V> toBeCopied) {
+ resetChainEntries();
this.putAll(toBeCopied);
}
@Override
public void clear() {
map.clear();
+ resetChainEntries();
+ }
+
+ private void resetChainEntries() {
head.prev = head;
head.next = head;
}
diff --git a/user/super/com/google/gwt/emul/java/util/LinkedHashSet.java b/user/super/com/google/gwt/emul/java/util/LinkedHashSet.java
index cadb6a0..52a0b63 100644
--- a/user/super/com/google/gwt/emul/java/util/LinkedHashSet.java
+++ b/user/super/com/google/gwt/emul/java/util/LinkedHashSet.java
@@ -26,30 +26,20 @@
public class LinkedHashSet<E> extends HashSet<E> implements Set<E>, Cloneable {
public LinkedHashSet() {
- super(new LinkedHashMap<E, Object>(16, .75f));
+ super(new LinkedHashMap<E, Object>());
}
- /**
- * @param c
- */
public LinkedHashSet(Collection<? extends E> c) {
- super(new LinkedHashMap<E, Object>(16, .75f));
+ super(new LinkedHashMap<E, Object>());
addAll(c);
}
- /**
- * @param initialCapacity
- */
- public LinkedHashSet(int initialCapacity) {
- super(new LinkedHashMap<E, Object>(initialCapacity, .75f));
+ public LinkedHashSet(int ignored) {
+ super(new LinkedHashMap<E, Object>(ignored));
}
- /**
- * @param initialCapacity
- * @param loadFactor
- */
- public LinkedHashSet(int initialCapacity, float loadFactor) {
- super(new LinkedHashMap<E, Object>(initialCapacity, loadFactor));
+ public LinkedHashSet(int ignored, float alsoIgnored) {
+ super(new LinkedHashMap<E, Object>(ignored, alsoIgnored));
}
@Override