// 
// Decompiled by Procyon v0.6.0
// 

package com.hypixel.hytale.builtin.hytalegenerator;

import it.unimi.dsi.fastutil.ints.IntSets;
import it.unimi.dsi.fastutil.ints.IntOpenHashSet;
import it.unimi.dsi.fastutil.ints.IntArraySet;
import javax.annotation.Nonnull;
import java.util.List;
import it.unimi.dsi.fastutil.ints.IntSet;
import com.hypixel.hytale.builtin.hytalegenerator.material.Material;
import java.util.function.Predicate;

public class MaterialSet implements Predicate<Material>
{
    private final boolean isInclusive;
    private final IntSet mask;
    
    public MaterialSet() {
        this.isInclusive = true;
        this.mask = IntSet.of();
    }
    
    public MaterialSet(final boolean isInclusive, @Nonnull final List<Material> elements) {
        this.isInclusive = isInclusive;
        final int size = elements.size();
        if (size == 0) {
            this.mask = IntSet.of();
            return;
        }
        if (size != 1) {
            final IntSet innerSet = (IntSet)((size <= 4) ? new IntArraySet(size) : new IntOpenHashSet(size, 0.99f));
            for (int i = 0; i < size; ++i) {
                final Material element = elements.get(i);
                if (element == null) {
                    throw new IllegalArgumentException("element array contains null at index " + i);
                }
                innerSet.add(element.hashMaterialIds());
            }
            this.mask = IntSets.unmodifiable(innerSet);
            return;
        }
        final Material first = elements.getFirst();
        if (first == null) {
            throw new IllegalArgumentException("element array contains null at index 0");
        }
        this.mask = IntSet.of(first.hashMaterialIds());
    }
    
    @Override
    public boolean test(final Material value) {
        if (value == null) {
            return false;
        }
        final boolean contains = this.mask.contains(value.hashMaterialIds());
        return (contains && this.isInclusive) || (!contains && !this.isInclusive);
    }
    
    public boolean test(final int hashMaterialIds) {
        final boolean contains = this.mask.contains(hashMaterialIds);
        return (contains && this.isInclusive) || (!contains && !this.isInclusive);
    }
}
