516 lines
20 KiB
Java
516 lines
20 KiB
Java
package com.google.common.collect;
|
|
|
|
import com.google.common.base.Objects;
|
|
import com.google.common.collect.Sets;
|
|
import java.io.IOException;
|
|
import java.io.ObjectInputStream;
|
|
import java.io.ObjectOutputStream;
|
|
import java.util.Arrays;
|
|
import java.util.Collection;
|
|
import java.util.ConcurrentModificationException;
|
|
import java.util.Iterator;
|
|
import java.util.LinkedHashMap;
|
|
import java.util.LinkedHashSet;
|
|
import java.util.Map;
|
|
import java.util.NoSuchElementException;
|
|
import java.util.Set;
|
|
|
|
/* loaded from: classes.dex */
|
|
public final class LinkedHashMultimap<K, V> extends LinkedHashMultimapGwtSerializationDependencies<K, V> {
|
|
private static final int DEFAULT_KEY_CAPACITY = 16;
|
|
private static final int DEFAULT_VALUE_SET_CAPACITY = 2;
|
|
static final double VALUE_SET_LOAD_FACTOR = 1.0d;
|
|
private static final long serialVersionUID = 1;
|
|
private transient ValueEntry<K, V> multimapHeaderEntry;
|
|
transient int valueSetCapacity;
|
|
|
|
static final class ValueEntry<K, V> extends ImmutableEntry<K, V> implements ValueSetLink<K, V> {
|
|
final int c;
|
|
ValueEntry<K, V> d;
|
|
ValueSetLink<K, V> e;
|
|
ValueSetLink<K, V> f;
|
|
ValueEntry<K, V> g;
|
|
ValueEntry<K, V> h;
|
|
|
|
ValueEntry(K k, V v, int i, ValueEntry<K, V> valueEntry) {
|
|
super(k, v);
|
|
this.c = i;
|
|
this.d = valueEntry;
|
|
}
|
|
|
|
boolean a(Object obj, int i) {
|
|
return this.c == i && Objects.a(getValue(), obj);
|
|
}
|
|
|
|
@Override // com.google.common.collect.LinkedHashMultimap.ValueSetLink
|
|
public ValueSetLink<K, V> b() {
|
|
return this.f;
|
|
}
|
|
|
|
public ValueEntry<K, V> c() {
|
|
return this.g;
|
|
}
|
|
|
|
public ValueEntry<K, V> d() {
|
|
return this.h;
|
|
}
|
|
|
|
@Override // com.google.common.collect.LinkedHashMultimap.ValueSetLink
|
|
public ValueSetLink<K, V> a() {
|
|
return this.e;
|
|
}
|
|
|
|
@Override // com.google.common.collect.LinkedHashMultimap.ValueSetLink
|
|
public void b(ValueSetLink<K, V> valueSetLink) {
|
|
this.e = valueSetLink;
|
|
}
|
|
|
|
@Override // com.google.common.collect.LinkedHashMultimap.ValueSetLink
|
|
public void a(ValueSetLink<K, V> valueSetLink) {
|
|
this.f = valueSetLink;
|
|
}
|
|
|
|
public void b(ValueEntry<K, V> valueEntry) {
|
|
this.h = valueEntry;
|
|
}
|
|
|
|
public void a(ValueEntry<K, V> valueEntry) {
|
|
this.g = valueEntry;
|
|
}
|
|
}
|
|
|
|
final class ValueSet extends Sets.ImprovedAbstractSet<V> implements ValueSetLink<K, V> {
|
|
private final K a;
|
|
ValueEntry<K, V>[] b;
|
|
private int c = 0;
|
|
private int d = 0;
|
|
private ValueSetLink<K, V> e = this;
|
|
private ValueSetLink<K, V> f = this;
|
|
|
|
ValueSet(K k, int i) {
|
|
this.a = k;
|
|
this.b = new ValueEntry[Hashing.a(i, LinkedHashMultimap.VALUE_SET_LOAD_FACTOR)];
|
|
}
|
|
|
|
private int c() {
|
|
return this.b.length - 1;
|
|
}
|
|
|
|
private void d() {
|
|
if (Hashing.a(this.c, this.b.length, LinkedHashMultimap.VALUE_SET_LOAD_FACTOR)) {
|
|
ValueEntry<K, V>[] valueEntryArr = new ValueEntry[this.b.length * 2];
|
|
this.b = valueEntryArr;
|
|
int length = valueEntryArr.length - 1;
|
|
for (ValueSetLink<K, V> valueSetLink = this.e; valueSetLink != this; valueSetLink = valueSetLink.b()) {
|
|
ValueEntry<K, V> valueEntry = (ValueEntry) valueSetLink;
|
|
int i = valueEntry.c & length;
|
|
valueEntry.d = valueEntryArr[i];
|
|
valueEntryArr[i] = valueEntry;
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override // java.util.AbstractCollection, java.util.Collection, java.util.Set
|
|
public boolean add(V v) {
|
|
int a = Hashing.a(v);
|
|
int c = c() & a;
|
|
ValueEntry<K, V> valueEntry = this.b[c];
|
|
for (ValueEntry<K, V> valueEntry2 = valueEntry; valueEntry2 != null; valueEntry2 = valueEntry2.d) {
|
|
if (valueEntry2.a(v, a)) {
|
|
return false;
|
|
}
|
|
}
|
|
ValueEntry<K, V> valueEntry3 = new ValueEntry<>(this.a, v, a, valueEntry);
|
|
LinkedHashMultimap.succeedsInValueSet(this.f, valueEntry3);
|
|
LinkedHashMultimap.succeedsInValueSet(valueEntry3, this);
|
|
LinkedHashMultimap.succeedsInMultimap(LinkedHashMultimap.this.multimapHeaderEntry.c(), valueEntry3);
|
|
LinkedHashMultimap.succeedsInMultimap(valueEntry3, LinkedHashMultimap.this.multimapHeaderEntry);
|
|
this.b[c] = valueEntry3;
|
|
this.c++;
|
|
this.d++;
|
|
d();
|
|
return true;
|
|
}
|
|
|
|
@Override // java.util.AbstractCollection, java.util.Collection, java.util.Set
|
|
public void clear() {
|
|
Arrays.fill(this.b, (Object) null);
|
|
this.c = 0;
|
|
for (ValueSetLink<K, V> valueSetLink = this.e; valueSetLink != this; valueSetLink = valueSetLink.b()) {
|
|
LinkedHashMultimap.deleteFromMultimap((ValueEntry) valueSetLink);
|
|
}
|
|
LinkedHashMultimap.succeedsInValueSet(this, this);
|
|
this.d++;
|
|
}
|
|
|
|
@Override // java.util.AbstractCollection, java.util.Collection, java.util.Set
|
|
public boolean contains(Object obj) {
|
|
int a = Hashing.a(obj);
|
|
for (ValueEntry<K, V> valueEntry = this.b[c() & a]; valueEntry != null; valueEntry = valueEntry.d) {
|
|
if (valueEntry.a(obj, a)) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
@Override // java.util.AbstractCollection, java.util.Collection, java.lang.Iterable, java.util.Set
|
|
public Iterator<V> iterator() {
|
|
return new Iterator<V>() { // from class: com.google.common.collect.LinkedHashMultimap.ValueSet.1
|
|
ValueSetLink<K, V> a;
|
|
ValueEntry<K, V> b;
|
|
int c;
|
|
|
|
{
|
|
this.a = ValueSet.this.e;
|
|
this.c = ValueSet.this.d;
|
|
}
|
|
|
|
private void a() {
|
|
if (ValueSet.this.d != this.c) {
|
|
throw new ConcurrentModificationException();
|
|
}
|
|
}
|
|
|
|
@Override // java.util.Iterator
|
|
public boolean hasNext() {
|
|
a();
|
|
return this.a != ValueSet.this;
|
|
}
|
|
|
|
@Override // java.util.Iterator
|
|
public V next() {
|
|
if (!hasNext()) {
|
|
throw new NoSuchElementException();
|
|
}
|
|
ValueEntry<K, V> valueEntry = (ValueEntry) this.a;
|
|
V value = valueEntry.getValue();
|
|
this.b = valueEntry;
|
|
this.a = valueEntry.b();
|
|
return value;
|
|
}
|
|
|
|
@Override // java.util.Iterator
|
|
public void remove() {
|
|
a();
|
|
CollectPreconditions.a(this.b != null);
|
|
ValueSet.this.remove(this.b.getValue());
|
|
this.c = ValueSet.this.d;
|
|
this.b = null;
|
|
}
|
|
};
|
|
}
|
|
|
|
@Override // java.util.AbstractCollection, java.util.Collection, java.util.Set
|
|
public boolean remove(Object obj) {
|
|
int a = Hashing.a(obj);
|
|
int c = c() & a;
|
|
ValueEntry<K, V> valueEntry = this.b[c];
|
|
ValueEntry<K, V> valueEntry2 = null;
|
|
while (true) {
|
|
ValueEntry<K, V> valueEntry3 = valueEntry2;
|
|
valueEntry2 = valueEntry;
|
|
if (valueEntry2 == null) {
|
|
return false;
|
|
}
|
|
if (valueEntry2.a(obj, a)) {
|
|
if (valueEntry3 == null) {
|
|
this.b[c] = valueEntry2.d;
|
|
} else {
|
|
valueEntry3.d = valueEntry2.d;
|
|
}
|
|
LinkedHashMultimap.deleteFromValueSet(valueEntry2);
|
|
LinkedHashMultimap.deleteFromMultimap(valueEntry2);
|
|
this.c--;
|
|
this.d++;
|
|
return true;
|
|
}
|
|
valueEntry = valueEntry2.d;
|
|
}
|
|
}
|
|
|
|
@Override // java.util.AbstractCollection, java.util.Collection, java.util.Set
|
|
public int size() {
|
|
return this.c;
|
|
}
|
|
|
|
@Override // com.google.common.collect.LinkedHashMultimap.ValueSetLink
|
|
public ValueSetLink<K, V> a() {
|
|
return this.f;
|
|
}
|
|
|
|
@Override // com.google.common.collect.LinkedHashMultimap.ValueSetLink
|
|
public ValueSetLink<K, V> b() {
|
|
return this.e;
|
|
}
|
|
|
|
@Override // com.google.common.collect.LinkedHashMultimap.ValueSetLink
|
|
public void a(ValueSetLink<K, V> valueSetLink) {
|
|
this.e = valueSetLink;
|
|
}
|
|
|
|
@Override // com.google.common.collect.LinkedHashMultimap.ValueSetLink
|
|
public void b(ValueSetLink<K, V> valueSetLink) {
|
|
this.f = valueSetLink;
|
|
}
|
|
}
|
|
|
|
private interface ValueSetLink<K, V> {
|
|
ValueSetLink<K, V> a();
|
|
|
|
void a(ValueSetLink<K, V> valueSetLink);
|
|
|
|
ValueSetLink<K, V> b();
|
|
|
|
void b(ValueSetLink<K, V> valueSetLink);
|
|
}
|
|
|
|
private LinkedHashMultimap(int i, int i2) {
|
|
super(new LinkedHashMap(i));
|
|
this.valueSetCapacity = 2;
|
|
CollectPreconditions.a(i2, "expectedValuesPerKey");
|
|
this.valueSetCapacity = i2;
|
|
this.multimapHeaderEntry = new ValueEntry<>(null, null, 0, null);
|
|
ValueEntry<K, V> valueEntry = this.multimapHeaderEntry;
|
|
succeedsInMultimap(valueEntry, valueEntry);
|
|
}
|
|
|
|
public static <K, V> LinkedHashMultimap<K, V> create() {
|
|
return new LinkedHashMultimap<>(16, 2);
|
|
}
|
|
|
|
/* JADX INFO: Access modifiers changed from: private */
|
|
public static <K, V> void deleteFromMultimap(ValueEntry<K, V> valueEntry) {
|
|
succeedsInMultimap(valueEntry.c(), valueEntry.d());
|
|
}
|
|
|
|
/* JADX INFO: Access modifiers changed from: private */
|
|
public static <K, V> void deleteFromValueSet(ValueSetLink<K, V> valueSetLink) {
|
|
succeedsInValueSet(valueSetLink.a(), valueSetLink.b());
|
|
}
|
|
|
|
/* JADX WARN: Multi-variable type inference failed */
|
|
private void readObject(ObjectInputStream objectInputStream) throws IOException, ClassNotFoundException {
|
|
objectInputStream.defaultReadObject();
|
|
this.multimapHeaderEntry = new ValueEntry<>(null, null, 0, null);
|
|
ValueEntry<K, V> valueEntry = this.multimapHeaderEntry;
|
|
succeedsInMultimap(valueEntry, valueEntry);
|
|
this.valueSetCapacity = 2;
|
|
int readInt = objectInputStream.readInt();
|
|
LinkedHashMap linkedHashMap = new LinkedHashMap();
|
|
for (int i = 0; i < readInt; i++) {
|
|
Object readObject = objectInputStream.readObject();
|
|
linkedHashMap.put(readObject, createCollection(readObject));
|
|
}
|
|
int readInt2 = objectInputStream.readInt();
|
|
for (int i2 = 0; i2 < readInt2; i2++) {
|
|
Object readObject2 = objectInputStream.readObject();
|
|
((Collection) linkedHashMap.get(readObject2)).add(objectInputStream.readObject());
|
|
}
|
|
setMap(linkedHashMap);
|
|
}
|
|
|
|
/* JADX INFO: Access modifiers changed from: private */
|
|
public static <K, V> void succeedsInMultimap(ValueEntry<K, V> valueEntry, ValueEntry<K, V> valueEntry2) {
|
|
valueEntry.b((ValueEntry) valueEntry2);
|
|
valueEntry2.a((ValueEntry) valueEntry);
|
|
}
|
|
|
|
/* JADX INFO: Access modifiers changed from: private */
|
|
public static <K, V> void succeedsInValueSet(ValueSetLink<K, V> valueSetLink, ValueSetLink<K, V> valueSetLink2) {
|
|
valueSetLink.a(valueSetLink2);
|
|
valueSetLink2.b(valueSetLink);
|
|
}
|
|
|
|
private void writeObject(ObjectOutputStream objectOutputStream) throws IOException {
|
|
objectOutputStream.defaultWriteObject();
|
|
objectOutputStream.writeInt(keySet().size());
|
|
Iterator<K> it = keySet().iterator();
|
|
while (it.hasNext()) {
|
|
objectOutputStream.writeObject(it.next());
|
|
}
|
|
objectOutputStream.writeInt(size());
|
|
for (Map.Entry<K, V> entry : entries()) {
|
|
objectOutputStream.writeObject(entry.getKey());
|
|
objectOutputStream.writeObject(entry.getValue());
|
|
}
|
|
}
|
|
|
|
@Override // com.google.common.collect.AbstractSetMultimap, com.google.common.collect.AbstractMultimap, com.google.common.collect.Multimap
|
|
public /* bridge */ /* synthetic */ Map asMap() {
|
|
return super.asMap();
|
|
}
|
|
|
|
@Override // com.google.common.collect.AbstractMapBasedMultimap, com.google.common.collect.Multimap
|
|
public void clear() {
|
|
super.clear();
|
|
ValueEntry<K, V> valueEntry = this.multimapHeaderEntry;
|
|
succeedsInMultimap(valueEntry, valueEntry);
|
|
}
|
|
|
|
@Override // com.google.common.collect.AbstractMultimap, com.google.common.collect.Multimap
|
|
public /* bridge */ /* synthetic */ boolean containsEntry(Object obj, Object obj2) {
|
|
return super.containsEntry(obj, obj2);
|
|
}
|
|
|
|
@Override // com.google.common.collect.AbstractMapBasedMultimap, com.google.common.collect.Multimap
|
|
public /* bridge */ /* synthetic */ boolean containsKey(Object obj) {
|
|
return super.containsKey(obj);
|
|
}
|
|
|
|
@Override // com.google.common.collect.AbstractMultimap
|
|
public /* bridge */ /* synthetic */ boolean containsValue(Object obj) {
|
|
return super.containsValue(obj);
|
|
}
|
|
|
|
@Override // com.google.common.collect.AbstractMapBasedMultimap, com.google.common.collect.AbstractMultimap
|
|
Iterator<Map.Entry<K, V>> entryIterator() {
|
|
return new Iterator<Map.Entry<K, V>>() { // from class: com.google.common.collect.LinkedHashMultimap.1
|
|
ValueEntry<K, V> a;
|
|
ValueEntry<K, V> b;
|
|
|
|
{
|
|
this.a = LinkedHashMultimap.this.multimapHeaderEntry.h;
|
|
}
|
|
|
|
@Override // java.util.Iterator
|
|
public boolean hasNext() {
|
|
return this.a != LinkedHashMultimap.this.multimapHeaderEntry;
|
|
}
|
|
|
|
@Override // java.util.Iterator
|
|
public void remove() {
|
|
CollectPreconditions.a(this.b != null);
|
|
LinkedHashMultimap.this.remove(this.b.getKey(), this.b.getValue());
|
|
this.b = null;
|
|
}
|
|
|
|
@Override // java.util.Iterator
|
|
public Map.Entry<K, V> next() {
|
|
if (!hasNext()) {
|
|
throw new NoSuchElementException();
|
|
}
|
|
ValueEntry<K, V> valueEntry = this.a;
|
|
this.b = valueEntry;
|
|
this.a = valueEntry.h;
|
|
return valueEntry;
|
|
}
|
|
};
|
|
}
|
|
|
|
@Override // com.google.common.collect.AbstractSetMultimap, com.google.common.collect.AbstractMultimap
|
|
public /* bridge */ /* synthetic */ boolean equals(Object obj) {
|
|
return super.equals(obj);
|
|
}
|
|
|
|
/* JADX WARN: Multi-variable type inference failed */
|
|
@Override // com.google.common.collect.AbstractSetMultimap, com.google.common.collect.AbstractMapBasedMultimap, com.google.common.collect.Multimap
|
|
public /* bridge */ /* synthetic */ Set get(Object obj) {
|
|
return super.get((LinkedHashMultimap<K, V>) obj);
|
|
}
|
|
|
|
@Override // com.google.common.collect.AbstractMultimap
|
|
public /* bridge */ /* synthetic */ int hashCode() {
|
|
return super.hashCode();
|
|
}
|
|
|
|
@Override // com.google.common.collect.AbstractMultimap, com.google.common.collect.Multimap
|
|
public /* bridge */ /* synthetic */ boolean isEmpty() {
|
|
return super.isEmpty();
|
|
}
|
|
|
|
@Override // com.google.common.collect.AbstractMultimap, com.google.common.collect.Multimap
|
|
public Set<K> keySet() {
|
|
return super.keySet();
|
|
}
|
|
|
|
@Override // com.google.common.collect.AbstractMultimap
|
|
public /* bridge */ /* synthetic */ Multiset keys() {
|
|
return super.keys();
|
|
}
|
|
|
|
/* JADX WARN: Multi-variable type inference failed */
|
|
@Override // com.google.common.collect.AbstractSetMultimap, com.google.common.collect.AbstractMapBasedMultimap, com.google.common.collect.AbstractMultimap, com.google.common.collect.Multimap
|
|
public /* bridge */ /* synthetic */ boolean put(Object obj, Object obj2) {
|
|
return super.put(obj, obj2);
|
|
}
|
|
|
|
@Override // com.google.common.collect.AbstractMultimap
|
|
public /* bridge */ /* synthetic */ boolean putAll(Multimap multimap) {
|
|
return super.putAll(multimap);
|
|
}
|
|
|
|
@Override // com.google.common.collect.AbstractMultimap, com.google.common.collect.Multimap
|
|
public /* bridge */ /* synthetic */ boolean remove(Object obj, Object obj2) {
|
|
return super.remove(obj, obj2);
|
|
}
|
|
|
|
@Override // com.google.common.collect.AbstractSetMultimap, com.google.common.collect.AbstractMapBasedMultimap, com.google.common.collect.Multimap
|
|
public /* bridge */ /* synthetic */ Set removeAll(Object obj) {
|
|
return super.removeAll(obj);
|
|
}
|
|
|
|
/* JADX WARN: Multi-variable type inference failed */
|
|
@Override // com.google.common.collect.AbstractSetMultimap, com.google.common.collect.AbstractMapBasedMultimap, com.google.common.collect.AbstractMultimap
|
|
public /* bridge */ /* synthetic */ Collection replaceValues(Object obj, Iterable iterable) {
|
|
return replaceValues((LinkedHashMultimap<K, V>) obj, iterable);
|
|
}
|
|
|
|
@Override // com.google.common.collect.AbstractMapBasedMultimap, com.google.common.collect.Multimap
|
|
public /* bridge */ /* synthetic */ int size() {
|
|
return super.size();
|
|
}
|
|
|
|
@Override // com.google.common.collect.AbstractMultimap
|
|
public /* bridge */ /* synthetic */ String toString() {
|
|
return super.toString();
|
|
}
|
|
|
|
@Override // com.google.common.collect.AbstractMapBasedMultimap, com.google.common.collect.AbstractMultimap
|
|
Iterator<V> valueIterator() {
|
|
return Maps.b(entryIterator());
|
|
}
|
|
|
|
@Override // com.google.common.collect.AbstractMapBasedMultimap, com.google.common.collect.AbstractMultimap
|
|
public Collection<V> values() {
|
|
return super.values();
|
|
}
|
|
|
|
public static <K, V> LinkedHashMultimap<K, V> create(int i, int i2) {
|
|
return new LinkedHashMultimap<>(Maps.a(i), Maps.a(i2));
|
|
}
|
|
|
|
/* JADX INFO: Access modifiers changed from: package-private */
|
|
@Override // com.google.common.collect.AbstractSetMultimap, com.google.common.collect.AbstractMapBasedMultimap
|
|
public Set<V> createCollection() {
|
|
return new LinkedHashSet(this.valueSetCapacity);
|
|
}
|
|
|
|
@Override // com.google.common.collect.AbstractSetMultimap, com.google.common.collect.AbstractMapBasedMultimap, com.google.common.collect.AbstractMultimap, com.google.common.collect.Multimap
|
|
public Set<Map.Entry<K, V>> entries() {
|
|
return super.entries();
|
|
}
|
|
|
|
/* JADX WARN: Multi-variable type inference failed */
|
|
@Override // com.google.common.collect.AbstractMultimap, com.google.common.collect.Multimap
|
|
public /* bridge */ /* synthetic */ boolean putAll(Object obj, Iterable iterable) {
|
|
return super.putAll(obj, iterable);
|
|
}
|
|
|
|
@Override // com.google.common.collect.AbstractSetMultimap, com.google.common.collect.AbstractMapBasedMultimap, com.google.common.collect.AbstractMultimap
|
|
public Set<V> replaceValues(K k, Iterable<? extends V> iterable) {
|
|
return super.replaceValues((LinkedHashMultimap<K, V>) k, (Iterable) iterable);
|
|
}
|
|
|
|
@Override // com.google.common.collect.AbstractMapBasedMultimap
|
|
Collection<V> createCollection(K k) {
|
|
return new ValueSet(k, this.valueSetCapacity);
|
|
}
|
|
|
|
public static <K, V> LinkedHashMultimap<K, V> create(Multimap<? extends K, ? extends V> multimap) {
|
|
LinkedHashMultimap<K, V> create = create(multimap.keySet().size(), 2);
|
|
create.putAll(multimap);
|
|
return create;
|
|
}
|
|
}
|