package net.minecraft.server;
import com.google.common.collect.Iterators;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import com.koloboke.collect.map.hash.HashObjObjMaps;
import java.util.AbstractSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class EntitySlice<T> extends AbstractSet<T> {
private static final Set<Class<?>> a = Sets.newConcurrentHashSet(); // CraftBukkit
private final Map<Class<?>, List<T>> b = HashObjObjMaps.newMutableMap();
private final Set<Class<?>> c = Sets.newIdentityHashSet();
private final Class<T> d;
private final List<T> e = Lists.newArrayList();
public EntitySlice(Class<T> oclass) {
this.d = oclass;
this.c.add(oclass);
this.b.put(oclass, this.e);
Iterator iterator = EntitySlice.a.iterator();
while (iterator.hasNext()) {
Class oclass1 = (Class) iterator.next();
this.a(oclass1);
}
}
protected void a(Class<?> oclass) {
EntitySlice.a.add(oclass);
Iterator iterator = this.e.iterator();
while (iterator.hasNext()) {
Object object = iterator.next();
if (oclass.isAssignableFrom(object.getClass())) {
this.a((T) object, oclass);
}
}
this.c.add(oclass);
}
protected Class<?> b(Class<?> oclass) {
if (this.d.isAssignableFrom(oclass)) {
if (!this.c.contains(oclass)) {
this.a(oclass);
}
return oclass;
} else {
throw new IllegalArgumentException("Don\'t know how to search for " + oclass);
}
}
@Override
public boolean add(T t0) {
Iterator iterator = this.c.iterator();
while (iterator.hasNext()) {
Class oclass = (Class) iterator.next();
if (oclass.isAssignableFrom(t0.getClass())) {
this.a(t0, oclass);
}
}
return true;
}
private void a(T t0, Class<?> oclass) {
List list = this.b.get(oclass);
if (list == null) {
this.b.put(oclass, Lists.newArrayList(t0));
} else {
list.add(t0);
}
}
@Override
public boolean remove(Object object) {
Object object1 = object;
boolean flag = false;
Iterator iterator = this.c.iterator();
while (iterator.hasNext()) {
Class oclass = (Class) iterator.next();
if (oclass.isAssignableFrom(object1.getClass())) {
List list = this.b.get(oclass);
if (list != null && list.remove(object1)) {
flag = true;
}
}
}
return flag;
}
@Override
public boolean contains(Object object) {
return Iterators.contains(this.c(object.getClass()).iterator(), object);
}
public <S> Iterable<S> c(final Class<S> oclass) {
return new Iterable() {
@Override
public Iterator<S> iterator() {
List list = EntitySlice.this.b.get(EntitySlice.this.b(oclass));
if (list == null) {
return Iterators.emptyIterator();
} else {
Iterator iterator = list.iterator();
return Iterators.filter(iterator, oclass);
}
}
};
}
@Override
public Iterator<T> iterator() {
return this.e.isEmpty() ? Iterators.<T>emptyIterator() : Iterators.unmodifiableIterator(this.e.iterator());
}
@Override
public int size() {
return this.e.size();
}
}