Newer
Older
void-pack-super-server / work / decompile-ee3ecae0 / net / minecraft / server / EntitySlice.java
package net.minecraft.server;

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 java.util.stream.Collectors;
import java.util.stream.Stream;

public class EntitySlice<T> extends AbstractCollection<T> {

    private final Map<Class<?>, List<T>> a = Maps.newHashMap();
    private final Class<T> b;
    private final List<T> c = Lists.newArrayList();

    public EntitySlice(Class<T> oclass) {
        this.b = oclass;
        this.a.put(oclass, this.c);
    }

    public boolean add(T t0) {
        boolean flag = false;
        Iterator iterator = this.a.entrySet().iterator();

        while (iterator.hasNext()) {
            Entry<Class<?>, List<T>> entry = (Entry) iterator.next();

            if (((Class) entry.getKey()).isInstance(t0)) {
                flag |= ((List) entry.getValue()).add(t0);
            }
        }

        return flag;
    }

    public boolean remove(Object object) {
        boolean flag = false;
        Iterator iterator = this.a.entrySet().iterator();

        while (iterator.hasNext()) {
            Entry<Class<?>, List<T>> entry = (Entry) iterator.next();

            if (((Class) entry.getKey()).isInstance(object)) {
                List<T> list = (List) entry.getValue();

                flag |= list.remove(object);
            }
        }

        return flag;
    }

    public boolean contains(Object object) {
        return this.a(object.getClass()).contains(object);
    }

    public <S> Collection<S> a(Class<S> oclass) {
        if (!this.b.isAssignableFrom(oclass)) {
            throw new IllegalArgumentException("Don't know how to search for " + oclass);
        } else {
            List<T> list = (List) this.a.computeIfAbsent(oclass, (oclass1) -> {
                Stream stream = this.c.stream();

                oclass1.getClass();
                return (List) stream.filter(oclass1::isInstance).collect(Collectors.toList());
            });

            return Collections.unmodifiableCollection(list);
        }
    }

    public Iterator<T> iterator() {
        return (Iterator) (this.c.isEmpty() ? Collections.emptyIterator() : Iterators.unmodifiableIterator(this.c.iterator()));
    }

    public int size() {
        return this.c.size();
    }
}