001    /*
002     * Copyright (C) 2007 The Guava Authors
003     *
004     * Licensed under the Apache License, Version 2.0 (the "License");
005     * you may not use this file except in compliance with the License.
006     * You may obtain a copy of the License at
007     *
008     * http://www.apache.org/licenses/LICENSE-2.0
009     *
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS,
012     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013     * See the License for the specific language governing permissions and
014     * limitations under the License.
015     */
016    
017    package com.google.common.collect;
018    
019    import static com.google.common.base.Preconditions.checkArgument;
020    import static com.google.common.base.Preconditions.checkNotNull;
021    
022    import com.google.common.annotations.Beta;
023    import com.google.common.annotations.GwtCompatible;
024    import com.google.common.annotations.GwtIncompatible;
025    import com.google.common.base.Predicate;
026    import com.google.common.base.Predicates;
027    import com.google.common.collect.Collections2.FilteredCollection;
028    import com.google.common.math.IntMath;
029    
030    import java.io.IOException;
031    import java.io.ObjectInputStream;
032    import java.io.Serializable;
033    import java.util.AbstractSet;
034    import java.util.Arrays;
035    import java.util.Collection;
036    import java.util.Collections;
037    import java.util.Comparator;
038    import java.util.EnumSet;
039    import java.util.HashSet;
040    import java.util.Iterator;
041    import java.util.LinkedHashSet;
042    import java.util.List;
043    import java.util.Map;
044    import java.util.NavigableSet;
045    import java.util.NoSuchElementException;
046    import java.util.Set;
047    import java.util.SortedSet;
048    import java.util.TreeSet;
049    import java.util.concurrent.CopyOnWriteArraySet;
050    
051    import javax.annotation.Nullable;
052    
053    /**
054     * Static utility methods pertaining to {@link Set} instances. Also see this
055     * class's counterparts {@link Lists} and {@link Maps}.
056     *
057     * <p>See the Guava User Guide article on <a href=
058     * "http://code.google.com/p/guava-libraries/wiki/CollectionUtilitiesExplained#Sets">
059     * {@code Sets}</a>.
060     *
061     * @author Kevin Bourrillion
062     * @author Jared Levy
063     * @author Chris Povirk
064     * @since 2.0 (imported from Google Collections Library)
065     */
066    @GwtCompatible(emulated = true)
067    public final class Sets {
068      private Sets() {}
069    
070      /**
071       * {@link AbstractSet} substitute without the potentially-quadratic
072       * {@code removeAll} implementation.
073       */
074      abstract static class ImprovedAbstractSet<E> extends AbstractSet<E> {
075        @Override
076        public boolean removeAll(Collection<?> c) {
077          return removeAllImpl(this, c);
078        }
079    
080        @Override
081        public boolean retainAll(Collection<?> c) {
082          return super.retainAll(checkNotNull(c)); // GWT compatibility
083        }
084      }
085    
086      /**
087       * Returns an immutable set instance containing the given enum elements.
088       * Internally, the returned set will be backed by an {@link EnumSet}.
089       *
090       * <p>The iteration order of the returned set follows the enum's iteration
091       * order, not the order in which the elements are provided to the method.
092       *
093       * @param anElement one of the elements the set should contain
094       * @param otherElements the rest of the elements the set should contain
095       * @return an immutable set containing those elements, minus duplicates
096       */
097      // http://code.google.com/p/google-web-toolkit/issues/detail?id=3028
098      @GwtCompatible(serializable = true)
099      public static <E extends Enum<E>> ImmutableSet<E> immutableEnumSet(
100          E anElement, E... otherElements) {
101        return new ImmutableEnumSet<E>(EnumSet.of(anElement, otherElements));
102      }
103    
104      /**
105       * Returns an immutable set instance containing the given enum elements.
106       * Internally, the returned set will be backed by an {@link EnumSet}.
107       *
108       * <p>The iteration order of the returned set follows the enum's iteration
109       * order, not the order in which the elements appear in the given collection.
110       *
111       * @param elements the elements, all of the same {@code enum} type, that the
112       *     set should contain
113       * @return an immutable set containing those elements, minus duplicates
114       */
115      // http://code.google.com/p/google-web-toolkit/issues/detail?id=3028
116      @GwtCompatible(serializable = true)
117      public static <E extends Enum<E>> ImmutableSet<E> immutableEnumSet(
118          Iterable<E> elements) {
119        Iterator<E> iterator = elements.iterator();
120        if (!iterator.hasNext()) {
121          return ImmutableSet.of();
122        }
123        if (elements instanceof EnumSet) {
124          EnumSet<E> enumSetClone = EnumSet.copyOf((EnumSet<E>) elements);
125          return new ImmutableEnumSet<E>(enumSetClone);
126        }
127        E first = iterator.next();
128        EnumSet<E> set = EnumSet.of(first);
129        while (iterator.hasNext()) {
130          set.add(iterator.next());
131        }
132        return new ImmutableEnumSet<E>(set);
133      }
134    
135      /**
136       * Returns a new {@code EnumSet} instance containing the given elements.
137       * Unlike {@link EnumSet#copyOf(Collection)}, this method does not produce an
138       * exception on an empty collection, and it may be called on any iterable, not
139       * just a {@code Collection}.
140       */
141      public static <E extends Enum<E>> EnumSet<E> newEnumSet(Iterable<E> iterable,
142          Class<E> elementType) {
143        /*
144         * TODO(cpovirk): noneOf() and addAll() will both throw
145         * NullPointerExceptions when appropriate. However, NullPointerTester will
146         * fail on this method because it passes in Class.class instead of an enum
147         * type. This means that, when iterable is null but elementType is not,
148         * noneOf() will throw a ClassCastException before addAll() has a chance to
149         * throw a NullPointerException. NullPointerTester considers this a failure.
150         * Ideally the test would be fixed, but it would require a special case for
151         * Class<E> where E extends Enum. Until that happens (if ever), leave
152         * checkNotNull() here. For now, contemplate the irony that checking
153         * elementType, the problem argument, is harmful, while checking iterable,
154         * the innocent bystander, is effective.
155         */
156        checkNotNull(iterable);
157        EnumSet<E> set = EnumSet.noneOf(elementType);
158        Iterables.addAll(set, iterable);
159        return set;
160      }
161    
162      // HashSet
163    
164      /**
165       * Creates a <i>mutable</i>, empty {@code HashSet} instance.
166       *
167       * <p><b>Note:</b> if mutability is not required, use {@link
168       * ImmutableSet#of()} instead.
169       *
170       * <p><b>Note:</b> if {@code E} is an {@link Enum} type, use {@link
171       * EnumSet#noneOf} instead.
172       *
173       * @return a new, empty {@code HashSet}
174       */
175      public static <E> HashSet<E> newHashSet() {
176        return new HashSet<E>();
177      }
178    
179      /**
180       * Creates a <i>mutable</i> {@code HashSet} instance containing the given
181       * elements in unspecified order.
182       *
183       * <p><b>Note:</b> if mutability is not required and the elements are
184       * non-null, use an overload of {@link ImmutableSet#of()} (for varargs) or
185       * {@link ImmutableSet#copyOf(Object[])} (for an array) instead.
186       *
187       * <p><b>Note:</b> if {@code E} is an {@link Enum} type, use {@link
188       * EnumSet#of(Enum, Enum[])} instead.
189       *
190       * @param elements the elements that the set should contain
191       * @return a new {@code HashSet} containing those elements (minus duplicates)
192       */
193      public static <E> HashSet<E> newHashSet(E... elements) {
194        HashSet<E> set = newHashSetWithExpectedSize(elements.length);
195        Collections.addAll(set, elements);
196        return set;
197      }
198    
199      /**
200       * Creates a {@code HashSet} instance, with a high enough "initial capacity"
201       * that it <i>should</i> hold {@code expectedSize} elements without growth.
202       * This behavior cannot be broadly guaranteed, but it is observed to be true
203       * for OpenJDK 1.6. It also can't be guaranteed that the method isn't
204       * inadvertently <i>oversizing</i> the returned set.
205       *
206       * @param expectedSize the number of elements you expect to add to the
207       *        returned set
208       * @return a new, empty {@code HashSet} with enough capacity to hold {@code
209       *         expectedSize} elements without resizing
210       * @throws IllegalArgumentException if {@code expectedSize} is negative
211       */
212      public static <E> HashSet<E> newHashSetWithExpectedSize(int expectedSize) {
213        return new HashSet<E>(Maps.capacity(expectedSize));
214      }
215    
216      /**
217       * Creates a <i>mutable</i> {@code HashSet} instance containing the given
218       * elements in unspecified order.
219       *
220       * <p><b>Note:</b> if mutability is not required and the elements are
221       * non-null, use {@link ImmutableSet#copyOf(Iterable)} instead.
222       *
223       * <p><b>Note:</b> if {@code E} is an {@link Enum} type, use
224       * {@link #newEnumSet(Iterable, Class)} instead.
225       *
226       * @param elements the elements that the set should contain
227       * @return a new {@code HashSet} containing those elements (minus duplicates)
228       */
229      public static <E> HashSet<E> newHashSet(Iterable<? extends E> elements) {
230        return (elements instanceof Collection)
231            ? new HashSet<E>(Collections2.cast(elements))
232            : newHashSet(elements.iterator());
233      }
234    
235      /**
236       * Creates a <i>mutable</i> {@code HashSet} instance containing the given
237       * elements in unspecified order.
238       *
239       * <p><b>Note:</b> if mutability is not required and the elements are
240       * non-null, use {@link ImmutableSet#copyOf(Iterable)} instead.
241       *
242       * <p><b>Note:</b> if {@code E} is an {@link Enum} type, you should create an
243       * {@link EnumSet} instead.
244       *
245       * @param elements the elements that the set should contain
246       * @return a new {@code HashSet} containing those elements (minus duplicates)
247       */
248      public static <E> HashSet<E> newHashSet(Iterator<? extends E> elements) {
249        HashSet<E> set = newHashSet();
250        while (elements.hasNext()) {
251          set.add(elements.next());
252        }
253        return set;
254      }
255    
256      // LinkedHashSet
257    
258      /**
259       * Creates a <i>mutable</i>, empty {@code LinkedHashSet} instance.
260       *
261       * <p><b>Note:</b> if mutability is not required, use {@link
262       * ImmutableSet#of()} instead.
263       *
264       * @return a new, empty {@code LinkedHashSet}
265       */
266      public static <E> LinkedHashSet<E> newLinkedHashSet() {
267        return new LinkedHashSet<E>();
268      }
269    
270      /**
271       * Creates a {@code LinkedHashSet} instance, with a high enough "initial
272       * capacity" that it <i>should</i> hold {@code expectedSize} elements without
273       * growth. This behavior cannot be broadly guaranteed, but it is observed to
274       * be true for OpenJDK 1.6. It also can't be guaranteed that the method isn't
275       * inadvertently <i>oversizing</i> the returned set.
276       *
277       * @param expectedSize the number of elements you expect to add to the
278       *        returned set
279       * @return a new, empty {@code LinkedHashSet} with enough capacity to hold
280       *         {@code expectedSize} elements without resizing
281       * @throws IllegalArgumentException if {@code expectedSize} is negative
282       * @since 11.0
283       */
284      public static <E> LinkedHashSet<E> newLinkedHashSetWithExpectedSize(
285          int expectedSize) {
286        return new LinkedHashSet<E>(Maps.capacity(expectedSize));
287      }
288    
289      /**
290       * Creates a <i>mutable</i> {@code LinkedHashSet} instance containing the
291       * given elements in order.
292       *
293       * <p><b>Note:</b> if mutability is not required and the elements are
294       * non-null, use {@link ImmutableSet#copyOf(Iterable)} instead.
295       *
296       * @param elements the elements that the set should contain, in order
297       * @return a new {@code LinkedHashSet} containing those elements (minus
298       *     duplicates)
299       */
300      public static <E> LinkedHashSet<E> newLinkedHashSet(
301          Iterable<? extends E> elements) {
302        if (elements instanceof Collection) {
303          return new LinkedHashSet<E>(Collections2.cast(elements));
304        }
305        LinkedHashSet<E> set = newLinkedHashSet();
306        for (E element : elements) {
307          set.add(element);
308        }
309        return set;
310      }
311    
312      // TreeSet
313    
314      /**
315       * Creates a <i>mutable</i>, empty {@code TreeSet} instance sorted by the
316       * natural sort ordering of its elements.
317       *
318       * <p><b>Note:</b> if mutability is not required, use {@link
319       * ImmutableSortedSet#of()} instead.
320       *
321       * @return a new, empty {@code TreeSet}
322       */
323      public static <E extends Comparable> TreeSet<E> newTreeSet() {
324        return new TreeSet<E>();
325      }
326    
327      /**
328       * Creates a <i>mutable</i> {@code TreeSet} instance containing the given
329       * elements sorted by their natural ordering.
330       *
331       * <p><b>Note:</b> if mutability is not required, use {@link
332       * ImmutableSortedSet#copyOf(Iterable)} instead.
333       *
334       * <p><b>Note:</b> If {@code elements} is a {@code SortedSet} with an explicit
335       * comparator, this method has different behavior than
336       * {@link TreeSet#TreeSet(SortedSet)}, which returns a {@code TreeSet} with
337       * that comparator.
338       *
339       * @param elements the elements that the set should contain
340       * @return a new {@code TreeSet} containing those elements (minus duplicates)
341       */
342      public static <E extends Comparable> TreeSet<E> newTreeSet(
343          Iterable<? extends E> elements) {
344        TreeSet<E> set = newTreeSet();
345        for (E element : elements) {
346          set.add(element);
347        }
348        return set;
349      }
350    
351      /**
352       * Creates a <i>mutable</i>, empty {@code TreeSet} instance with the given
353       * comparator.
354       *
355       * <p><b>Note:</b> if mutability is not required, use {@code
356       * ImmutableSortedSet.orderedBy(comparator).build()} instead.
357       *
358       * @param comparator the comparator to use to sort the set
359       * @return a new, empty {@code TreeSet}
360       * @throws NullPointerException if {@code comparator} is null
361       */
362      public static <E> TreeSet<E> newTreeSet(Comparator<? super E> comparator) {
363        return new TreeSet<E>(checkNotNull(comparator));
364      }
365    
366      /**
367       * Creates an empty {@code Set} that uses identity to determine equality. It
368       * compares object references, instead of calling {@code equals}, to
369       * determine whether a provided object matches an element in the set. For
370       * example, {@code contains} returns {@code false} when passed an object that
371       * equals a set member, but isn't the same instance. This behavior is similar
372       * to the way {@code IdentityHashMap} handles key lookups.
373       *
374       * @since 8.0
375       */
376      public static <E> Set<E> newIdentityHashSet() {
377        return Sets.newSetFromMap(Maps.<E, Boolean>newIdentityHashMap());
378      }
379    
380      /**
381       * Creates an empty {@code CopyOnWriteArraySet} instance.
382       *
383       * <p><b>Note:</b> if you need an immutable empty {@link Set}, use
384       * {@link Collections#emptySet} instead.
385       *
386       * @return a new, empty {@code CopyOnWriteArraySet}
387       * @since 12.0
388       */
389      @GwtIncompatible("CopyOnWriteArraySet")
390      public static <E> CopyOnWriteArraySet<E> newCopyOnWriteArraySet() {
391        return new CopyOnWriteArraySet<E>();
392      }
393    
394      /**
395       * Creates a {@code CopyOnWriteArraySet} instance containing the given elements.
396       *
397       * @param elements the elements that the set should contain, in order
398       * @return a new {@code CopyOnWriteArraySet} containing those elements
399       * @since 12.0
400       */
401      @GwtIncompatible("CopyOnWriteArraySet")
402      public static <E> CopyOnWriteArraySet<E> newCopyOnWriteArraySet(
403          Iterable<? extends E> elements) {
404        // We copy elements to an ArrayList first, rather than incurring the
405        // quadratic cost of adding them to the COWAS directly.
406        Collection<? extends E> elementsCollection = (elements instanceof Collection)
407            ? Collections2.cast(elements)
408            : Lists.newArrayList(elements);
409        return new CopyOnWriteArraySet<E>(elementsCollection);
410      }
411    
412      /**
413       * Creates an {@code EnumSet} consisting of all enum values that are not in
414       * the specified collection. If the collection is an {@link EnumSet}, this
415       * method has the same behavior as {@link EnumSet#complementOf}. Otherwise,
416       * the specified collection must contain at least one element, in order to
417       * determine the element type. If the collection could be empty, use
418       * {@link #complementOf(Collection, Class)} instead of this method.
419       *
420       * @param collection the collection whose complement should be stored in the
421       *     enum set
422       * @return a new, modifiable {@code EnumSet} containing all values of the enum
423       *     that aren't present in the given collection
424       * @throws IllegalArgumentException if {@code collection} is not an
425       *     {@code EnumSet} instance and contains no elements
426       */
427      public static <E extends Enum<E>> EnumSet<E> complementOf(
428          Collection<E> collection) {
429        if (collection instanceof EnumSet) {
430          return EnumSet.complementOf((EnumSet<E>) collection);
431        }
432        checkArgument(!collection.isEmpty(),
433            "collection is empty; use the other version of this method");
434        Class<E> type = collection.iterator().next().getDeclaringClass();
435        return makeComplementByHand(collection, type);
436      }
437    
438      /**
439       * Creates an {@code EnumSet} consisting of all enum values that are not in
440       * the specified collection. This is equivalent to
441       * {@link EnumSet#complementOf}, but can act on any input collection, as long
442       * as the elements are of enum type.
443       *
444       * @param collection the collection whose complement should be stored in the
445       *     {@code EnumSet}
446       * @param type the type of the elements in the set
447       * @return a new, modifiable {@code EnumSet} initially containing all the
448       *     values of the enum not present in the given collection
449       */
450      public static <E extends Enum<E>> EnumSet<E> complementOf(
451          Collection<E> collection, Class<E> type) {
452        checkNotNull(collection);
453        return (collection instanceof EnumSet)
454            ? EnumSet.complementOf((EnumSet<E>) collection)
455            : makeComplementByHand(collection, type);
456      }
457    
458      private static <E extends Enum<E>> EnumSet<E> makeComplementByHand(
459          Collection<E> collection, Class<E> type) {
460        EnumSet<E> result = EnumSet.allOf(type);
461        result.removeAll(collection);
462        return result;
463      }
464    
465      /*
466       * Regarding newSetForMap() and SetFromMap:
467       *
468       * Written by Doug Lea with assistance from members of JCP JSR-166
469       * Expert Group and released to the public domain, as explained at
470       * http://creativecommons.org/licenses/publicdomain
471       */
472    
473      /**
474       * Returns a set backed by the specified map. The resulting set displays
475       * the same ordering, concurrency, and performance characteristics as the
476       * backing map. In essence, this factory method provides a {@link Set}
477       * implementation corresponding to any {@link Map} implementation. There is no
478       * need to use this method on a {@link Map} implementation that already has a
479       * corresponding {@link Set} implementation (such as {@link java.util.HashMap}
480       * or {@link java.util.TreeMap}).
481       *
482       * <p>Each method invocation on the set returned by this method results in
483       * exactly one method invocation on the backing map or its {@code keySet}
484       * view, with one exception. The {@code addAll} method is implemented as a
485       * sequence of {@code put} invocations on the backing map.
486       *
487       * <p>The specified map must be empty at the time this method is invoked,
488       * and should not be accessed directly after this method returns. These
489       * conditions are ensured if the map is created empty, passed directly
490       * to this method, and no reference to the map is retained, as illustrated
491       * in the following code fragment: <pre>  {@code
492       *
493       *   Set<Object> identityHashSet = Sets.newSetFromMap(
494       *       new IdentityHashMap<Object, Boolean>());}</pre>
495       *
496       * This method has the same behavior as the JDK 6 method
497       * {@code Collections.newSetFromMap()}. The returned set is serializable if
498       * the backing map is.
499       *
500       * @param map the backing map
501       * @return the set backed by the map
502       * @throws IllegalArgumentException if {@code map} is not empty
503       */
504      public static <E> Set<E> newSetFromMap(Map<E, Boolean> map) {
505        return new SetFromMap<E>(map);
506      }
507    
508      private static class SetFromMap<E> extends AbstractSet<E>
509          implements Set<E>, Serializable {
510        private final Map<E, Boolean> m; // The backing map
511        private transient Set<E> s; // Its keySet
512    
513        SetFromMap(Map<E, Boolean> map) {
514          checkArgument(map.isEmpty(), "Map is non-empty");
515          m = map;
516          s = map.keySet();
517        }
518    
519        @Override public void clear() {
520          m.clear();
521        }
522        @Override public int size() {
523          return m.size();
524        }
525        @Override public boolean isEmpty() {
526          return m.isEmpty();
527        }
528        @Override public boolean contains(Object o) {
529          return m.containsKey(o);
530        }
531        @Override public boolean remove(Object o) {
532          return m.remove(o) != null;
533        }
534        @Override public boolean add(E e) {
535          return m.put(e, Boolean.TRUE) == null;
536        }
537        @Override public Iterator<E> iterator() {
538          return s.iterator();
539        }
540        @Override public Object[] toArray() {
541          return s.toArray();
542        }
543        @Override public <T> T[] toArray(T[] a) {
544          return s.toArray(a);
545        }
546        @Override public String toString() {
547          return s.toString();
548        }
549        @Override public int hashCode() {
550          return s.hashCode();
551        }
552        @Override public boolean equals(@Nullable Object object) {
553          return this == object || this.s.equals(object);
554        }
555        @Override public boolean containsAll(Collection<?> c) {
556          return s.containsAll(c);
557        }
558        @Override public boolean removeAll(Collection<?> c) {
559          return s.removeAll(c);
560        }
561        @Override public boolean retainAll(Collection<?> c) {
562          return s.retainAll(c);
563        }
564    
565        // addAll is the only inherited implementation
566        @GwtIncompatible("not needed in emulated source")
567        private static final long serialVersionUID = 0;
568    
569        @GwtIncompatible("java.io.ObjectInputStream")
570        private void readObject(ObjectInputStream stream)
571            throws IOException, ClassNotFoundException {
572          stream.defaultReadObject();
573          s = m.keySet();
574        }
575      }
576    
577      /**
578       * An unmodifiable view of a set which may be backed by other sets; this view
579       * will change as the backing sets do. Contains methods to copy the data into
580       * a new set which will then remain stable. There is usually no reason to
581       * retain a reference of type {@code SetView}; typically, you either use it
582       * as a plain {@link Set}, or immediately invoke {@link #immutableCopy} or
583       * {@link #copyInto} and forget the {@code SetView} itself.
584       *
585       * @since 2.0 (imported from Google Collections Library)
586       */
587      public abstract static class SetView<E> extends AbstractSet<E> {
588        private SetView() {} // no subclasses but our own
589    
590        /**
591         * Returns an immutable copy of the current contents of this set view.
592         * Does not support null elements.
593         *
594         * <p><b>Warning:</b> this may have unexpected results if a backing set of
595         * this view uses a nonstandard notion of equivalence, for example if it is
596         * a {@link TreeSet} using a comparator that is inconsistent with {@link
597         * Object#equals(Object)}.
598         */
599        public ImmutableSet<E> immutableCopy() {
600          return ImmutableSet.copyOf(this);
601        }
602    
603        /**
604         * Copies the current contents of this set view into an existing set. This
605         * method has equivalent behavior to {@code set.addAll(this)}, assuming that
606         * all the sets involved are based on the same notion of equivalence.
607         *
608         * @return a reference to {@code set}, for convenience
609         */
610        // Note: S should logically extend Set<? super E> but can't due to either
611        // some javac bug or some weirdness in the spec, not sure which.
612        public <S extends Set<E>> S copyInto(S set) {
613          set.addAll(this);
614          return set;
615        }
616      }
617    
618      /**
619       * Returns an unmodifiable <b>view</b> of the union of two sets. The returned
620       * set contains all elements that are contained in either backing set.
621       * Iterating over the returned set iterates first over all the elements of
622       * {@code set1}, then over each element of {@code set2}, in order, that is not
623       * contained in {@code set1}.
624       *
625       * <p>Results are undefined if {@code set1} and {@code set2} are sets based on
626       * different equivalence relations (as {@link HashSet}, {@link TreeSet}, and
627       * the {@link Map#keySet} of an {@code IdentityHashMap} all are).
628       *
629       * <p><b>Note:</b> The returned view performs better when {@code set1} is the
630       * smaller of the two sets. If you have reason to believe one of your sets
631       * will generally be smaller than the other, pass it first.
632       *
633       * <p>Further, note that the current implementation is not suitable for nested
634       * {@code union} views, i.e. the following should be avoided when in a loop:
635       * {@code union = Sets.union(union, anotherSet);}, since iterating over the resulting
636       * set has a cubic complexity to the depth of the nesting.
637       */
638      public static <E> SetView<E> union(
639          final Set<? extends E> set1, final Set<? extends E> set2) {
640        checkNotNull(set1, "set1");
641        checkNotNull(set2, "set2");
642    
643        final Set<? extends E> set2minus1 = difference(set2, set1);
644    
645        return new SetView<E>() {
646          @Override public int size() {
647            return set1.size() + set2minus1.size();
648          }
649          @Override public boolean isEmpty() {
650            return set1.isEmpty() && set2.isEmpty();
651          }
652          @Override public Iterator<E> iterator() {
653            return Iterators.unmodifiableIterator(
654                Iterators.concat(set1.iterator(), set2minus1.iterator()));
655          }
656          @Override public boolean contains(Object object) {
657            return set1.contains(object) || set2.contains(object);
658          }
659          @Override public <S extends Set<E>> S copyInto(S set) {
660            set.addAll(set1);
661            set.addAll(set2);
662            return set;
663          }
664          @Override public ImmutableSet<E> immutableCopy() {
665            return new ImmutableSet.Builder<E>()
666                .addAll(set1).addAll(set2).build();
667          }
668        };
669      }
670    
671      /**
672       * Returns an unmodifiable <b>view</b> of the intersection of two sets. The
673       * returned set contains all elements that are contained by both backing sets.
674       * The iteration order of the returned set matches that of {@code set1}.
675       *
676       * <p>Results are undefined if {@code set1} and {@code set2} are sets based
677       * on different equivalence relations (as {@code HashSet}, {@code TreeSet},
678       * and the keySet of an {@code IdentityHashMap} all are).
679       *
680       * <p><b>Note:</b> The returned view performs slightly better when {@code
681       * set1} is the smaller of the two sets. If you have reason to believe one of
682       * your sets will generally be smaller than the other, pass it first.
683       * Unfortunately, since this method sets the generic type of the returned set
684       * based on the type of the first set passed, this could in rare cases force
685       * you to make a cast, for example: <pre>   {@code
686       *
687       *   Set<Object> aFewBadObjects = ...
688       *   Set<String> manyBadStrings = ...
689       *
690       *   // impossible for a non-String to be in the intersection
691       *   SuppressWarnings("unchecked")
692       *   Set<String> badStrings = (Set) Sets.intersection(
693       *       aFewBadObjects, manyBadStrings);}</pre>
694       *
695       * This is unfortunate, but should come up only very rarely.
696       */
697      public static <E> SetView<E> intersection(
698          final Set<E> set1, final Set<?> set2) {
699        checkNotNull(set1, "set1");
700        checkNotNull(set2, "set2");
701    
702        final Predicate<Object> inSet2 = Predicates.in(set2);
703        return new SetView<E>() {
704          @Override public Iterator<E> iterator() {
705            return Iterators.filter(set1.iterator(), inSet2);
706          }
707          @Override public int size() {
708            return Iterators.size(iterator());
709          }
710          @Override public boolean isEmpty() {
711            return !iterator().hasNext();
712          }
713          @Override public boolean contains(Object object) {
714            return set1.contains(object) && set2.contains(object);
715          }
716          @Override public boolean containsAll(Collection<?> collection) {
717            return set1.containsAll(collection)
718                && set2.containsAll(collection);
719          }
720        };
721      }
722    
723      /**
724       * Returns an unmodifiable <b>view</b> of the difference of two sets. The
725       * returned set contains all elements that are contained by {@code set1} and
726       * not contained by {@code set2}. {@code set2} may also contain elements not
727       * present in {@code set1}; these are simply ignored. The iteration order of
728       * the returned set matches that of {@code set1}.
729       *
730       * <p>Results are undefined if {@code set1} and {@code set2} are sets based
731       * on different equivalence relations (as {@code HashSet}, {@code TreeSet},
732       * and the keySet of an {@code IdentityHashMap} all are).
733       */
734      public static <E> SetView<E> difference(
735          final Set<E> set1, final Set<?> set2) {
736        checkNotNull(set1, "set1");
737        checkNotNull(set2, "set2");
738    
739        final Predicate<Object> notInSet2 = Predicates.not(Predicates.in(set2));
740        return new SetView<E>() {
741          @Override public Iterator<E> iterator() {
742            return Iterators.filter(set1.iterator(), notInSet2);
743          }
744          @Override public int size() {
745            return Iterators.size(iterator());
746          }
747          @Override public boolean isEmpty() {
748            return set2.containsAll(set1);
749          }
750          @Override public boolean contains(Object element) {
751            return set1.contains(element) && !set2.contains(element);
752          }
753        };
754      }
755    
756      /**
757       * Returns an unmodifiable <b>view</b> of the symmetric difference of two
758       * sets. The returned set contains all elements that are contained in either
759       * {@code set1} or {@code set2} but not in both. The iteration order of the
760       * returned set is undefined.
761       *
762       * <p>Results are undefined if {@code set1} and {@code set2} are sets based
763       * on different equivalence relations (as {@code HashSet}, {@code TreeSet},
764       * and the keySet of an {@code IdentityHashMap} all are).
765       *
766       * @since 3.0
767       */
768      public static <E> SetView<E> symmetricDifference(
769          Set<? extends E> set1, Set<? extends E> set2) {
770        checkNotNull(set1, "set1");
771        checkNotNull(set2, "set2");
772    
773        // TODO(kevinb): Replace this with a more efficient implementation
774        return difference(union(set1, set2), intersection(set1, set2));
775      }
776    
777      /**
778       * Returns the elements of {@code unfiltered} that satisfy a predicate. The
779       * returned set is a live view of {@code unfiltered}; changes to one affect
780       * the other.
781       *
782       * <p>The resulting set's iterator does not support {@code remove()}, but all
783       * other set methods are supported. When given an element that doesn't satisfy
784       * the predicate, the set's {@code add()} and {@code addAll()} methods throw
785       * an {@link IllegalArgumentException}. When methods such as {@code
786       * removeAll()} and {@code clear()} are called on the filtered set, only
787       * elements that satisfy the filter will be removed from the underlying set.
788       *
789       * <p>The returned set isn't threadsafe or serializable, even if
790       * {@code unfiltered} is.
791       *
792       * <p>Many of the filtered set's methods, such as {@code size()}, iterate
793       * across every element in the underlying set and determine which elements
794       * satisfy the filter. When a live view is <i>not</i> needed, it may be faster
795       * to copy {@code Iterables.filter(unfiltered, predicate)} and use the copy.
796       *
797       * <p><b>Warning:</b> {@code predicate} must be <i>consistent with equals</i>,
798       * as documented at {@link Predicate#apply}. Do not provide a predicate such
799       * as {@code Predicates.instanceOf(ArrayList.class)}, which is inconsistent
800       * with equals. (See {@link Iterables#filter(Iterable, Class)} for related
801       * functionality.)
802       */
803      // TODO(kevinb): how to omit that last sentence when building GWT javadoc?
804      public static <E> Set<E> filter(
805          Set<E> unfiltered, Predicate<? super E> predicate) {
806        if (unfiltered instanceof SortedSet) {
807          return filter((SortedSet<E>) unfiltered, predicate);
808        }
809        if (unfiltered instanceof FilteredSet) {
810          // Support clear(), removeAll(), and retainAll() when filtering a filtered
811          // collection.
812          FilteredSet<E> filtered = (FilteredSet<E>) unfiltered;
813          Predicate<E> combinedPredicate
814              = Predicates.<E>and(filtered.predicate, predicate);
815          return new FilteredSet<E>(
816              (Set<E>) filtered.unfiltered, combinedPredicate);
817        }
818    
819        return new FilteredSet<E>(
820            checkNotNull(unfiltered), checkNotNull(predicate));
821      }
822    
823      private static class FilteredSet<E> extends FilteredCollection<E>
824          implements Set<E> {
825        FilteredSet(Set<E> unfiltered, Predicate<? super E> predicate) {
826          super(unfiltered, predicate);
827        }
828    
829        @Override public boolean equals(@Nullable Object object) {
830          return equalsImpl(this, object);
831        }
832    
833        @Override public int hashCode() {
834          return hashCodeImpl(this);
835        }
836      }
837    
838      /**
839       * Returns the elements of a {@code SortedSet}, {@code unfiltered}, that
840       * satisfy a predicate. The returned set is a live view of {@code unfiltered};
841       * changes to one affect the other.
842       *
843       * <p>The resulting set's iterator does not support {@code remove()}, but all
844       * other set methods are supported. When given an element that doesn't satisfy
845       * the predicate, the set's {@code add()} and {@code addAll()} methods throw
846       * an {@link IllegalArgumentException}. When methods such as
847       * {@code removeAll()} and {@code clear()} are called on the filtered set,
848       * only elements that satisfy the filter will be removed from the underlying
849       * set.
850       *
851       * <p>The returned set isn't threadsafe or serializable, even if
852       * {@code unfiltered} is.
853       *
854       * <p>Many of the filtered set's methods, such as {@code size()}, iterate across
855       * every element in the underlying set and determine which elements satisfy
856       * the filter. When a live view is <i>not</i> needed, it may be faster to copy
857       * {@code Iterables.filter(unfiltered, predicate)} and use the copy.
858       *
859       * <p><b>Warning:</b> {@code predicate} must be <i>consistent with equals</i>,
860       * as documented at {@link Predicate#apply}. Do not provide a predicate such as
861       * {@code Predicates.instanceOf(ArrayList.class)}, which is inconsistent with
862       * equals. (See {@link Iterables#filter(Iterable, Class)} for related
863       * functionality.)
864       *
865       * @since 11.0
866       */
867      @SuppressWarnings("unchecked")
868      public static <E> SortedSet<E> filter(
869          SortedSet<E> unfiltered, Predicate<? super E> predicate) {
870        if (unfiltered instanceof FilteredSet) {
871          // Support clear(), removeAll(), and retainAll() when filtering a filtered
872          // collection.
873          FilteredSet<E> filtered = (FilteredSet<E>) unfiltered;
874          Predicate<E> combinedPredicate
875              = Predicates.<E>and(filtered.predicate, predicate);
876          return new FilteredSortedSet<E>(
877              (SortedSet<E>) filtered.unfiltered, combinedPredicate);
878        }
879    
880        return new FilteredSortedSet<E>(
881            checkNotNull(unfiltered), checkNotNull(predicate));
882      }
883    
884      private static class FilteredSortedSet<E> extends FilteredCollection<E>
885          implements SortedSet<E> {
886    
887        FilteredSortedSet(SortedSet<E> unfiltered, Predicate<? super E> predicate) {
888          super(unfiltered, predicate);
889        }
890    
891        @Override public boolean equals(@Nullable Object object) {
892          return equalsImpl(this, object);
893        }
894    
895        @Override public int hashCode() {
896          return hashCodeImpl(this);
897        }
898    
899        @Override
900        public Comparator<? super E> comparator() {
901          return ((SortedSet<E>) unfiltered).comparator();
902        }
903    
904        @Override
905        public SortedSet<E> subSet(E fromElement, E toElement) {
906          return new FilteredSortedSet<E>(((SortedSet<E>) unfiltered).subSet(fromElement, toElement),
907              predicate);
908        }
909    
910        @Override
911        public SortedSet<E> headSet(E toElement) {
912          return new FilteredSortedSet<E>(((SortedSet<E>) unfiltered).headSet(toElement), predicate);
913        }
914    
915        @Override
916        public SortedSet<E> tailSet(E fromElement) {
917          return new FilteredSortedSet<E>(((SortedSet<E>) unfiltered).tailSet(fromElement), predicate);
918        }
919    
920        @Override
921        public E first() {
922          return iterator().next();
923        }
924    
925        @Override
926        public E last() {
927          SortedSet<E> sortedUnfiltered = (SortedSet<E>) unfiltered;
928          while (true) {
929            E element = sortedUnfiltered.last();
930            if (predicate.apply(element)) {
931              return element;
932            }
933            sortedUnfiltered = sortedUnfiltered.headSet(element);
934          }
935        }
936      }
937    
938      /**
939       * Returns every possible list that can be formed by choosing one element
940       * from each of the given sets in order; the "n-ary
941       * <a href="http://en.wikipedia.org/wiki/Cartesian_product">Cartesian
942       * product</a>" of the sets. For example: <pre>   {@code
943       *
944       *   Sets.cartesianProduct(ImmutableList.of(
945       *       ImmutableSet.of(1, 2),
946       *       ImmutableSet.of("A", "B", "C")))}</pre>
947       *
948       * returns a set containing six lists:
949       *
950       * <ul>
951       * <li>{@code ImmutableList.of(1, "A")}
952       * <li>{@code ImmutableList.of(1, "B")}
953       * <li>{@code ImmutableList.of(1, "C")}
954       * <li>{@code ImmutableList.of(2, "A")}
955       * <li>{@code ImmutableList.of(2, "B")}
956       * <li>{@code ImmutableList.of(2, "C")}
957       * </ul>
958       *
959       * The order in which these lists are returned is not guaranteed, however the
960       * position of an element inside a tuple always corresponds to the position of
961       * the set from which it came in the input list. Note that if any input set is
962       * empty, the Cartesian product will also be empty. If no sets at all are
963       * provided (an empty list), the resulting Cartesian product has one element,
964       * an empty list (counter-intuitive, but mathematically consistent).
965       *
966       * <p><i>Performance notes:</i> while the cartesian product of sets of size
967       * {@code m, n, p} is a set of size {@code m x n x p}, its actual memory
968       * consumption is much smaller. When the cartesian set is constructed, the
969       * input sets are merely copied. Only as the resulting set is iterated are the
970       * individual lists created, and these are not retained after iteration.
971       *
972       * @param sets the sets to choose elements from, in the order that
973       *     the elements chosen from those sets should appear in the resulting
974       *     lists
975       * @param <B> any common base class shared by all axes (often just {@link
976       *     Object})
977       * @return the Cartesian product, as an immutable set containing immutable
978       *     lists
979       * @throws NullPointerException if {@code sets}, any one of the {@code sets},
980       *     or any element of a provided set is null
981       * @since 2.0
982       */
983      public static <B> Set<List<B>> cartesianProduct(
984          List<? extends Set<? extends B>> sets) {
985        for (Set<? extends B> set : sets) {
986          if (set.isEmpty()) {
987            return ImmutableSet.of();
988          }
989        }
990        CartesianSet<B> cartesianSet = new CartesianSet<B>(sets);
991        return cartesianSet;
992      }
993    
994      /**
995       * Returns every possible list that can be formed by choosing one element
996       * from each of the given sets in order; the "n-ary
997       * <a href="http://en.wikipedia.org/wiki/Cartesian_product">Cartesian
998       * product</a>" of the sets. For example: <pre>   {@code
999       *
1000       *   Sets.cartesianProduct(
1001       *       ImmutableSet.of(1, 2),
1002       *       ImmutableSet.of("A", "B", "C"))}</pre>
1003       *
1004       * returns a set containing six lists:
1005       *
1006       * <ul>
1007       * <li>{@code ImmutableList.of(1, "A")}
1008       * <li>{@code ImmutableList.of(1, "B")}
1009       * <li>{@code ImmutableList.of(1, "C")}
1010       * <li>{@code ImmutableList.of(2, "A")}
1011       * <li>{@code ImmutableList.of(2, "B")}
1012       * <li>{@code ImmutableList.of(2, "C")}
1013       * </ul>
1014       *
1015       * The order in which these lists are returned is not guaranteed, however the
1016       * position of an element inside a tuple always corresponds to the position of
1017       * the set from which it came in the input list. Note that if any input set is
1018       * empty, the Cartesian product will also be empty. If no sets at all are
1019       * provided, the resulting Cartesian product has one element, an empty list
1020       * (counter-intuitive, but mathematically consistent).
1021       *
1022       * <p><i>Performance notes:</i> while the cartesian product of sets of size
1023       * {@code m, n, p} is a set of size {@code m x n x p}, its actual memory
1024       * consumption is much smaller. When the cartesian set is constructed, the
1025       * input sets are merely copied. Only as the resulting set is iterated are the
1026       * individual lists created, and these are not retained after iteration.
1027       *
1028       * @param sets the sets to choose elements from, in the order that
1029       *     the elements chosen from those sets should appear in the resulting
1030       *     lists
1031       * @param <B> any common base class shared by all axes (often just {@link
1032       *     Object})
1033       * @return the Cartesian product, as an immutable set containing immutable
1034       *     lists
1035       * @throws NullPointerException if {@code sets}, any one of the {@code sets},
1036       *     or any element of a provided set is null
1037       * @since 2.0
1038       */
1039      public static <B> Set<List<B>> cartesianProduct(
1040          Set<? extends B>... sets) {
1041        return cartesianProduct(Arrays.asList(sets));
1042      }
1043    
1044      private static class CartesianSet<B> extends AbstractSet<List<B>> {
1045        final ImmutableList<Axis> axes;
1046        final int size;
1047    
1048        CartesianSet(List<? extends Set<? extends B>> sets) {
1049          int dividend = 1;
1050          ImmutableList.Builder<Axis> builder = ImmutableList.builder();
1051          try {
1052            for (Set<? extends B> set : sets) {
1053              Axis axis = new Axis(set, dividend);
1054              builder.add(axis);
1055              dividend = IntMath.checkedMultiply(dividend, axis.size());
1056            }
1057          } catch (ArithmeticException overflow) {
1058            throw new IllegalArgumentException("cartesian product too big");
1059          }
1060          this.axes = builder.build();
1061          size = dividend;
1062        }
1063    
1064        @Override public int size() {
1065          return size;
1066        }
1067    
1068        @Override public UnmodifiableIterator<List<B>> iterator() {
1069          return new AbstractIndexedListIterator<List<B>>(size) {
1070            @Override
1071            protected List<B> get(int index) {
1072              Object[] tuple = new Object[axes.size()];
1073              for (int i = 0 ; i < tuple.length; i++) {
1074                tuple[i] = axes.get(i).getForIndex(index);
1075              }
1076    
1077              @SuppressWarnings("unchecked") // only B's are put in here
1078              List<B> result = (ImmutableList<B>) ImmutableList.copyOf(tuple);
1079              return result;
1080            }
1081          };
1082        }
1083    
1084        @Override public boolean contains(Object element) {
1085          if (!(element instanceof List)) {
1086            return false;
1087          }
1088          List<?> tuple = (List<?>) element;
1089          int dimensions = axes.size();
1090          if (tuple.size() != dimensions) {
1091            return false;
1092          }
1093          for (int i = 0; i < dimensions; i++) {
1094            if (!axes.get(i).contains(tuple.get(i))) {
1095              return false;
1096            }
1097          }
1098          return true;
1099        }
1100    
1101        @Override public boolean equals(@Nullable Object object) {
1102          // Warning: this is broken if size() == 0, so it is critical that we
1103          // substitute an empty ImmutableSet to the user in place of this
1104          if (object instanceof CartesianSet) {
1105            CartesianSet<?> that = (CartesianSet<?>) object;
1106            return this.axes.equals(that.axes);
1107          }
1108          return super.equals(object);
1109        }
1110    
1111        @Override public int hashCode() {
1112          // Warning: this is broken if size() == 0, so it is critical that we
1113          // substitute an empty ImmutableSet to the user in place of this
1114    
1115          // It's a weird formula, but tests prove it works.
1116          int adjust = size - 1;
1117          for (int i = 0; i < axes.size(); i++) {
1118            adjust *= 31;
1119          }
1120          return axes.hashCode() + adjust;
1121        }
1122    
1123        private class Axis {
1124          final ImmutableSet<? extends B> choices;
1125          final ImmutableList<? extends B> choicesList;
1126          final int dividend;
1127    
1128          Axis(Set<? extends B> set, int dividend) {
1129            choices = ImmutableSet.copyOf(set);
1130            choicesList = choices.asList();
1131            this.dividend = dividend;
1132          }
1133    
1134          int size() {
1135            return choices.size();
1136          }
1137    
1138          B getForIndex(int index) {
1139            return choicesList.get(index / dividend % size());
1140          }
1141    
1142          boolean contains(Object target) {
1143            return choices.contains(target);
1144          }
1145    
1146          @Override public boolean equals(Object obj) {
1147            if (obj instanceof CartesianSet.Axis) {
1148              CartesianSet.Axis that = (CartesianSet.Axis) obj;
1149              return this.choices.equals(that.choices);
1150              // dividends must be equal or we wouldn't have gotten this far
1151            }
1152            return false;
1153          }
1154    
1155          @Override public int hashCode() {
1156            // Because Axis instances are not exposed, we can
1157            // opportunistically choose whatever bizarre formula happens
1158            // to make CartesianSet.hashCode() as simple as possible.
1159            return size / choices.size() * choices.hashCode();
1160          }
1161        }
1162      }
1163    
1164      /**
1165       * Returns the set of all possible subsets of {@code set}. For example,
1166       * {@code powerSet(ImmutableSet.of(1, 2))} returns the set {@code {{},
1167       * {1}, {2}, {1, 2}}}.
1168       *
1169       * <p>Elements appear in these subsets in the same iteration order as they
1170       * appeared in the input set. The order in which these subsets appear in the
1171       * outer set is undefined. Note that the power set of the empty set is not the
1172       * empty set, but a one-element set containing the empty set.
1173       *
1174       * <p>The returned set and its constituent sets use {@code equals} to decide
1175       * whether two elements are identical, even if the input set uses a different
1176       * concept of equivalence.
1177       *
1178       * <p><i>Performance notes:</i> while the power set of a set with size {@code
1179       * n} is of size {@code 2^n}, its memory usage is only {@code O(n)}. When the
1180       * power set is constructed, the input set is merely copied. Only as the
1181       * power set is iterated are the individual subsets created, and these subsets
1182       * themselves occupy only a few bytes of memory regardless of their size.
1183       *
1184       * @param set the set of elements to construct a power set from
1185       * @return the power set, as an immutable set of immutable sets
1186       * @throws IllegalArgumentException if {@code set} has more than 30 unique
1187       *     elements (causing the power set size to exceed the {@code int} range)
1188       * @throws NullPointerException if {@code set} is or contains {@code null}
1189       * @see <a href="http://en.wikipedia.org/wiki/Power_set">Power set article at
1190       *      Wikipedia</a>
1191       * @since 4.0
1192       */
1193      @GwtCompatible(serializable = false)
1194      public static <E> Set<Set<E>> powerSet(Set<E> set) {
1195        ImmutableSet<E> input = ImmutableSet.copyOf(set);
1196        checkArgument(input.size() <= 30,
1197            "Too many elements to create power set: %s > 30", input.size());
1198        return new PowerSet<E>(input);
1199      }
1200    
1201      private static final class PowerSet<E> extends AbstractSet<Set<E>> {
1202        final ImmutableSet<E> inputSet;
1203        final ImmutableList<E> inputList;
1204        final int powerSetSize;
1205    
1206        PowerSet(ImmutableSet<E> input) {
1207          this.inputSet = input;
1208          this.inputList = input.asList();
1209          this.powerSetSize = 1 << input.size();
1210        }
1211    
1212        @Override public int size() {
1213          return powerSetSize;
1214        }
1215    
1216        @Override public boolean isEmpty() {
1217          return false;
1218        }
1219    
1220        @Override public Iterator<Set<E>> iterator() {
1221          return new AbstractIndexedListIterator<Set<E>>(powerSetSize) {
1222            @Override protected Set<E> get(final int setBits) {
1223              return new AbstractSet<E>() {
1224                @Override public int size() {
1225                  return Integer.bitCount(setBits);
1226                }
1227                @Override public Iterator<E> iterator() {
1228                  return new BitFilteredSetIterator<E>(inputList, setBits);
1229                }
1230              };
1231            }
1232          };
1233        }
1234    
1235        private static final class BitFilteredSetIterator<E>
1236            extends UnmodifiableIterator<E> {
1237          final ImmutableList<E> input;
1238          int remainingSetBits;
1239    
1240          BitFilteredSetIterator(ImmutableList<E> input, int allSetBits) {
1241            this.input = input;
1242            this.remainingSetBits = allSetBits;
1243          }
1244    
1245          @Override public boolean hasNext() {
1246            return remainingSetBits != 0;
1247          }
1248    
1249          @Override public E next() {
1250            int index = Integer.numberOfTrailingZeros(remainingSetBits);
1251            if (index == 32) {
1252              throw new NoSuchElementException();
1253            }
1254    
1255            int currentElementMask = 1 << index;
1256            remainingSetBits &= ~currentElementMask;
1257            return input.get(index);
1258          }
1259        }
1260    
1261        @Override public boolean contains(@Nullable Object obj) {
1262          if (obj instanceof Set) {
1263            Set<?> set = (Set<?>) obj;
1264            return inputSet.containsAll(set);
1265          }
1266          return false;
1267        }
1268    
1269        @Override public boolean equals(@Nullable Object obj) {
1270          if (obj instanceof PowerSet) {
1271            PowerSet<?> that = (PowerSet<?>) obj;
1272            return inputSet.equals(that.inputSet);
1273          }
1274          return super.equals(obj);
1275        }
1276    
1277        @Override public int hashCode() {
1278          /*
1279           * The sum of the sums of the hash codes in each subset is just the sum of
1280           * each input element's hash code times the number of sets that element
1281           * appears in. Each element appears in exactly half of the 2^n sets, so:
1282           */
1283          return inputSet.hashCode() << (inputSet.size() - 1);
1284        }
1285    
1286        @Override public String toString() {
1287          return "powerSet(" + inputSet + ")";
1288        }
1289      }
1290    
1291      /**
1292       * An implementation for {@link Set#hashCode()}.
1293       */
1294      static int hashCodeImpl(Set<?> s) {
1295        int hashCode = 0;
1296        for (Object o : s) {
1297          hashCode += o != null ? o.hashCode() : 0;
1298        }
1299        return hashCode;
1300      }
1301    
1302      /**
1303       * An implementation for {@link Set#equals(Object)}.
1304       */
1305      static boolean equalsImpl(Set<?> s, @Nullable Object object){
1306        if (s == object) {
1307          return true;
1308        }
1309        if (object instanceof Set) {
1310          Set<?> o = (Set<?>) object;
1311    
1312          try {
1313            return s.size() == o.size() && s.containsAll(o);
1314          } catch (NullPointerException ignored) {
1315            return false;
1316          } catch (ClassCastException ignored) {
1317            return false;
1318          }
1319        }
1320        return false;
1321      }
1322    
1323      /**
1324       * Returns an unmodifiable view of the specified navigable set. This method
1325       * allows modules to provide users with "read-only" access to internal
1326       * navigable sets. Query operations on the returned set "read through" to the
1327       * specified set, and attempts to modify the returned set, whether direct or
1328       * via its collection views, result in an
1329       * {@code UnsupportedOperationException}.
1330       *
1331       * <p>The returned navigable set will be serializable if the specified
1332       * navigable set is serializable.
1333       *
1334       * @param set the navigable set for which an unmodifiable view is to be
1335       *        returned
1336       * @return an unmodifiable view of the specified navigable set
1337       * @since 12.0
1338       */
1339      @GwtIncompatible("NavigableSet")
1340      public static <E> NavigableSet<E> unmodifiableNavigableSet(
1341          NavigableSet<E> set) {
1342        if (set instanceof ImmutableSortedSet
1343            || set instanceof UnmodifiableNavigableSet) {
1344          return set;
1345        }
1346        return new UnmodifiableNavigableSet<E>(set);
1347      }
1348    
1349      @GwtIncompatible("NavigableSet")
1350      static final class UnmodifiableNavigableSet<E>
1351          extends ForwardingSortedSet<E> implements NavigableSet<E>, Serializable {
1352        private final NavigableSet<E> delegate;
1353    
1354        UnmodifiableNavigableSet(NavigableSet<E> delegate) {
1355          this.delegate = checkNotNull(delegate);
1356        }
1357    
1358        @Override
1359        protected SortedSet<E> delegate() {
1360          return Collections.unmodifiableSortedSet(delegate);
1361        }
1362    
1363        @Override
1364        public E lower(E e) {
1365          return delegate.lower(e);
1366        }
1367    
1368        @Override
1369        public E floor(E e) {
1370          return delegate.floor(e);
1371        }
1372    
1373        @Override
1374        public E ceiling(E e) {
1375          return delegate.ceiling(e);
1376        }
1377    
1378        @Override
1379        public E higher(E e) {
1380          return delegate.higher(e);
1381        }
1382    
1383        @Override
1384        public E pollFirst() {
1385          throw new UnsupportedOperationException();
1386        }
1387    
1388        @Override
1389        public E pollLast() {
1390          throw new UnsupportedOperationException();
1391        }
1392    
1393        private transient UnmodifiableNavigableSet<E> descendingSet;
1394    
1395        @Override
1396        public NavigableSet<E> descendingSet() {
1397          UnmodifiableNavigableSet<E> result = descendingSet;
1398          if (result == null) {
1399            result = descendingSet = new UnmodifiableNavigableSet<E>(
1400                delegate.descendingSet());
1401            result.descendingSet = this;
1402          }
1403          return result;
1404        }
1405    
1406        @Override
1407        public Iterator<E> descendingIterator() {
1408          return Iterators.unmodifiableIterator(delegate.descendingIterator());
1409        }
1410    
1411        @Override
1412        public NavigableSet<E> subSet(
1413            E fromElement,
1414            boolean fromInclusive,
1415            E toElement,
1416            boolean toInclusive) {
1417          return unmodifiableNavigableSet(delegate.subSet(
1418              fromElement,
1419              fromInclusive,
1420              toElement,
1421              toInclusive));
1422        }
1423    
1424        @Override
1425        public NavigableSet<E> headSet(E toElement, boolean inclusive) {
1426          return unmodifiableNavigableSet(delegate.headSet(toElement, inclusive));
1427        }
1428    
1429        @Override
1430        public NavigableSet<E> tailSet(E fromElement, boolean inclusive) {
1431          return unmodifiableNavigableSet(
1432              delegate.tailSet(fromElement, inclusive));
1433        }
1434    
1435        private static final long serialVersionUID = 0;
1436      }
1437    
1438      /**
1439       * Returns a synchronized (thread-safe) navigable set backed by the specified
1440       * navigable set.  In order to guarantee serial access, it is critical that
1441       * <b>all</b> access to the backing navigable set is accomplished
1442       * through the returned navigable set (or its views).
1443       *
1444       * <p>It is imperative that the user manually synchronize on the returned
1445       * sorted set when iterating over it or any of its {@code descendingSet},
1446       * {@code subSet}, {@code headSet}, or {@code tailSet} views. <pre>   {@code
1447       *
1448       *   NavigableSet<E> set = synchronizedNavigableSet(new TreeSet<E>());
1449       *    ...
1450       *   synchronized (set) {
1451       *     // Must be in the synchronized block
1452       *     Iterator<E> it = set.iterator();
1453       *     while (it.hasNext()){
1454       *       foo(it.next());
1455       *     }
1456       *   }}</pre>
1457       *
1458       * or: <pre>   {@code
1459       *
1460       *   NavigableSet<E> set = synchronizedNavigableSet(new TreeSet<E>());
1461       *   NavigableSet<E> set2 = set.descendingSet().headSet(foo);
1462       *    ...
1463       *   synchronized (set) { // Note: set, not set2!!!
1464       *     // Must be in the synchronized block
1465       *     Iterator<E> it = set2.descendingIterator();
1466       *     while (it.hasNext())
1467       *       foo(it.next());
1468       *     }
1469       *   }}</pre>
1470       *
1471       * Failure to follow this advice may result in non-deterministic behavior.
1472       *
1473       * <p>The returned navigable set will be serializable if the specified
1474       * navigable set is serializable.
1475       *
1476       * @param navigableSet the navigable set to be "wrapped" in a synchronized
1477       *    navigable set.
1478       * @return a synchronized view of the specified navigable set.
1479       * @since 13.0
1480       */
1481      @Beta
1482      @GwtIncompatible("NavigableSet")
1483      public static <E> NavigableSet<E> synchronizedNavigableSet(
1484          NavigableSet<E> navigableSet) {
1485        return Synchronized.navigableSet(navigableSet);
1486      }
1487    
1488      /**
1489       * Remove each element in an iterable from a set.
1490       */
1491      static boolean removeAllImpl(Set<?> set, Iterator<?> iterator) {
1492        boolean changed = false;
1493        while (iterator.hasNext()) {
1494          changed |= set.remove(iterator.next());
1495        }
1496        return changed;
1497      }
1498    
1499      static boolean removeAllImpl(Set<?> set, Collection<?> collection) {
1500        checkNotNull(collection); // for GWT
1501        if (collection instanceof Multiset) {
1502          collection = ((Multiset<?>) collection).elementSet();
1503        }
1504        /*
1505         * AbstractSet.removeAll(List) has quadratic behavior if the list size
1506         * is just less than the set's size.  We augment the test by
1507         * assuming that sets have fast contains() performance, and other
1508         * collections don't.  See
1509         * http://code.google.com/p/guava-libraries/issues/detail?id=1013
1510         */
1511        if (collection instanceof Set && collection.size() > set.size()) {
1512          Iterator<?> setIterator = set.iterator();
1513          boolean changed = false;
1514          while (setIterator.hasNext()) {
1515            if (collection.contains(setIterator.next())) {
1516              changed = true;
1517              setIterator.remove();
1518            }
1519          }
1520          return changed;
1521        } else {
1522          return removeAllImpl(set, collection.iterator());
1523        }
1524      }
1525    
1526      @GwtIncompatible("NavigableSet")
1527      static class DescendingSet<E> extends ForwardingNavigableSet<E> {
1528        private final NavigableSet<E> forward;
1529    
1530        DescendingSet(NavigableSet<E> forward) {
1531          this.forward = forward;
1532        }
1533    
1534        @Override
1535        protected NavigableSet<E> delegate() {
1536          return forward;
1537        }
1538    
1539        @Override
1540        public E lower(E e) {
1541          return forward.higher(e);
1542        }
1543    
1544        @Override
1545        public E floor(E e) {
1546          return forward.ceiling(e);
1547        }
1548    
1549        @Override
1550        public E ceiling(E e) {
1551          return forward.floor(e);
1552        }
1553    
1554        @Override
1555        public E higher(E e) {
1556          return forward.lower(e);
1557        }
1558    
1559        @Override
1560        public E pollFirst() {
1561          return forward.pollLast();
1562        }
1563    
1564        @Override
1565        public E pollLast() {
1566          return forward.pollFirst();
1567        }
1568    
1569        @Override
1570        public NavigableSet<E> descendingSet() {
1571          return forward;
1572        }
1573    
1574        @Override
1575        public Iterator<E> descendingIterator() {
1576          return forward.iterator();
1577        }
1578    
1579        @Override
1580        public NavigableSet<E> subSet(
1581            E fromElement,
1582            boolean fromInclusive,
1583            E toElement,
1584            boolean toInclusive) {
1585          return forward.subSet(toElement, toInclusive, fromElement, fromInclusive).descendingSet();
1586        }
1587    
1588        @Override
1589        public NavigableSet<E> headSet(E toElement, boolean inclusive) {
1590          return forward.tailSet(toElement, inclusive).descendingSet();
1591        }
1592    
1593        @Override
1594        public NavigableSet<E> tailSet(E fromElement, boolean inclusive) {
1595          return forward.headSet(fromElement, inclusive).descendingSet();
1596        }
1597    
1598        @SuppressWarnings("unchecked")
1599        @Override
1600        public Comparator<? super E> comparator() {
1601          Comparator<? super E> forwardComparator = forward.comparator();
1602          if (forwardComparator == null) {
1603            return (Comparator) Ordering.natural().reverse();
1604          } else {
1605            return reverse(forwardComparator);
1606          }
1607        }
1608    
1609        // If we inline this, we get a javac error.
1610        private static <T> Ordering<T> reverse(Comparator<T> forward) {
1611          return Ordering.from(forward).reverse();
1612        }
1613    
1614        @Override
1615        public E first() {
1616          return forward.last();
1617        }
1618    
1619        @Override
1620        public SortedSet<E> headSet(E toElement) {
1621          return standardHeadSet(toElement);
1622        }
1623    
1624        @Override
1625        public E last() {
1626          return forward.first();
1627        }
1628    
1629        @Override
1630        public SortedSet<E> subSet(E fromElement, E toElement) {
1631          return standardSubSet(fromElement, toElement);
1632        }
1633    
1634        @Override
1635        public SortedSet<E> tailSet(E fromElement) {
1636          return standardTailSet(fromElement);
1637        }
1638    
1639        @Override
1640        public Iterator<E> iterator() {
1641          return forward.descendingIterator();
1642        }
1643    
1644        @Override
1645        public Object[] toArray() {
1646          return standardToArray();
1647        }
1648    
1649        @Override
1650        public <T> T[] toArray(T[] array) {
1651          return standardToArray(array);
1652        }
1653    
1654        @Override
1655        public String toString() {
1656          return standardToString();
1657        }
1658      }
1659    
1660      /**
1661       * Used to avoid http://bugs.sun.com/view_bug.do?bug_id=6558557
1662       */
1663      static <T> SortedSet<T> cast(Iterable<T> iterable) {
1664        return (SortedSet<T>) iterable;
1665      }
1666    }