364 lines
13 KiB
Java
364 lines
13 KiB
Java
package com.google.common.collect;
|
|
|
|
import com.google.common.base.Function;
|
|
import com.google.common.base.Preconditions;
|
|
import com.google.common.base.Supplier;
|
|
import com.google.common.collect.Maps;
|
|
import com.google.common.collect.Multiset;
|
|
import com.google.common.collect.Multisets;
|
|
import java.io.IOException;
|
|
import java.io.ObjectInputStream;
|
|
import java.io.ObjectOutputStream;
|
|
import java.util.AbstractCollection;
|
|
import java.util.Collection;
|
|
import java.util.Iterator;
|
|
import java.util.List;
|
|
import java.util.Map;
|
|
import java.util.Set;
|
|
|
|
/* loaded from: classes.dex */
|
|
public final class Multimaps {
|
|
|
|
static final class AsMap<K, V> extends Maps.ViewCachingAbstractMap<K, Collection<V>> {
|
|
private final Multimap<K, V> d;
|
|
|
|
class EntrySet extends Maps.EntrySet<K, Collection<V>> {
|
|
EntrySet() {
|
|
}
|
|
|
|
@Override // com.google.common.collect.Maps.EntrySet
|
|
Map<K, Collection<V>> c() {
|
|
return AsMap.this;
|
|
}
|
|
|
|
@Override // java.util.AbstractCollection, java.util.Collection, java.lang.Iterable, java.util.Set
|
|
public Iterator<Map.Entry<K, Collection<V>>> iterator() {
|
|
return Maps.a((Set) AsMap.this.d.keySet(), (Function) new Function<K, Collection<V>>() { // from class: com.google.common.collect.Multimaps.AsMap.EntrySet.1
|
|
@Override // com.google.common.base.Function
|
|
public /* bridge */ /* synthetic */ Object apply(Object obj) {
|
|
return apply((AnonymousClass1) obj);
|
|
}
|
|
|
|
@Override // com.google.common.base.Function
|
|
public Collection<V> apply(K k) {
|
|
return AsMap.this.d.get(k);
|
|
}
|
|
});
|
|
}
|
|
|
|
@Override // com.google.common.collect.Maps.EntrySet, java.util.AbstractCollection, java.util.Collection, java.util.Set
|
|
public boolean remove(Object obj) {
|
|
if (!contains(obj)) {
|
|
return false;
|
|
}
|
|
AsMap.this.a(((Map.Entry) obj).getKey());
|
|
return true;
|
|
}
|
|
}
|
|
|
|
AsMap(Multimap<K, V> multimap) {
|
|
Preconditions.a(multimap);
|
|
this.d = multimap;
|
|
}
|
|
|
|
@Override // java.util.AbstractMap, java.util.Map
|
|
public void clear() {
|
|
this.d.clear();
|
|
}
|
|
|
|
@Override // java.util.AbstractMap, java.util.Map
|
|
public boolean containsKey(Object obj) {
|
|
return this.d.containsKey(obj);
|
|
}
|
|
|
|
@Override // java.util.AbstractMap, java.util.Map
|
|
public boolean isEmpty() {
|
|
return this.d.isEmpty();
|
|
}
|
|
|
|
@Override // com.google.common.collect.Maps.ViewCachingAbstractMap, java.util.AbstractMap, java.util.Map
|
|
public Set<K> keySet() {
|
|
return this.d.keySet();
|
|
}
|
|
|
|
@Override // java.util.AbstractMap, java.util.Map
|
|
public int size() {
|
|
return this.d.keySet().size();
|
|
}
|
|
|
|
@Override // com.google.common.collect.Maps.ViewCachingAbstractMap
|
|
protected Set<Map.Entry<K, Collection<V>>> a() {
|
|
return new EntrySet();
|
|
}
|
|
|
|
@Override // java.util.AbstractMap, java.util.Map
|
|
public Collection<V> get(Object obj) {
|
|
if (containsKey(obj)) {
|
|
return this.d.get(obj);
|
|
}
|
|
return null;
|
|
}
|
|
|
|
@Override // java.util.AbstractMap, java.util.Map
|
|
public Collection<V> remove(Object obj) {
|
|
if (containsKey(obj)) {
|
|
return this.d.removeAll(obj);
|
|
}
|
|
return null;
|
|
}
|
|
|
|
void a(Object obj) {
|
|
this.d.keySet().remove(obj);
|
|
}
|
|
}
|
|
|
|
private static class CustomListMultimap<K, V> extends AbstractListMultimap<K, V> {
|
|
transient Supplier<? extends List<V>> a;
|
|
|
|
CustomListMultimap(Map<K, Collection<V>> map, Supplier<? extends List<V>> supplier) {
|
|
super(map);
|
|
Preconditions.a(supplier);
|
|
this.a = supplier;
|
|
}
|
|
|
|
private void readObject(ObjectInputStream objectInputStream) throws IOException, ClassNotFoundException {
|
|
objectInputStream.defaultReadObject();
|
|
this.a = (Supplier) objectInputStream.readObject();
|
|
setMap((Map) objectInputStream.readObject());
|
|
}
|
|
|
|
private void writeObject(ObjectOutputStream objectOutputStream) throws IOException {
|
|
objectOutputStream.defaultWriteObject();
|
|
objectOutputStream.writeObject(this.a);
|
|
objectOutputStream.writeObject(backingMap());
|
|
}
|
|
|
|
/* JADX INFO: Access modifiers changed from: protected */
|
|
@Override // com.google.common.collect.AbstractListMultimap, com.google.common.collect.AbstractMapBasedMultimap
|
|
public List<V> createCollection() {
|
|
return this.a.get();
|
|
}
|
|
}
|
|
|
|
private static class CustomSetMultimap<K, V> extends AbstractSetMultimap<K, V> {
|
|
transient Supplier<? extends Set<V>> a;
|
|
|
|
CustomSetMultimap(Map<K, Collection<V>> map, Supplier<? extends Set<V>> supplier) {
|
|
super(map);
|
|
Preconditions.a(supplier);
|
|
this.a = supplier;
|
|
}
|
|
|
|
private void readObject(ObjectInputStream objectInputStream) throws IOException, ClassNotFoundException {
|
|
objectInputStream.defaultReadObject();
|
|
this.a = (Supplier) objectInputStream.readObject();
|
|
setMap((Map) objectInputStream.readObject());
|
|
}
|
|
|
|
private void writeObject(ObjectOutputStream objectOutputStream) throws IOException {
|
|
objectOutputStream.defaultWriteObject();
|
|
objectOutputStream.writeObject(this.a);
|
|
objectOutputStream.writeObject(backingMap());
|
|
}
|
|
|
|
/* JADX INFO: Access modifiers changed from: protected */
|
|
@Override // com.google.common.collect.AbstractSetMultimap, com.google.common.collect.AbstractMapBasedMultimap
|
|
public Set<V> createCollection() {
|
|
return this.a.get();
|
|
}
|
|
}
|
|
|
|
static abstract class Entries<K, V> extends AbstractCollection<Map.Entry<K, V>> {
|
|
Entries() {
|
|
}
|
|
|
|
abstract Multimap<K, V> a();
|
|
|
|
@Override // java.util.AbstractCollection, java.util.Collection
|
|
public void clear() {
|
|
a().clear();
|
|
}
|
|
|
|
@Override // java.util.AbstractCollection, java.util.Collection
|
|
public boolean contains(Object obj) {
|
|
if (!(obj instanceof Map.Entry)) {
|
|
return false;
|
|
}
|
|
Map.Entry entry = (Map.Entry) obj;
|
|
return a().containsEntry(entry.getKey(), entry.getValue());
|
|
}
|
|
|
|
@Override // java.util.AbstractCollection, java.util.Collection
|
|
public boolean remove(Object obj) {
|
|
if (!(obj instanceof Map.Entry)) {
|
|
return false;
|
|
}
|
|
Map.Entry entry = (Map.Entry) obj;
|
|
return a().remove(entry.getKey(), entry.getValue());
|
|
}
|
|
|
|
@Override // java.util.AbstractCollection, java.util.Collection
|
|
public int size() {
|
|
return a().size();
|
|
}
|
|
}
|
|
|
|
static class Keys<K, V> extends AbstractMultiset<K> {
|
|
final Multimap<K, V> a;
|
|
|
|
class KeysEntrySet extends Multisets.EntrySet<K> {
|
|
KeysEntrySet() {
|
|
}
|
|
|
|
@Override // com.google.common.collect.Multisets.EntrySet
|
|
Multiset<K> c() {
|
|
return Keys.this;
|
|
}
|
|
|
|
@Override // com.google.common.collect.Multisets.EntrySet, java.util.AbstractCollection, java.util.Collection, java.util.Set
|
|
public boolean contains(Object obj) {
|
|
if (!(obj instanceof Multiset.Entry)) {
|
|
return false;
|
|
}
|
|
Multiset.Entry entry = (Multiset.Entry) obj;
|
|
Collection<V> collection = Keys.this.a.asMap().get(entry.a());
|
|
return collection != null && collection.size() == entry.getCount();
|
|
}
|
|
|
|
@Override // java.util.AbstractCollection, java.util.Collection, java.util.Set
|
|
public boolean isEmpty() {
|
|
return Keys.this.a.isEmpty();
|
|
}
|
|
|
|
@Override // java.util.AbstractCollection, java.util.Collection, java.lang.Iterable, java.util.Set
|
|
public Iterator<Multiset.Entry<K>> iterator() {
|
|
return Keys.this.entryIterator();
|
|
}
|
|
|
|
@Override // com.google.common.collect.Multisets.EntrySet, java.util.AbstractCollection, java.util.Collection, java.util.Set
|
|
public boolean remove(Object obj) {
|
|
if (!(obj instanceof Multiset.Entry)) {
|
|
return false;
|
|
}
|
|
Multiset.Entry entry = (Multiset.Entry) obj;
|
|
Collection<V> collection = Keys.this.a.asMap().get(entry.a());
|
|
if (collection == null || collection.size() != entry.getCount()) {
|
|
return false;
|
|
}
|
|
collection.clear();
|
|
return true;
|
|
}
|
|
|
|
@Override // java.util.AbstractCollection, java.util.Collection, java.util.Set
|
|
public int size() {
|
|
return Keys.this.distinctElements();
|
|
}
|
|
}
|
|
|
|
Keys(Multimap<K, V> multimap) {
|
|
this.a = multimap;
|
|
}
|
|
|
|
@Override // com.google.common.collect.AbstractMultiset, java.util.AbstractCollection, java.util.Collection
|
|
public void clear() {
|
|
this.a.clear();
|
|
}
|
|
|
|
@Override // com.google.common.collect.AbstractMultiset, java.util.AbstractCollection, java.util.Collection, com.google.common.collect.Multiset
|
|
public boolean contains(Object obj) {
|
|
return this.a.containsKey(obj);
|
|
}
|
|
|
|
@Override // com.google.common.collect.AbstractMultiset, com.google.common.collect.Multiset
|
|
public int count(Object obj) {
|
|
Collection collection = (Collection) Maps.e(this.a.asMap(), obj);
|
|
if (collection == null) {
|
|
return 0;
|
|
}
|
|
return collection.size();
|
|
}
|
|
|
|
@Override // com.google.common.collect.AbstractMultiset
|
|
Set<Multiset.Entry<K>> createEntrySet() {
|
|
return new KeysEntrySet();
|
|
}
|
|
|
|
@Override // com.google.common.collect.AbstractMultiset
|
|
int distinctElements() {
|
|
return this.a.asMap().size();
|
|
}
|
|
|
|
@Override // com.google.common.collect.AbstractMultiset, com.google.common.collect.Multiset
|
|
public Set<K> elementSet() {
|
|
return this.a.keySet();
|
|
}
|
|
|
|
@Override // com.google.common.collect.AbstractMultiset
|
|
Iterator<Multiset.Entry<K>> entryIterator() {
|
|
return new TransformedIterator<Map.Entry<K, Collection<V>>, Multiset.Entry<K>>(this, this.a.asMap().entrySet().iterator()) { // from class: com.google.common.collect.Multimaps.Keys.1
|
|
/* JADX INFO: Access modifiers changed from: package-private */
|
|
@Override // com.google.common.collect.TransformedIterator
|
|
public Multiset.Entry<K> a(final Map.Entry<K, Collection<V>> entry) {
|
|
return new Multisets.AbstractEntry<K>(this) { // from class: com.google.common.collect.Multimaps.Keys.1.1
|
|
@Override // com.google.common.collect.Multiset.Entry
|
|
public K a() {
|
|
return (K) entry.getKey();
|
|
}
|
|
|
|
@Override // com.google.common.collect.Multiset.Entry
|
|
public int getCount() {
|
|
return ((Collection) entry.getValue()).size();
|
|
}
|
|
};
|
|
}
|
|
};
|
|
}
|
|
|
|
@Override // com.google.common.collect.AbstractMultiset, java.util.AbstractCollection, java.util.Collection, java.lang.Iterable
|
|
public Iterator<K> iterator() {
|
|
return Maps.a(this.a.entries().iterator());
|
|
}
|
|
|
|
@Override // com.google.common.collect.AbstractMultiset, com.google.common.collect.Multiset
|
|
public int remove(Object obj, int i) {
|
|
CollectPreconditions.a(i, "occurrences");
|
|
if (i == 0) {
|
|
return count(obj);
|
|
}
|
|
Collection collection = (Collection) Maps.e(this.a.asMap(), obj);
|
|
if (collection == null) {
|
|
return 0;
|
|
}
|
|
int size = collection.size();
|
|
if (i >= size) {
|
|
collection.clear();
|
|
} else {
|
|
Iterator it = collection.iterator();
|
|
for (int i2 = 0; i2 < i; i2++) {
|
|
it.next();
|
|
it.remove();
|
|
}
|
|
}
|
|
return size;
|
|
}
|
|
}
|
|
|
|
public static <K, V> ListMultimap<K, V> a(Map<K, Collection<V>> map, Supplier<? extends List<V>> supplier) {
|
|
return new CustomListMultimap(map, supplier);
|
|
}
|
|
|
|
public static <K, V> SetMultimap<K, V> b(Map<K, Collection<V>> map, Supplier<? extends Set<V>> supplier) {
|
|
return new CustomSetMultimap(map, supplier);
|
|
}
|
|
|
|
static boolean a(Multimap<?, ?> multimap, Object obj) {
|
|
if (obj == multimap) {
|
|
return true;
|
|
}
|
|
if (obj instanceof Multimap) {
|
|
return multimap.asMap().equals(((Multimap) obj).asMap());
|
|
}
|
|
return false;
|
|
}
|
|
}
|