package sk.stuba.fiit.perconik.utilities; import java.util.Collection; import java.util.EnumSet; import java.util.HashSet; import java.util.Iterator; import java.util.LinkedHashSet; import java.util.Set; import java.util.TreeSet; import com.google.common.base.Equivalence; import com.google.common.collect.Iterators; import com.google.common.collect.Sets; import static com.google.common.collect.Sets.newHashSetWithExpectedSize; import static com.google.common.collect.Sets.newLinkedHashSetWithExpectedSize; /** * Static utility methods pertaining to {@code Set} instances. * * @author Pavol Zbell * @since 1.0 */ public final class MoreSets { private MoreSets() {} public static <E> HashSet<Equivalence.Wrapper<E>> newHashSet(final Equivalence<? super E> equivalence, final Iterable<? extends E> elements) { HashSet<Equivalence.Wrapper<E>> set = newHashSetExpectedFor(elements); wrapAll(set, equivalence, elements); return set; } public static <E> HashSet<E> newHashSet(final Iterable<Equivalence.Wrapper<? extends E>> elements) { HashSet<E> set = newHashSetExpectedFor(elements); unwrapAll(set, elements); return set; } public static <E> HashSet<E> newHashSet(final Iterable<? extends E> a, final Iterable<? extends E> b) { HashSet<E> set = Sets.newHashSet(a); Iterators.addAll(set, b.iterator()); return set; } public static <E> HashSet<E> newHashSet(final Iterator<? extends E> a, final Iterator<? extends E> b) { HashSet<E> set = Sets.newHashSet(); Iterators.addAll(set, a); Iterators.addAll(set, b); return set; } public static <E> HashSet<E> newHashSetExpectedFor(final Iterable<?> iterable) { if (iterable instanceof Collection) { return newHashSetWithExpectedSize(((Collection<?>) iterable).size()); } return Sets.newHashSet(); } public static <E> LinkedHashSet<Equivalence.Wrapper<E>> newLinkedHashSet(final Equivalence<? super E> equivalence, final Iterable<? extends E> elements) { LinkedHashSet<Equivalence.Wrapper<E>> set = newLinkedHashSetExpectedFor(elements); wrapAll(set, equivalence, elements); return set; } public static <E> LinkedHashSet<E> newLinkedHashSet(final Iterable<Equivalence.Wrapper<? extends E>> elements) { LinkedHashSet<E> set = newLinkedHashSetExpectedFor(elements); unwrapAll(set, elements); return set; } public static <E> LinkedHashSet<E> newLinkedHashSet(final Iterable<? extends E> a, final Iterable<? extends E> b) { LinkedHashSet<E> set = Sets.newLinkedHashSet(a); Iterators.addAll(set, b.iterator()); return set; } public static <E> LinkedHashSet<E> newLinkedHashSet(final Iterator<? extends E> a, final Iterator<? extends E> b) { LinkedHashSet<E> set = Sets.newLinkedHashSet(); Iterators.addAll(set, a); Iterators.addAll(set, b); return set; } public static <E> LinkedHashSet<E> newLinkedHashSetExpectedFor(final Iterable<?> iterable) { if (iterable instanceof Collection) { return newLinkedHashSetWithExpectedSize(((Collection<?>) iterable).size()); } return Sets.newLinkedHashSet(); } public static <E extends Enum<E>> EnumSet<E> newEnumSet(final Iterable<E> elements) { return EnumSet.copyOf(MoreLists.toList(elements)); } public static <E> void wrapAll(final Set<Equivalence.Wrapper<E>> set, final Equivalence<? super E> equivalence, final Iterable<? extends E> elements) { for (E element: elements) { set.add(equivalence.wrap(element)); } } public static <E> void unwrapAll(final Set<E> set, final Iterable<Equivalence.Wrapper<? extends E>> elements) { for (Equivalence.Wrapper<? extends E> element: elements) { set.add(element.get()); } } public static <E> Set<E> toSet(final Iterable<E> elements) { return elements instanceof Set ? (Set<E>) elements : Sets.newHashSet(elements); } public static <E> HashSet<E> toHashSet(final Iterable<E> elements) { return elements instanceof HashSet ? (HashSet<E>) elements : Sets.newHashSet(elements); } public static <E> LinkedHashSet<E> toLinkedHashSet(final Iterable<E> elements) { return elements instanceof LinkedHashSet ? (LinkedHashSet<E>) elements : Sets.newLinkedHashSet(elements); } public static <E extends Comparable<E>> TreeSet<E> toTreeSet(final Iterable<E> elements) { return elements instanceof TreeSet ? (TreeSet<E>) elements : Sets.newTreeSet(elements); } public static <E extends Enum<E>> EnumSet<E> toEnumSet(final Iterable<E> elements) { return elements instanceof EnumSet ? (EnumSet<E>) elements : newEnumSet(elements); } }