All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.gs.collections.impl.set.immutable.AbstractImmutableSet Maven / Gradle / Ivy

/*
 * Copyright 2014 Goldman Sachs.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.gs.collections.impl.set.immutable;

import java.util.Iterator;
import java.util.Set;

import com.gs.collections.api.LazyIterable;
import com.gs.collections.api.block.function.Function;
import com.gs.collections.api.block.function.Function2;
import com.gs.collections.api.block.function.primitive.BooleanFunction;
import com.gs.collections.api.block.function.primitive.ByteFunction;
import com.gs.collections.api.block.function.primitive.CharFunction;
import com.gs.collections.api.block.function.primitive.DoubleFunction;
import com.gs.collections.api.block.function.primitive.FloatFunction;
import com.gs.collections.api.block.function.primitive.IntFunction;
import com.gs.collections.api.block.function.primitive.LongFunction;
import com.gs.collections.api.block.function.primitive.ShortFunction;
import com.gs.collections.api.block.predicate.Predicate;
import com.gs.collections.api.block.predicate.Predicate2;
import com.gs.collections.api.collection.MutableCollection;
import com.gs.collections.api.map.ImmutableMap;
import com.gs.collections.api.multimap.MutableMultimap;
import com.gs.collections.api.multimap.set.ImmutableSetMultimap;
import com.gs.collections.api.partition.set.PartitionImmutableSet;
import com.gs.collections.api.partition.set.PartitionMutableSet;
import com.gs.collections.api.set.ImmutableSet;
import com.gs.collections.api.set.SetIterable;
import com.gs.collections.api.set.UnsortedSetIterable;
import com.gs.collections.api.set.primitive.ImmutableBooleanSet;
import com.gs.collections.api.set.primitive.ImmutableByteSet;
import com.gs.collections.api.set.primitive.ImmutableCharSet;
import com.gs.collections.api.set.primitive.ImmutableDoubleSet;
import com.gs.collections.api.set.primitive.ImmutableFloatSet;
import com.gs.collections.api.set.primitive.ImmutableIntSet;
import com.gs.collections.api.set.primitive.ImmutableLongSet;
import com.gs.collections.api.set.primitive.ImmutableShortSet;
import com.gs.collections.api.tuple.Pair;
import com.gs.collections.impl.block.factory.Functions;
import com.gs.collections.impl.block.factory.Predicates;
import com.gs.collections.impl.block.procedure.CollectIfProcedure;
import com.gs.collections.impl.block.procedure.CollectProcedure;
import com.gs.collections.impl.block.procedure.FlatCollectProcedure;
import com.gs.collections.impl.block.procedure.MultimapEachPutProcedure;
import com.gs.collections.impl.block.procedure.MultimapPutProcedure;
import com.gs.collections.impl.block.procedure.PartitionPredicate2Procedure;
import com.gs.collections.impl.block.procedure.PartitionProcedure;
import com.gs.collections.impl.block.procedure.RejectProcedure;
import com.gs.collections.impl.block.procedure.SelectInstancesOfProcedure;
import com.gs.collections.impl.block.procedure.SelectProcedure;
import com.gs.collections.impl.block.procedure.primitive.CollectBooleanProcedure;
import com.gs.collections.impl.block.procedure.primitive.CollectByteProcedure;
import com.gs.collections.impl.block.procedure.primitive.CollectCharProcedure;
import com.gs.collections.impl.block.procedure.primitive.CollectDoubleProcedure;
import com.gs.collections.impl.block.procedure.primitive.CollectFloatProcedure;
import com.gs.collections.impl.block.procedure.primitive.CollectIntProcedure;
import com.gs.collections.impl.block.procedure.primitive.CollectLongProcedure;
import com.gs.collections.impl.block.procedure.primitive.CollectShortProcedure;
import com.gs.collections.impl.collection.immutable.AbstractImmutableCollection;
import com.gs.collections.impl.factory.Sets;
import com.gs.collections.impl.list.mutable.FastList;
import com.gs.collections.impl.multimap.set.UnifiedSetMultimap;
import com.gs.collections.impl.partition.set.PartitionUnifiedSet;
import com.gs.collections.impl.set.mutable.UnifiedSet;
import com.gs.collections.impl.set.mutable.primitive.BooleanHashSet;
import com.gs.collections.impl.set.mutable.primitive.ByteHashSet;
import com.gs.collections.impl.set.mutable.primitive.CharHashSet;
import com.gs.collections.impl.set.mutable.primitive.DoubleHashSet;
import com.gs.collections.impl.set.mutable.primitive.FloatHashSet;
import com.gs.collections.impl.set.mutable.primitive.IntHashSet;
import com.gs.collections.impl.set.mutable.primitive.LongHashSet;
import com.gs.collections.impl.set.mutable.primitive.ShortHashSet;
import com.gs.collections.impl.utility.internal.SetIterables;
import net.jcip.annotations.Immutable;

/**
 * This class is the parent class for all ImmutableLists.  All implementations of ImmutableList must implement the List
 * interface so anArrayList.equals(anImmutableList) can return true when the contents and order are the same.
 */
