package net.minecraft.util; import com.google.common.collect.ImmutableList; import com.google.common.collect.Iterators; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import java.util.AbstractCollection; import java.util.Collection; import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import net.minecraft.Util; public class ClassInstanceMultiMap extends AbstractCollection { private final Map, List> byClass = Maps., List>newHashMap(); private final Class baseClass; private final List allInstances = Lists.newArrayList(); public ClassInstanceMultiMap(Class baseClass) { this.baseClass = baseClass; this.byClass.put(baseClass, this.allInstances); } public boolean add(T object) { boolean bl = false; for (Entry, List> entry : this.byClass.entrySet()) { if (((Class)entry.getKey()).isInstance(object)) { bl |= ((List)entry.getValue()).add(object); } } return bl; } public boolean remove(Object object) { boolean bl = false; for (Entry, List> entry : this.byClass.entrySet()) { if (((Class)entry.getKey()).isInstance(object)) { List list = (List)entry.getValue(); bl |= list.remove(object); } } return bl; } public boolean contains(Object object) { return this.find(object.getClass()).contains(object); } public Collection find(Class type) { if (!this.baseClass.isAssignableFrom(type)) { throw new IllegalArgumentException("Don't know how to search for " + type); } else { List list = (List)this.byClass .computeIfAbsent(type, class_ -> (List)this.allInstances.stream().filter(class_::isInstance).collect(Util.toMutableList())); return Collections.unmodifiableCollection(list); } } public Iterator iterator() { return (Iterator)(this.allInstances.isEmpty() ? Collections.emptyIterator() : Iterators.unmodifiableIterator(this.allInstances.iterator())); } public List getAllInstances() { return ImmutableList.copyOf(this.allInstances); } public int size() { return this.allInstances.size(); } }