Index: third_party/protobuf/java/core/src/main/java/com/google/protobuf/MapFieldLite.java |
diff --git a/third_party/protobuf/java/core/src/main/java/com/google/protobuf/MapFieldLite.java b/third_party/protobuf/java/core/src/main/java/com/google/protobuf/MapFieldLite.java |
index 960b633909a064b526deeb9c16948c92eed10212..16b3fefe138b7d238d9ec89b0e66ba3de54d2c28 100644 |
--- a/third_party/protobuf/java/core/src/main/java/com/google/protobuf/MapFieldLite.java |
+++ b/third_party/protobuf/java/core/src/main/java/com/google/protobuf/MapFieldLite.java |
@@ -33,71 +33,85 @@ package com.google.protobuf; |
import com.google.protobuf.Internal.EnumLite; |
import java.util.Arrays; |
-import java.util.Collection; |
import java.util.Collections; |
-import java.util.Iterator; |
import java.util.LinkedHashMap; |
import java.util.Map; |
import java.util.Set; |
/** |
* Internal representation of map fields in generated lite-runtime messages. |
- * |
+ * |
* This class is a protobuf implementation detail. Users shouldn't use this |
* class directly. |
*/ |
-public final class MapFieldLite<K, V> implements MutabilityOracle { |
- private MutatabilityAwareMap<K, V> mapData; |
+public final class MapFieldLite<K, V> extends LinkedHashMap<K, V> { |
+ |
private boolean isMutable; |
- |
+ |
+ private MapFieldLite() { |
+ this.isMutable = true; |
+ } |
+ |
private MapFieldLite(Map<K, V> mapData) { |
- this.mapData = new MutatabilityAwareMap<K, V>(this, mapData); |
+ super(mapData); |
this.isMutable = true; |
} |
- |
+ |
@SuppressWarnings({"rawtypes", "unchecked"}) |
- private static final MapFieldLite EMPTY_MAP_FIELD = |
- new MapFieldLite(Collections.emptyMap()); |
+ private static final MapFieldLite EMPTY_MAP_FIELD = new MapFieldLite(); |
static { |
EMPTY_MAP_FIELD.makeImmutable(); |
} |
- |
+ |
/** Returns an singleton immutable empty MapFieldLite instance. */ |
@SuppressWarnings({"unchecked", "cast"}) |
public static <K, V> MapFieldLite<K, V> emptyMapField() { |
return (MapFieldLite<K, V>) EMPTY_MAP_FIELD; |
} |
- |
- /** Creates a new MapFieldLite instance. */ |
- public static <K, V> MapFieldLite<K, V> newMapField() { |
- return new MapFieldLite<K, V>(new LinkedHashMap<K, V>()); |
+ |
+ public void mergeFrom(MapFieldLite<K, V> other) { |
+ ensureMutable(); |
+ if (!other.isEmpty()) { |
+ putAll(other); |
+ } |
+ } |
+ |
+ @SuppressWarnings({"unchecked", "cast"}) |
+ @Override public Set<Map.Entry<K, V>> entrySet() { |
+ return isEmpty() ? Collections.<Map.Entry<K, V>>emptySet() : super.entrySet(); |
+ } |
+ |
+ @Override public void clear() { |
+ ensureMutable(); |
+ clear(); |
} |
- |
- /** Gets the content of this MapField as a read-only Map. */ |
- public Map<K, V> getMap() { |
- return Collections.unmodifiableMap(mapData); |
+ |
+ @Override public V put(K key, V value) { |
+ ensureMutable(); |
+ return super.put(key, value); |
} |
- |
- /** Gets a mutable Map view of this MapField. */ |
- public Map<K, V> getMutableMap() { |
- return mapData; |
+ |
+ public V put(Map.Entry<K, V> entry) { |
+ return put(entry.getKey(), entry.getValue()); |
} |
- |
- public void mergeFrom(MapFieldLite<K, V> other) { |
- mapData.putAll(copy(other.mapData)); |
+ |
+ @Override public void putAll(Map<? extends K, ? extends V> m) { |
+ ensureMutable(); |
+ super.putAll(m); |
} |
- |
- public void clear() { |
- mapData.clear(); |
+ |
+ @Override public V remove(Object key) { |
+ ensureMutable(); |
+ return super.remove(key); |
} |
- |
+ |
private static boolean equals(Object a, Object b) { |
if (a instanceof byte[] && b instanceof byte[]) { |
return Arrays.equals((byte[]) a, (byte[]) b); |
} |
return a.equals(b); |
} |
- |
+ |
/** |
* Checks whether two {@link Map}s are equal. We don't use the default equals |
* method of {@link Map} because it compares by identity not by content for |
@@ -120,20 +134,16 @@ public final class MapFieldLite<K, V> implements MutabilityOracle { |
} |
return true; |
} |
- |
+ |
/** |
* Checks whether two map fields are equal. |
*/ |
@SuppressWarnings("unchecked") |
@Override |
public boolean equals(Object object) { |
- if (!(object instanceof MapFieldLite)) { |
- return false; |
- } |
- MapFieldLite<K, V> other = (MapFieldLite<K, V>) object; |
- return equals(mapData, other.mapData); |
+ return (object instanceof Map) && equals(this, (Map<K, V>) object); |
} |
- |
+ |
private static int calculateHashCodeForObject(Object a) { |
if (a instanceof byte[]) { |
return Internal.hashCode((byte[]) a); |
@@ -156,14 +166,14 @@ public final class MapFieldLite<K, V> implements MutabilityOracle { |
result += calculateHashCodeForObject(entry.getKey()) |
^ calculateHashCodeForObject(entry.getValue()); |
} |
- return result; |
+ return result; |
} |
- |
+ |
@Override |
public int hashCode() { |
- return calculateHashCodeForMap(mapData); |
+ return calculateHashCodeForMap(this); |
} |
- |
+ |
private static Object copy(Object object) { |
if (object instanceof byte[]) { |
byte[] data = (byte[]) object; |
@@ -171,7 +181,7 @@ public final class MapFieldLite<K, V> implements MutabilityOracle { |
} |
return object; |
} |
- |
+ |
/** |
* Makes a deep copy of a {@link Map}. Immutable objects in the map will be |
* shared (e.g., integers, strings, immutable messages) and mutable ones will |
@@ -185,12 +195,12 @@ public final class MapFieldLite<K, V> implements MutabilityOracle { |
} |
return result; |
} |
- |
+ |
/** Returns a deep copy of this map field. */ |
- public MapFieldLite<K, V> copy() { |
- return new MapFieldLite<K, V>(copy(mapData)); |
+ public MapFieldLite<K, V> mutableCopy() { |
+ return isEmpty() ? new MapFieldLite<K, V>() : new MapFieldLite<K, V>(this); |
} |
- |
+ |
/** |
* Makes this field immutable. All subsequent modifications will throw an |
* {@link UnsupportedOperationException}. |
@@ -198,352 +208,17 @@ public final class MapFieldLite<K, V> implements MutabilityOracle { |
public void makeImmutable() { |
isMutable = false; |
} |
- |
+ |
/** |
* Returns whether this field can be modified. |
*/ |
public boolean isMutable() { |
return isMutable; |
} |
- |
- @Override |
- public void ensureMutable() { |
- if (!isMutable()) { |
- throw new UnsupportedOperationException(); |
- } |
- } |
- |
- /** |
- * An internal map that checks for mutability before delegating. |
- */ |
- static class MutatabilityAwareMap<K, V> implements Map<K, V> { |
- private final MutabilityOracle mutabilityOracle; |
- private final Map<K, V> delegate; |
- |
- MutatabilityAwareMap(MutabilityOracle mutabilityOracle, Map<K, V> delegate) { |
- this.mutabilityOracle = mutabilityOracle; |
- this.delegate = delegate; |
- } |
- |
- @Override |
- public int size() { |
- return delegate.size(); |
- } |
- |
- @Override |
- public boolean isEmpty() { |
- return delegate.isEmpty(); |
- } |
- |
- @Override |
- public boolean containsKey(Object key) { |
- return delegate.containsKey(key); |
- } |
- |
- @Override |
- public boolean containsValue(Object value) { |
- return delegate.containsValue(value); |
- } |
- |
- @Override |
- public V get(Object key) { |
- return delegate.get(key); |
- } |
- |
- @Override |
- public V put(K key, V value) { |
- mutabilityOracle.ensureMutable(); |
- return delegate.put(key, value); |
- } |
- |
- @Override |
- public V remove(Object key) { |
- mutabilityOracle.ensureMutable(); |
- return delegate.remove(key); |
- } |
- |
- @Override |
- public void putAll(Map<? extends K, ? extends V> m) { |
- mutabilityOracle.ensureMutable(); |
- delegate.putAll(m); |
- } |
- |
- @Override |
- public void clear() { |
- mutabilityOracle.ensureMutable(); |
- delegate.clear(); |
- } |
- |
- @Override |
- public Set<K> keySet() { |
- return new MutatabilityAwareSet<K>(mutabilityOracle, delegate.keySet()); |
- } |
- |
- @Override |
- public Collection<V> values() { |
- return new MutatabilityAwareCollection<V>(mutabilityOracle, delegate.values()); |
- } |
- |
- @Override |
- public Set<java.util.Map.Entry<K, V>> entrySet() { |
- return new MutatabilityAwareSet<Entry<K, V>>(mutabilityOracle, delegate.entrySet()); |
- } |
- |
- @Override |
- public boolean equals(Object o) { |
- return delegate.equals(o); |
- } |
- |
- @Override |
- public int hashCode() { |
- return delegate.hashCode(); |
- } |
- |
- @Override |
- public String toString() { |
- return delegate.toString(); |
- } |
- } |
- |
- /** |
- * An internal collection that checks for mutability before delegating. |
- */ |
- private static class MutatabilityAwareCollection<E> implements Collection<E> { |
- private final MutabilityOracle mutabilityOracle; |
- private final Collection<E> delegate; |
- |
- MutatabilityAwareCollection(MutabilityOracle mutabilityOracle, Collection<E> delegate) { |
- this.mutabilityOracle = mutabilityOracle; |
- this.delegate = delegate; |
- } |
- @Override |
- public int size() { |
- return delegate.size(); |
- } |
- |
- @Override |
- public boolean isEmpty() { |
- return delegate.isEmpty(); |
- } |
- |
- @Override |
- public boolean contains(Object o) { |
- return delegate.contains(o); |
- } |
- |
- @Override |
- public Iterator<E> iterator() { |
- return new MutatabilityAwareIterator<E>(mutabilityOracle, delegate.iterator()); |
- } |
- |
- @Override |
- public Object[] toArray() { |
- return delegate.toArray(); |
- } |
- |
- @Override |
- public <T> T[] toArray(T[] a) { |
- return delegate.toArray(a); |
- } |
- |
- @Override |
- public boolean add(E e) { |
- // Unsupported operation in the delegate. |
- throw new UnsupportedOperationException(); |
- } |
- |
- @Override |
- public boolean remove(Object o) { |
- mutabilityOracle.ensureMutable(); |
- return delegate.remove(o); |
- } |
- |
- @Override |
- public boolean containsAll(Collection<?> c) { |
- return delegate.containsAll(c); |
- } |
- |
- @Override |
- public boolean addAll(Collection<? extends E> c) { |
- // Unsupported operation in the delegate. |
+ private void ensureMutable() { |
+ if (!isMutable()) { |
throw new UnsupportedOperationException(); |
} |
- |
- @Override |
- public boolean removeAll(Collection<?> c) { |
- mutabilityOracle.ensureMutable(); |
- return delegate.removeAll(c); |
- } |
- |
- @Override |
- public boolean retainAll(Collection<?> c) { |
- mutabilityOracle.ensureMutable(); |
- return delegate.retainAll(c); |
- } |
- |
- @Override |
- public void clear() { |
- mutabilityOracle.ensureMutable(); |
- delegate.clear(); |
- } |
- |
- @Override |
- public boolean equals(Object o) { |
- return delegate.equals(o); |
- } |
- |
- @Override |
- public int hashCode() { |
- return delegate.hashCode(); |
- } |
- |
- @Override |
- public String toString() { |
- return delegate.toString(); |
- } |
- } |
- |
- /** |
- * An internal set that checks for mutability before delegating. |
- */ |
- private static class MutatabilityAwareSet<E> implements Set<E> { |
- private final MutabilityOracle mutabilityOracle; |
- private final Set<E> delegate; |
- |
- MutatabilityAwareSet(MutabilityOracle mutabilityOracle, Set<E> delegate) { |
- this.mutabilityOracle = mutabilityOracle; |
- this.delegate = delegate; |
- } |
- |
- @Override |
- public int size() { |
- return delegate.size(); |
- } |
- |
- @Override |
- public boolean isEmpty() { |
- return delegate.isEmpty(); |
- } |
- |
- @Override |
- public boolean contains(Object o) { |
- return delegate.contains(o); |
- } |
- |
- @Override |
- public Iterator<E> iterator() { |
- return new MutatabilityAwareIterator<E>(mutabilityOracle, delegate.iterator()); |
- } |
- |
- @Override |
- public Object[] toArray() { |
- return delegate.toArray(); |
- } |
- |
- @Override |
- public <T> T[] toArray(T[] a) { |
- return delegate.toArray(a); |
- } |
- |
- @Override |
- public boolean add(E e) { |
- mutabilityOracle.ensureMutable(); |
- return delegate.add(e); |
- } |
- |
- @Override |
- public boolean remove(Object o) { |
- mutabilityOracle.ensureMutable(); |
- return delegate.remove(o); |
- } |
- |
- @Override |
- public boolean containsAll(Collection<?> c) { |
- return delegate.containsAll(c); |
- } |
- |
- @Override |
- public boolean addAll(Collection<? extends E> c) { |
- mutabilityOracle.ensureMutable(); |
- return delegate.addAll(c); |
- } |
- |
- @Override |
- public boolean retainAll(Collection<?> c) { |
- mutabilityOracle.ensureMutable(); |
- return delegate.retainAll(c); |
- } |
- |
- @Override |
- public boolean removeAll(Collection<?> c) { |
- mutabilityOracle.ensureMutable(); |
- return delegate.removeAll(c); |
- } |
- |
- @Override |
- public void clear() { |
- mutabilityOracle.ensureMutable(); |
- delegate.clear(); |
- } |
- |
- @Override |
- public boolean equals(Object o) { |
- return delegate.equals(o); |
- } |
- |
- @Override |
- public int hashCode() { |
- return delegate.hashCode(); |
- } |
- |
- @Override |
- public String toString() { |
- return delegate.toString(); |
- } |
- } |
- |
- /** |
- * An internal iterator that checks for mutability before delegating. |
- */ |
- private static class MutatabilityAwareIterator<E> implements Iterator<E> { |
- private final MutabilityOracle mutabilityOracle; |
- private final Iterator<E> delegate; |
- |
- MutatabilityAwareIterator(MutabilityOracle mutabilityOracle, Iterator<E> delegate) { |
- this.mutabilityOracle = mutabilityOracle; |
- this.delegate = delegate; |
- } |
- |
- @Override |
- public boolean hasNext() { |
- return delegate.hasNext(); |
- } |
- |
- @Override |
- public E next() { |
- return delegate.next(); |
- } |
- |
- @Override |
- public void remove() { |
- mutabilityOracle.ensureMutable(); |
- delegate.remove(); |
- } |
- |
- @Override |
- public boolean equals(Object obj) { |
- return delegate.equals(obj); |
- } |
- |
- @Override |
- public int hashCode() { |
- return delegate.hashCode(); |
- } |
- |
- @Override |
- public String toString() { |
- return delegate.toString(); |
- } |
} |
} |