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

package it.unimi.dsi.fastutil.objects;

import java.util.Iterator;
import java.util.Spliterator;
import java.util.Collection;
import it.unimi.dsi.fastutil.Size64;
import java.util.Set;

public interface ReferenceSet<K> extends ReferenceCollection<K>, Set<K>
{
    ObjectIterator<K> iterator();
    
    default ObjectSpliterator<K> spliterator() {
        return ObjectSpliterators.asSpliterator(this.iterator(), Size64.sizeOf(this), 65);
    }
    
    default <K> ReferenceSet<K> of() {
        return ReferenceSets.UNMODIFIABLE_EMPTY_SET;
    }
    
    default <K> ReferenceSet<K> of(final K e) {
        return ReferenceSets.singleton(e);
    }
    
    default <K> ReferenceSet<K> of(final K e0, final K e1) {
        final ReferenceArraySet<K> innerSet = new ReferenceArraySet<K>(2);
        innerSet.add(e0);
        if (!innerSet.add(e1)) {
            throw new IllegalArgumentException("Duplicate element: " + e1);
        }
        return ReferenceSets.unmodifiable((ReferenceSet<? extends K>)innerSet);
    }
    
    default <K> ReferenceSet<K> of(final K e0, final K e1, final K e2) {
        final ReferenceArraySet<K> innerSet = new ReferenceArraySet<K>(3);
        innerSet.add(e0);
        if (!innerSet.add(e1)) {
            throw new IllegalArgumentException("Duplicate element: " + e1);
        }
        if (!innerSet.add(e2)) {
            throw new IllegalArgumentException("Duplicate element: " + e2);
        }
        return ReferenceSets.unmodifiable((ReferenceSet<? extends K>)innerSet);
    }
    
    @SafeVarargs
    default <K> ReferenceSet<K> of(final K... a) {
        switch (a.length) {
            case 0: {
                return of();
            }
            case 1: {
                return of(a[0]);
            }
            case 2: {
                return of(a[0], a[1]);
            }
            case 3: {
                return of(a[0], a[1], a[2]);
            }
            default: {
                final ReferenceSet<K> innerSet = (ReferenceSet<K>)((a.length <= 4) ? new ReferenceArraySet<Object>(a.length) : new ReferenceOpenHashSet<Object>(a.length));
                for (final K element : a) {
                    if (!innerSet.add(element)) {
                        throw new IllegalArgumentException("Duplicate element: " + element);
                    }
                }
                return ReferenceSets.unmodifiable((ReferenceSet<? extends K>)innerSet);
            }
        }
    }
}
