| Index: third_party/protobuf/java/core/src/main/java/com/google/protobuf/MapField.java
|
| diff --git a/third_party/protobuf/java/core/src/main/java/com/google/protobuf/MapField.java b/third_party/protobuf/java/core/src/main/java/com/google/protobuf/MapField.java
|
| index a6109f988f99e0d8c7060cac39c82fd267d58db9..907f0f71120d6b0b29399c0e930ea602231b1aaf 100644
|
| --- a/third_party/protobuf/java/core/src/main/java/com/google/protobuf/MapField.java
|
| +++ b/third_party/protobuf/java/core/src/main/java/com/google/protobuf/MapField.java
|
| @@ -30,26 +30,25 @@
|
|
|
| package com.google.protobuf;
|
|
|
| +import com.google.protobuf.MapFieldLite.MutatabilityAwareMap;
|
| +
|
| import java.util.ArrayList;
|
| -import java.util.Collection;
|
| import java.util.Collections;
|
| -import java.util.Iterator;
|
| import java.util.LinkedHashMap;
|
| import java.util.List;
|
| import java.util.Map;
|
| -import java.util.Set;
|
|
|
| /**
|
| * Internal representation of map fields in generated messages.
|
| - *
|
| + *
|
| * This class supports accessing the map field as a {@link Map} to be used in
|
| * generated API and also supports accessing the field as a {@link List} to be
|
| * used in reflection API. It keeps track of where the data is currently stored
|
| - * and do necessary conversions between map and list.
|
| - *
|
| + * and do necessary conversions between map and list.
|
| + *
|
| * This class is a protobuf implementation detail. Users shouldn't use this
|
| * class directly.
|
| - *
|
| + *
|
| * THREAD-SAFETY NOTE: Read-only access is thread-safe. Users can call getMap()
|
| * and getList() concurrently in multiple threads. If write-access is needed,
|
| * all access must be synchronized.
|
| @@ -57,21 +56,21 @@ import java.util.Set;
|
| public class MapField<K, V> implements MutabilityOracle {
|
| /**
|
| * Indicates where the data of this map field is currently stored.
|
| - *
|
| + *
|
| * MAP: Data is stored in mapData.
|
| * LIST: Data is stored in listData.
|
| * BOTH: mapData and listData have the same data.
|
| *
|
| * When the map field is accessed (through generated API or reflection API),
|
| * it will shift between these 3 modes:
|
| - *
|
| + *
|
| * getMap() getList() getMutableMap() getMutableList()
|
| * MAP MAP BOTH MAP LIST
|
| * LIST BOTH LIST MAP LIST
|
| * BOTH BOTH BOTH MAP LIST
|
| - *
|
| + *
|
| * As the map field changes its mode, the list/map reference returned in a
|
| - * previous method call may be invalidated.
|
| + * previous method call may be invalidated.
|
| */
|
| private enum StorageMode {MAP, LIST, BOTH}
|
|
|
| @@ -79,26 +78,26 @@ public class MapField<K, V> implements MutabilityOracle {
|
| private volatile StorageMode mode;
|
| private MutatabilityAwareMap<K, V> mapData;
|
| private List<Message> listData;
|
| -
|
| +
|
| // Convert between a map entry Message and a key-value pair.
|
| private static interface Converter<K, V> {
|
| Message convertKeyAndValueToMessage(K key, V value);
|
| void convertMessageToKeyAndValue(Message message, Map<K, V> map);
|
| -
|
| +
|
| Message getMessageDefaultInstance();
|
| }
|
| -
|
| +
|
| private static class ImmutableMessageConverter<K, V> implements Converter<K, V> {
|
| private final MapEntry<K, V> defaultEntry;
|
| public ImmutableMessageConverter(MapEntry<K, V> defaultEntry) {
|
| this.defaultEntry = defaultEntry;
|
| }
|
| -
|
| +
|
| @Override
|
| public Message convertKeyAndValueToMessage(K key, V value) {
|
| return defaultEntry.newBuilderForType().setKey(key).setValue(value).buildPartial();
|
| }
|
| -
|
| +
|
| @Override
|
| public void convertMessageToKeyAndValue(Message message, Map<K, V> map) {
|
| MapEntry<K, V> entry = (MapEntry<K, V>) message;
|
| @@ -110,10 +109,10 @@ public class MapField<K, V> implements MutabilityOracle {
|
| return defaultEntry;
|
| }
|
| }
|
| -
|
| +
|
|
|
| private final Converter<K, V> converter;
|
| -
|
| +
|
| private MapField(
|
| Converter<K, V> converter,
|
| StorageMode mode,
|
| @@ -124,34 +123,34 @@ public class MapField<K, V> implements MutabilityOracle {
|
| this.mapData = new MutatabilityAwareMap<K, V>(this, mapData);
|
| this.listData = null;
|
| }
|
| -
|
| +
|
| private MapField(
|
| MapEntry<K, V> defaultEntry,
|
| StorageMode mode,
|
| Map<K, V> mapData) {
|
| this(new ImmutableMessageConverter<K, V>(defaultEntry), mode, mapData);
|
| }
|
| -
|
| -
|
| +
|
| +
|
| /** Returns an immutable empty MapField. */
|
| public static <K, V> MapField<K, V> emptyMapField(
|
| MapEntry<K, V> defaultEntry) {
|
| return new MapField<K, V>(
|
| defaultEntry, StorageMode.MAP, Collections.<K, V>emptyMap());
|
| }
|
| -
|
| -
|
| +
|
| +
|
| /** Creates a new mutable empty MapField. */
|
| public static <K, V> MapField<K, V> newMapField(MapEntry<K, V> defaultEntry) {
|
| return new MapField<K, V>(
|
| defaultEntry, StorageMode.MAP, new LinkedHashMap<K, V>());
|
| }
|
| -
|
| -
|
| +
|
| +
|
| private Message convertKeyAndValueToMessage(K key, V value) {
|
| return converter.convertKeyAndValueToMessage(key, value);
|
| }
|
| -
|
| +
|
| @SuppressWarnings("unchecked")
|
| private void convertMessageToKeyAndValue(Message message, Map<K, V> map) {
|
| converter.convertMessageToKeyAndValue(message, map);
|
| @@ -174,7 +173,7 @@ public class MapField<K, V> implements MutabilityOracle {
|
| }
|
| return new MutatabilityAwareMap<K, V>(this, mapData);
|
| }
|
| -
|
| +
|
| /** Returns the content of this MapField as a read-only Map. */
|
| public Map<K, V> getMap() {
|
| if (mode == StorageMode.LIST) {
|
| @@ -187,7 +186,7 @@ public class MapField<K, V> implements MutabilityOracle {
|
| }
|
| return Collections.unmodifiableMap(mapData);
|
| }
|
| -
|
| +
|
| /** Gets a mutable Map view of this MapField. */
|
| public Map<K, V> getMutableMap() {
|
| if (mode != StorageMode.MAP) {
|
| @@ -195,20 +194,20 @@ public class MapField<K, V> implements MutabilityOracle {
|
| mapData = convertListToMap(listData);
|
| }
|
| listData = null;
|
| - mode = StorageMode.MAP;
|
| + mode = StorageMode.MAP;
|
| }
|
| return mapData;
|
| }
|
| -
|
| +
|
| public void mergeFrom(MapField<K, V> other) {
|
| getMutableMap().putAll(MapFieldLite.copy(other.getMap()));
|
| }
|
| -
|
| +
|
| public void clear() {
|
| mapData = new MutatabilityAwareMap<K, V>(this, new LinkedHashMap<K, V>());
|
| mode = StorageMode.MAP;
|
| }
|
| -
|
| +
|
| @SuppressWarnings("unchecked")
|
| @Override
|
| public boolean equals(Object object) {
|
| @@ -218,18 +217,18 @@ public class MapField<K, V> implements MutabilityOracle {
|
| MapField<K, V> other = (MapField<K, V>) object;
|
| return MapFieldLite.<K, V>equals(getMap(), other.getMap());
|
| }
|
| -
|
| +
|
| @Override
|
| public int hashCode() {
|
| return MapFieldLite.<K, V>calculateHashCodeForMap(getMap());
|
| }
|
| -
|
| +
|
| /** Returns a deep copy of this MapField. */
|
| public MapField<K, V> copy() {
|
| return new MapField<K, V>(
|
| converter, StorageMode.MAP, MapFieldLite.copy(getMap()));
|
| }
|
| -
|
| +
|
| /** Gets the content of this MapField as a read-only List. */
|
| List<Message> getList() {
|
| if (mode == StorageMode.MAP) {
|
| @@ -242,7 +241,7 @@ public class MapField<K, V> implements MutabilityOracle {
|
| }
|
| return Collections.unmodifiableList(listData);
|
| }
|
| -
|
| +
|
| /** Gets a mutable List view of this MapField. */
|
| List<Message> getMutableList() {
|
| if (mode != StorageMode.LIST) {
|
| @@ -254,7 +253,7 @@ public class MapField<K, V> implements MutabilityOracle {
|
| }
|
| return listData;
|
| }
|
| -
|
| +
|
| /**
|
| * Gets the default instance of the message stored in the list view of this
|
| * map field.
|
| @@ -262,7 +261,7 @@ public class MapField<K, V> implements MutabilityOracle {
|
| Message getMapEntryMessageDefaultInstance() {
|
| return converter.getMessageDefaultInstance();
|
| }
|
| -
|
| +
|
| /**
|
| * Makes this list immutable. All subsequent modifications will throw an
|
| * {@link UnsupportedOperationException}.
|
| @@ -270,14 +269,14 @@ public class MapField<K, V> implements MutabilityOracle {
|
| public void makeImmutable() {
|
| isMutable = false;
|
| }
|
| -
|
| +
|
| /**
|
| * Returns whether this field can be modified.
|
| */
|
| public boolean isMutable() {
|
| return isMutable;
|
| }
|
| -
|
| +
|
| /* (non-Javadoc)
|
| * @see com.google.protobuf.MutabilityOracle#ensureMutable()
|
| */
|
| @@ -287,338 +286,4 @@ public class MapField<K, V> implements MutabilityOracle {
|
| throw new UnsupportedOperationException();
|
| }
|
| }
|
| -
|
| - /**
|
| - * An internal map that checks for mutability before delegating.
|
| - */
|
| - private 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.
|
| - 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();
|
| - }
|
| - }
|
| - }
|
| }
|
|
|