@Immutable
public abstract class AbstractImmutableSet extends AbstractImmutableCollection
        implements ImmutableSet, Set
{
    public Set castToSet()
    {
        return this;
    }

    protected int nullSafeHashCode(Object element)
    {
        return element == null ? 0 : element.hashCode();
    }

    public ImmutableSet newWith(T element)
    {
        if (!this.contains(element))
        {
            UnifiedSet result = UnifiedSet.newSet(this);
            result.add(element);
            return result.toImmutable();
        }
        return this;
    }

    public ImmutableSet newWithout(T element)
    {
        if (this.contains(element))
        {
            UnifiedSet result = UnifiedSet.newSet(this);
            result.remove(element);
            return result.toImmutable();
        }
        return this;
    }

    public ImmutableSet newWithAll(Iterable elements)
    {
        UnifiedSet result = UnifiedSet.newSet(elements);
        result.addAll(this);
        return result.toImmutable();
    }

    public ImmutableSet newWithoutAll(Iterable elements)
    {
        UnifiedSet result = UnifiedSet.newSet(this);
        this.removeAllFrom(elements, result);
        return result.toImmutable();
    }

    public abstract T getFirst();

    public abstract T getLast();

    public ImmutableSet select(Predicate predicate)
    {
        FastList intermediateResult = FastList.newList();
        this.forEach(new SelectProcedure(predicate, intermediateResult));
        return Sets.immutable.ofAll(intermediateResult);
    }

    public 

ImmutableSet selectWith(Predicate2 predicate, P parameter) { return this.select(Predicates.bind(predicate, parameter)); } public ImmutableSet reject(Predicate predicate) { FastList intermediateResult = FastList.newList(); this.forEach(new RejectProcedure(predicate, intermediateResult)); return Sets.immutable.ofAll(intermediateResult); } public

ImmutableSet rejectWith(Predicate2 predicate, P parameter) { return this.reject(Predicates.bind(predicate, parameter)); } public PartitionImmutableSet partition(Predicate predicate) { PartitionMutableSet partitionUnifiedSet = new PartitionUnifiedSet(); this.forEach(new PartitionProcedure(predicate, partitionUnifiedSet)); return partitionUnifiedSet.toImmutable(); } public

PartitionImmutableSet partitionWith(Predicate2 predicate, P parameter) { PartitionMutableSet partitionUnifiedSet = new PartitionUnifiedSet(); this.forEach(new PartitionPredicate2Procedure(predicate, parameter, partitionUnifiedSet)); return partitionUnifiedSet.toImmutable(); } public ImmutableSet selectInstancesOf(Class clazz) { UnifiedSet result = UnifiedSet.newSet(this.size()); this.forEach(new SelectInstancesOfProcedure(clazz, result)); return result.toImmutable(); } public ImmutableSet collect(Function function) { UnifiedSet result = UnifiedSet.newSet(); this.forEach(new CollectProcedure(function, result)); return result.toImmutable(); } public ImmutableBooleanSet collectBoolean(BooleanFunction booleanFunction) { BooleanHashSet result = new BooleanHashSet(); this.forEach(new CollectBooleanProcedure(booleanFunction, result)); return result.toImmutable(); } public ImmutableByteSet collectByte(ByteFunction byteFunction) { ByteHashSet result = new ByteHashSet(this.size()); this.forEach(new CollectByteProcedure(byteFunction, result)); return result.toImmutable(); } public ImmutableCharSet collectChar(CharFunction charFunction) { CharHashSet result = new CharHashSet(this.size()); this.forEach(new CollectCharProcedure(charFunction, result)); return result.toImmutable(); } public ImmutableDoubleSet collectDouble(DoubleFunction doubleFunction) { DoubleHashSet result = new DoubleHashSet(this.size()); this.forEach(new CollectDoubleProcedure(doubleFunction, result)); return result.toImmutable(); } public ImmutableFloatSet collectFloat(FloatFunction floatFunction) { FloatHashSet result = new FloatHashSet(this.size()); this.forEach(new CollectFloatProcedure(floatFunction, result)); return result.toImmutable(); } public ImmutableIntSet collectInt(IntFunction intFunction) { IntHashSet result = new IntHashSet(this.size()); this.forEach(new CollectIntProcedure(intFunction, result)); return result.toImmutable(); } public ImmutableLongSet collectLong(LongFunction longFunction) { LongHashSet result = new LongHashSet(this.size()); this.forEach(new CollectLongProcedure(longFunction, result)); return result.toImmutable(); } public ImmutableShortSet collectShort(ShortFunction shortFunction) { ShortHashSet result = new ShortHashSet(this.size()); this.forEach(new CollectShortProcedure(shortFunction, result)); return result.toImmutable(); } public ImmutableSet collectWith(Function2 function, P parameter) { return this.collect(Functions.bind(function, parameter)); } public ImmutableSet collectIf(Predicate predicate, Function function) { UnifiedSet result = UnifiedSet.newSet(); this.forEach(new CollectIfProcedure(result, function, predicate)); return result.toImmutable(); } public ImmutableSet flatCollect(Function> function) { UnifiedSet result = UnifiedSet.newSet(); this.forEach(new FlatCollectProcedure(function, result)); return result.toImmutable(); } public ImmutableSet toImmutable() { return this; } protected abstract class ImmutableSetIterator implements Iterator { private int next; // next entry to return, defaults to 0 protected abstract T getElement(int i); public boolean hasNext() { return this.next < AbstractImmutableSet.this.size(); } public T next() { return this.getElement(this.next++); } public void remove() { throw new UnsupportedOperationException("Cannot remove from an ImmutableSet"); } } public ImmutableSetMultimap groupBy(Function function) { return this.groupBy(function, UnifiedSetMultimap.newMultimap()).toImmutable(); } @Override public > R groupBy(Function function, R target) { this.forEach(MultimapPutProcedure.on(target, function)); return target; } public ImmutableSetMultimap groupByEach(Function> function) { return this.groupByEach(function, UnifiedSetMultimap.newMultimap()).toImmutable(); } @Override public > R groupByEach(Function> function, R target) { this.forEach(MultimapEachPutProcedure.on(target, function)); return target; } public ImmutableMap groupByUniqueKey(Function function) { throw new UnsupportedOperationException(this.getClass().getSimpleName() + ".groupByUniqueKey() not implemented yet"); } public ImmutableSet> zip(Iterable that) { return this.zip(that, UnifiedSet.>newSet()).toImmutable(); } public ImmutableSet> zipWithIndex() { return this.zipWithIndex(UnifiedSet.>newSet()).toImmutable(); } @Override protected MutableCollection newMutable(int size) { return UnifiedSet.newSet(size); } public ImmutableSet union(SetIterable set) { return SetIterables.union(this, set).toImmutable(); } public > R unionInto(SetIterable set, R targetSet) { return SetIterables.unionInto(this, set, targetSet); } public ImmutableSet intersect(SetIterable set) { return SetIterables.intersect(this, set).toImmutable(); } public > R intersectInto(SetIterable set, R targetSet) { return SetIterables.intersectInto(this, set, targetSet); } public ImmutableSet difference(SetIterable subtrahendSet) { return SetIterables.difference(this, subtrahendSet).toImmutable(); } public > R differenceInto(SetIterable subtrahendSet, R targetSet) { return SetIterables.differenceInto(this, subtrahendSet, targetSet); } public ImmutableSet symmetricDifference(SetIterable setB) { return SetIterables.symmetricDifference(this, setB).toImmutable(); } public > R symmetricDifferenceInto(SetIterable set, R targetSet) { return SetIterables.symmetricDifferenceInto(this, set, targetSet); } public boolean isSubsetOf(SetIterable candidateSuperset) { return SetIterables.isSubsetOf(this, candidateSuperset); } public boolean isProperSubsetOf(SetIterable candidateSuperset) { return SetIterables.isProperSubsetOf(this, candidateSuperset); } public ImmutableSet> powerSet() { return (ImmutableSet>) (ImmutableSet) SetIterables.immutablePowerSet(this); } public LazyIterable> cartesianProduct(SetIterable set) { return SetIterables.cartesianProduct(this, set); } }