001/*
002 * Copyright (C) 2008 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
017package com.google.common.collect;
018
019import static com.google.common.base.Preconditions.checkArgument;
020import static com.google.common.base.Preconditions.checkNotNull;
021import static com.google.common.collect.ObjectArrays.checkElementsNotNull;
022
023import com.google.common.annotations.GwtCompatible;
024import com.google.common.annotations.GwtIncompatible;
025
026import java.io.InvalidObjectException;
027import java.io.ObjectInputStream;
028import java.io.Serializable;
029import java.util.Arrays;
030import java.util.Collection;
031import java.util.Collections;
032import java.util.Comparator;
033import java.util.Iterator;
034import java.util.NavigableSet;
035import java.util.SortedSet;
036
037import javax.annotation.Nullable;
038
039/**
040 * An immutable {@code SortedSet} that stores its elements in a sorted array.
041 * Some instances are ordered by an explicit comparator, while others follow the
042 * natural sort ordering of their elements. Either way, null elements are not
043 * supported.
044 *
045 * <p>Unlike {@link Collections#unmodifiableSortedSet}, which is a <i>view</i>
046 * of a separate collection that can still change, an instance of {@code
047 * ImmutableSortedSet} contains its own private data and will <i>never</i>
048 * change. This class is convenient for {@code public static final} sets
049 * ("constant sets") and also lets you easily make a "defensive copy" of a set
050 * provided to your class by a caller.
051 *
052 * <p>The sets returned by the {@link #headSet}, {@link #tailSet}, and
053 * {@link #subSet} methods share the same array as the original set, preventing
054 * that array from being garbage collected. If this is a concern, the data may
055 * be copied into a correctly-sized array by calling {@link #copyOfSorted}.
056 *
057 * <p><b>Note on element equivalence:</b> The {@link #contains(Object)},
058 * {@link #containsAll(Collection)}, and {@link #equals(Object)}
059 * implementations must check whether a provided object is equivalent to an
060 * element in the collection. Unlike most collections, an
061 * {@code ImmutableSortedSet} doesn't use {@link Object#equals} to determine if
062 * two elements are equivalent. Instead, with an explicit comparator, the
063 * following relation determines whether elements {@code x} and {@code y} are
064 * equivalent: <pre>   {@code
065 *
066 *   {(x, y) | comparator.compare(x, y) == 0}}</pre>
067 *
068 * <p>With natural ordering of elements, the following relation determines whether
069 * two elements are equivalent: <pre>   {@code
070 *
071 *   {(x, y) | x.compareTo(y) == 0}}</pre>
072 *
073 * <b>Warning:</b> Like most sets, an {@code ImmutableSortedSet} will not
074 * function correctly if an element is modified after being placed in the set.
075 * For this reason, and to avoid general confusion, it is strongly recommended
076 * to place only immutable objects into this collection.
077 *
078 * <p><b>Note:</b> Although this class is not final, it cannot be subclassed as
079 * it has no public or protected constructors. Thus, instances of this type are
080 * guaranteed to be immutable.
081 *
082 * <p>See the Guava User Guide article on <a href=
083 * "http://code.google.com/p/guava-libraries/wiki/ImmutableCollectionsExplained">
084 * immutable collections</a>.
085 *
086 * @see ImmutableSet
087 * @author Jared Levy
088 * @author Louis Wasserman
089 * @since 2.0 (imported from Google Collections Library; implements {@code NavigableSet} since 12.0)
090 */
091// TODO(benyu): benchmark and optimize all creation paths, which are a mess now
092@GwtCompatible(serializable = true, emulated = true)
093@SuppressWarnings("serial") // we're overriding default serialization
094public abstract class ImmutableSortedSet<E> extends ImmutableSortedSetFauxverideShim<E>
095    implements NavigableSet<E>, SortedIterable<E> {
096
097  private static final Comparator<Comparable> NATURAL_ORDER =
098      Ordering.natural();
099
100  private static final ImmutableSortedSet<Comparable> NATURAL_EMPTY_SET =
101      new EmptyImmutableSortedSet<Comparable>(NATURAL_ORDER);
102
103  @SuppressWarnings("unchecked")
104  private static <E> ImmutableSortedSet<E> emptySet() {
105    return (ImmutableSortedSet<E>) NATURAL_EMPTY_SET;
106  }
107
108  static <E> ImmutableSortedSet<E> emptySet(
109      Comparator<? super E> comparator) {
110    if (NATURAL_ORDER.equals(comparator)) {
111      return emptySet();
112    } else {
113      return new EmptyImmutableSortedSet<E>(comparator);
114    }
115  }
116
117  /**
118   * Returns the empty immutable sorted set.
119   */
120  public static <E> ImmutableSortedSet<E> of() {
121    return emptySet();
122  }
123
124  /**
125   * Returns an immutable sorted set containing a single element.
126   */
127  public static <E extends Comparable<? super E>> ImmutableSortedSet<E> of(
128      E element) {
129    return new RegularImmutableSortedSet<E>(
130        ImmutableList.of(element), Ordering.natural());
131  }
132
133  /**
134   * Returns an immutable sorted set containing the given elements sorted by
135   * their natural ordering. When multiple elements are equivalent according to
136   * {@link Comparable#compareTo}, only the first one specified is included.
137   *
138   * @throws NullPointerException if any element is null
139   */
140  @SuppressWarnings("unchecked")
141  public static <E extends Comparable<? super E>> ImmutableSortedSet<E> of(
142      E e1, E e2) {
143    return construct(Ordering.natural(), 2, e1, e2);
144  }
145
146  /**
147   * Returns an immutable sorted set containing the given elements sorted by
148   * their natural ordering. When multiple elements are equivalent according to
149   * {@link Comparable#compareTo}, only the first one specified is included.
150   *
151   * @throws NullPointerException if any element is null
152   */
153  @SuppressWarnings("unchecked")
154  public static <E extends Comparable<? super E>> ImmutableSortedSet<E> of(
155      E e1, E e2, E e3) {
156    return construct(Ordering.natural(), 3, e1, e2, e3);
157  }
158
159  /**
160   * Returns an immutable sorted set containing the given elements sorted by
161   * their natural ordering. When multiple elements are equivalent according to
162   * {@link Comparable#compareTo}, only the first one specified is included.
163   *
164   * @throws NullPointerException if any element is null
165   */
166  @SuppressWarnings("unchecked")
167  public static <E extends Comparable<? super E>> ImmutableSortedSet<E> of(
168      E e1, E e2, E e3, E e4) {
169    return construct(Ordering.natural(), 4, e1, e2, e3, e4);
170  }
171
172  /**
173   * Returns an immutable sorted set containing the given elements sorted by
174   * their natural ordering. When multiple elements are equivalent according to
175   * {@link Comparable#compareTo}, only the first one specified is included.
176   *
177   * @throws NullPointerException if any element is null
178   */
179  @SuppressWarnings("unchecked")
180  public static <E extends Comparable<? super E>> ImmutableSortedSet<E> of(
181      E e1, E e2, E e3, E e4, E e5) {
182    return construct(Ordering.natural(), 5, e1, e2, e3, e4, e5);
183  }
184
185  /**
186   * Returns an immutable sorted set containing the given elements sorted by
187   * their natural ordering. When multiple elements are equivalent according to
188   * {@link Comparable#compareTo}, only the first one specified is included.
189   *
190   * @throws NullPointerException if any element is null
191   * @since 3.0 (source-compatible since 2.0)
192   */
193  @SuppressWarnings("unchecked")
194  public static <E extends Comparable<? super E>> ImmutableSortedSet<E> of(
195      E e1, E e2, E e3, E e4, E e5, E e6, E... remaining) {
196    Comparable[] contents = new Comparable[6 + remaining.length];
197    contents[0] = e1;
198    contents[1] = e2;
199    contents[2] = e3;
200    contents[3] = e4;
201    contents[4] = e5;
202    contents[5] = e6;
203    System.arraycopy(remaining, 0, contents, 6, remaining.length);
204    return construct(Ordering.natural(), contents.length, (E[]) contents);
205  }
206
207  // TODO(kevinb): Consider factory methods that reject duplicates
208
209  /**
210   * Returns an immutable sorted set containing the given elements sorted by
211   * their natural ordering. When multiple elements are equivalent according to
212   * {@link Comparable#compareTo}, only the first one specified is included.
213   *
214   * @throws NullPointerException if any of {@code elements} is null
215   * @since 3.0
216   */
217  public static <E extends Comparable<? super E>> ImmutableSortedSet<E> copyOf(
218      E[] elements) {
219    return construct(Ordering.natural(), elements.length, elements.clone());
220  }
221
222  /**
223   * Returns an immutable sorted set containing the given elements sorted by
224   * their natural ordering. When multiple elements are equivalent according to
225   * {@code compareTo()}, only the first one specified is included. To create a
226   * copy of a {@code SortedSet} that preserves the comparator, call {@link
227   * #copyOfSorted} instead. This method iterates over {@code elements} at most
228   * once.
229
230   *
231   * <p>Note that if {@code s} is a {@code Set<String>}, then {@code
232   * ImmutableSortedSet.copyOf(s)} returns an {@code ImmutableSortedSet<String>}
233   * containing each of the strings in {@code s}, while {@code
234   * ImmutableSortedSet.of(s)} returns an {@code
235   * ImmutableSortedSet<Set<String>>} containing one element (the given set
236   * itself).
237   *
238   * <p>Despite the method name, this method attempts to avoid actually copying
239   * the data when it is safe to do so. The exact circumstances under which a
240   * copy will or will not be performed are undocumented and subject to change.
241   *
242   * <p>This method is not type-safe, as it may be called on elements that are
243   * not mutually comparable.
244   *
245   * @throws ClassCastException if the elements are not mutually comparable
246   * @throws NullPointerException if any of {@code elements} is null
247   */
248  public static <E> ImmutableSortedSet<E> copyOf(
249      Iterable<? extends E> elements) {
250    // Hack around E not being a subtype of Comparable.
251    // Unsafe, see ImmutableSortedSetFauxverideShim.
252    @SuppressWarnings("unchecked")
253    Ordering<E> naturalOrder = (Ordering<E>) Ordering.<Comparable>natural();
254    return copyOf(naturalOrder, elements);
255  }
256
257  /**
258   * Returns an immutable sorted set containing the given elements sorted by
259   * their natural ordering. When multiple elements are equivalent according to
260   * {@code compareTo()}, only the first one specified is included. To create a
261   * copy of a {@code SortedSet} that preserves the comparator, call
262   * {@link #copyOfSorted} instead. This method iterates over {@code elements}
263   * at most once.
264   *
265   * <p>Note that if {@code s} is a {@code Set<String>}, then
266   * {@code ImmutableSortedSet.copyOf(s)} returns an
267   * {@code ImmutableSortedSet<String>} containing each of the strings in
268   * {@code s}, while {@code ImmutableSortedSet.of(s)} returns an
269   * {@code ImmutableSortedSet<Set<String>>} containing one element (the given
270   * set itself).
271   *
272   * <p><b>Note:</b> Despite what the method name suggests, if {@code elements}
273   * is an {@code ImmutableSortedSet}, it may be returned instead of a copy.
274   *
275   * <p>This method is not type-safe, as it may be called on elements that are
276   * not mutually comparable.
277   *
278   * <p>This method is safe to use even when {@code elements} is a synchronized
279   * or concurrent collection that is currently being modified by another
280   * thread.
281   *
282   * @throws ClassCastException if the elements are not mutually comparable
283   * @throws NullPointerException if any of {@code elements} is null
284   * @since 7.0 (source-compatible since 2.0)
285   */
286  public static <E> ImmutableSortedSet<E> copyOf(
287      Collection<? extends E> elements) {
288    // Hack around E not being a subtype of Comparable.
289    // Unsafe, see ImmutableSortedSetFauxverideShim.
290    @SuppressWarnings("unchecked")
291    Ordering<E> naturalOrder = (Ordering<E>) Ordering.<Comparable>natural();
292    return copyOf(naturalOrder, elements);
293  }
294
295  /**
296   * Returns an immutable sorted set containing the given elements sorted by
297   * their natural ordering. When multiple elements are equivalent according to
298   * {@code compareTo()}, only the first one specified is included.
299   *
300   * <p>This method is not type-safe, as it may be called on elements that are
301   * not mutually comparable.
302   *
303   * @throws ClassCastException if the elements are not mutually comparable
304   * @throws NullPointerException if any of {@code elements} is null
305   */
306  public static <E> ImmutableSortedSet<E> copyOf(
307      Iterator<? extends E> elements) {
308    // Hack around E not being a subtype of Comparable.
309    // Unsafe, see ImmutableSortedSetFauxverideShim.
310    @SuppressWarnings("unchecked")
311    Ordering<E> naturalOrder = (Ordering<E>) Ordering.<Comparable>natural();
312    return copyOf(naturalOrder, elements);
313  }
314
315  /**
316   * Returns an immutable sorted set containing the given elements sorted by
317   * the given {@code Comparator}. When multiple elements are equivalent
318   * according to {@code compareTo()}, only the first one specified is
319   * included.
320   *
321   * @throws NullPointerException if {@code comparator} or any of
322   *     {@code elements} is null
323   */
324  public static <E> ImmutableSortedSet<E> copyOf(
325      Comparator<? super E> comparator, Iterator<? extends E> elements) {
326    return new Builder<E>(comparator).addAll(elements).build();
327  }
328
329  /**
330   * Returns an immutable sorted set containing the given elements sorted by
331   * the given {@code Comparator}. When multiple elements are equivalent
332   * according to {@code compare()}, only the first one specified is
333   * included. This method iterates over {@code elements} at most once.
334   *
335   * <p>Despite the method name, this method attempts to avoid actually copying
336   * the data when it is safe to do so. The exact circumstances under which a
337   * copy will or will not be performed are undocumented and subject to change.
338   *
339   * @throws NullPointerException if {@code comparator} or any of {@code
340   *         elements} is null
341   */
342  public static <E> ImmutableSortedSet<E> copyOf(
343      Comparator<? super E> comparator, Iterable<? extends E> elements) {
344    checkNotNull(comparator);
345    boolean hasSameComparator =
346        SortedIterables.hasSameComparator(comparator, elements);
347
348    if (hasSameComparator && (elements instanceof ImmutableSortedSet)) {
349      @SuppressWarnings("unchecked")
350      ImmutableSortedSet<E> original = (ImmutableSortedSet<E>) elements;
351      if (!original.isPartialView()) {
352        return original;
353      }
354    }
355    @SuppressWarnings("unchecked") // elements only contains E's; it's safe.
356    E[] array = (E[]) Iterables.toArray(elements);
357    return construct(comparator, array.length, array);
358  }
359
360  /**
361   * Returns an immutable sorted set containing the given elements sorted by
362   * the given {@code Comparator}. When multiple elements are equivalent
363   * according to {@code compareTo()}, only the first one specified is
364   * included.
365   *
366   * <p>Despite the method name, this method attempts to avoid actually copying
367   * the data when it is safe to do so. The exact circumstances under which a
368   * copy will or will not be performed are undocumented and subject to change.
369   *
370   * <p>This method is safe to use even when {@code elements} is a synchronized
371   * or concurrent collection that is currently being modified by another
372   * thread.
373   *
374   * @throws NullPointerException if {@code comparator} or any of
375   *     {@code elements} is null
376   * @since 7.0 (source-compatible since 2.0)
377   */
378  public static <E> ImmutableSortedSet<E> copyOf(
379      Comparator<? super E> comparator, Collection<? extends E> elements) {
380    return copyOf(comparator, (Iterable<? extends E>) elements);
381  }
382
383  /**
384   * Returns an immutable sorted set containing the elements of a sorted set,
385   * sorted by the same {@code Comparator}. That behavior differs from {@link
386   * #copyOf(Iterable)}, which always uses the natural ordering of the
387   * elements.
388   *
389   * <p>Despite the method name, this method attempts to avoid actually copying
390   * the data when it is safe to do so. The exact circumstances under which a
391   * copy will or will not be performed are undocumented and subject to change.
392   *
393   * <p>This method is safe to use even when {@code sortedSet} is a synchronized
394   * or concurrent collection that is currently being modified by another
395   * thread.
396   *
397   * @throws NullPointerException if {@code sortedSet} or any of its elements
398   *     is null
399   */
400  public static <E> ImmutableSortedSet<E> copyOfSorted(SortedSet<E> sortedSet) {
401    Comparator<? super E> comparator = SortedIterables.comparator(sortedSet);
402    ImmutableList<E> list = ImmutableList.copyOf(sortedSet);
403    if (list.isEmpty()) {
404      return emptySet(comparator);
405    } else {
406      return new RegularImmutableSortedSet<E>(list, comparator);
407    }
408  }
409
410  /**
411   * Constructs an {@code ImmutableSortedSet} from the first {@code n} elements of
412   * {@code contents}.  If {@code k} is the size of the returned {@code ImmutableSortedSet}, then
413   * the sorted unique elements are in the first {@code k} positions of {@code contents}, and
414   * {@code contents[i] == null} for {@code k <= i < n}.
415   *
416   * <p>If {@code k == contents.length}, then {@code contents} may no longer be safe for
417   * modification.
418   *
419   * @throws NullPointerException if any of the first {@code n} elements of {@code contents} is
420   *          null
421   */
422  static <E> ImmutableSortedSet<E> construct(
423      Comparator<? super E> comparator, int n, E... contents) {
424    if (n == 0) {
425      return emptySet(comparator);
426    }
427    checkElementsNotNull(contents, n);
428    Arrays.sort(contents, 0, n, comparator);
429    int uniques = 1;
430    for (int i = 1; i < n; i++) {
431      E cur = contents[i];
432      E prev = contents[uniques - 1];
433      if (comparator.compare(cur, prev) != 0) {
434        contents[uniques++] = cur;
435      }
436    }
437    Arrays.fill(contents, uniques, n, null);
438    return new RegularImmutableSortedSet<E>(
439        ImmutableList.<E>asImmutableList(contents, uniques), comparator);
440  }
441
442  /**
443   * Returns a builder that creates immutable sorted sets with an explicit
444   * comparator. If the comparator has a more general type than the set being
445   * generated, such as creating a {@code SortedSet<Integer>} with a
446   * {@code Comparator<Number>}, use the {@link Builder} constructor instead.
447   *
448   * @throws NullPointerException if {@code comparator} is null
449   */
450  public static <E> Builder<E> orderedBy(Comparator<E> comparator) {
451    return new Builder<E>(comparator);
452  }
453
454  /**
455   * Returns a builder that creates immutable sorted sets whose elements are
456   * ordered by the reverse of their natural ordering.
457   */
458  public static <E extends Comparable<?>> Builder<E> reverseOrder() {
459    return new Builder<E>(Ordering.natural().reverse());
460  }
461
462  /**
463   * Returns a builder that creates immutable sorted sets whose elements are
464   * ordered by their natural ordering. The sorted sets use {@link
465   * Ordering#natural()} as the comparator. This method provides more
466   * type-safety than {@link #builder}, as it can be called only for classes
467   * that implement {@link Comparable}.
468   */
469  public static <E extends Comparable<?>> Builder<E> naturalOrder() {
470    return new Builder<E>(Ordering.natural());
471  }
472
473  /**
474   * A builder for creating immutable sorted set instances, especially {@code
475   * public static final} sets ("constant sets"), with a given comparator.
476   * Example: <pre>   {@code
477   *
478   *   public static final ImmutableSortedSet<Number> LUCKY_NUMBERS =
479   *       new ImmutableSortedSet.Builder<Number>(ODDS_FIRST_COMPARATOR)
480   *           .addAll(SINGLE_DIGIT_PRIMES)
481   *           .add(42)
482   *           .build();}</pre>
483   *
484   * <p>Builder instances can be reused; it is safe to call {@link #build} multiple
485   * times to build multiple sets in series. Each set is a superset of the set
486   * created before it.
487   *
488   * @since 2.0 (imported from Google Collections Library)
489   */
490  public static final class Builder<E> extends ImmutableSet.Builder<E> {
491    private final Comparator<? super E> comparator;
492
493    /**
494     * Creates a new builder. The returned builder is equivalent to the builder
495     * generated by {@link ImmutableSortedSet#orderedBy}.
496     */
497    public Builder(Comparator<? super E> comparator) {
498      this.comparator = checkNotNull(comparator);
499    }
500
501    /**
502     * Adds {@code element} to the {@code ImmutableSortedSet}.  If the
503     * {@code ImmutableSortedSet} already contains {@code element}, then
504     * {@code add} has no effect. (only the previously added element
505     * is retained).
506     *
507     * @param element the element to add
508     * @return this {@code Builder} object
509     * @throws NullPointerException if {@code element} is null
510     */
511    @Override public Builder<E> add(E element) {
512      super.add(element);
513      return this;
514    }
515
516    /**
517     * Adds each element of {@code elements} to the {@code ImmutableSortedSet},
518     * ignoring duplicate elements (only the first duplicate element is added).
519     *
520     * @param elements the elements to add
521     * @return this {@code Builder} object
522     * @throws NullPointerException if {@code elements} contains a null element
523     */
524    @Override public Builder<E> add(E... elements) {
525      super.add(elements);
526      return this;
527    }
528
529    /**
530     * Adds each element of {@code elements} to the {@code ImmutableSortedSet},
531     * ignoring duplicate elements (only the first duplicate element is added).
532     *
533     * @param elements the elements to add to the {@code ImmutableSortedSet}
534     * @return this {@code Builder} object
535     * @throws NullPointerException if {@code elements} contains a null element
536     */
537    @Override public Builder<E> addAll(Iterable<? extends E> elements) {
538      super.addAll(elements);
539      return this;
540    }
541
542    /**
543     * Adds each element of {@code elements} to the {@code ImmutableSortedSet},
544     * ignoring duplicate elements (only the first duplicate element is added).
545     *
546     * @param elements the elements to add to the {@code ImmutableSortedSet}
547     * @return this {@code Builder} object
548     * @throws NullPointerException if {@code elements} contains a null element
549     */
550    @Override public Builder<E> addAll(Iterator<? extends E> elements) {
551      super.addAll(elements);
552      return this;
553    }
554
555    /**
556     * Returns a newly-created {@code ImmutableSortedSet} based on the contents
557     * of the {@code Builder} and its comparator.
558     */
559    @Override public ImmutableSortedSet<E> build() {
560      @SuppressWarnings("unchecked") // we're careful to put only E's in here
561      E[] contentsArray = (E[]) contents;
562      ImmutableSortedSet<E> result = construct(comparator, size, contentsArray);
563      this.size = result.size(); // we eliminated duplicates in-place in contentsArray
564      return result;
565    }
566  }
567
568  int unsafeCompare(Object a, Object b) {
569    return unsafeCompare(comparator, a, b);
570  }
571
572  static int unsafeCompare(
573      Comparator<?> comparator, Object a, Object b) {
574    // Pretend the comparator can compare anything. If it turns out it can't
575    // compare a and b, we should get a CCE on the subsequent line. Only methods
576    // that are spec'd to throw CCE should call this.
577    @SuppressWarnings("unchecked")
578    Comparator<Object> unsafeComparator = (Comparator<Object>) comparator;
579    return unsafeComparator.compare(a, b);
580  }
581
582  final transient Comparator<? super E> comparator;
583
584  ImmutableSortedSet(Comparator<? super E> comparator) {
585    this.comparator = comparator;
586  }
587
588  /**
589   * Returns the comparator that orders the elements, which is
590   * {@link Ordering#natural()} when the natural ordering of the
591   * elements is used. Note that its behavior is not consistent with
592   * {@link SortedSet#comparator()}, which returns {@code null} to indicate
593   * natural ordering.
594   */
595  @Override
596  public Comparator<? super E> comparator() {
597    return comparator;
598  }
599
600  @Override // needed to unify the iterator() methods in Collection and SortedIterable
601  public abstract UnmodifiableIterator<E> iterator();
602
603  /**
604   * {@inheritDoc}
605   *
606   * <p>This method returns a serializable {@code ImmutableSortedSet}.
607   *
608   * <p>The {@link SortedSet#headSet} documentation states that a subset of a
609   * subset throws an {@link IllegalArgumentException} if passed a
610   * {@code toElement} greater than an earlier {@code toElement}. However, this
611   * method doesn't throw an exception in that situation, but instead keeps the
612   * original {@code toElement}.
613   */
614  @Override
615  public ImmutableSortedSet<E> headSet(E toElement) {
616    return headSet(toElement, false);
617  }
618
619  /**
620   * @since 12.0
621   */
622  @GwtIncompatible("NavigableSet")
623  @Override
624  public ImmutableSortedSet<E> headSet(E toElement, boolean inclusive) {
625    return headSetImpl(checkNotNull(toElement), inclusive);
626  }
627
628  /**
629   * {@inheritDoc}
630   *
631   * <p>This method returns a serializable {@code ImmutableSortedSet}.
632   *
633   * <p>The {@link SortedSet#subSet} documentation states that a subset of a
634   * subset throws an {@link IllegalArgumentException} if passed a
635   * {@code fromElement} smaller than an earlier {@code fromElement}. However,
636   * this method doesn't throw an exception in that situation, but instead keeps
637   * the original {@code fromElement}. Similarly, this method keeps the
638   * original {@code toElement}, instead of throwing an exception, if passed a
639   * {@code toElement} greater than an earlier {@code toElement}.
640   */
641  @Override
642  public ImmutableSortedSet<E> subSet(E fromElement, E toElement) {
643    return subSet(fromElement, true, toElement, false);
644  }
645
646  /**
647   * @since 12.0
648   */
649  @GwtIncompatible("NavigableSet")
650  @Override
651  public ImmutableSortedSet<E> subSet(
652      E fromElement, boolean fromInclusive, E toElement, boolean toInclusive) {
653    checkNotNull(fromElement);
654    checkNotNull(toElement);
655    checkArgument(comparator.compare(fromElement, toElement) <= 0);
656    return subSetImpl(fromElement, fromInclusive, toElement, toInclusive);
657  }
658
659  /**
660   * {@inheritDoc}
661   *
662   * <p>This method returns a serializable {@code ImmutableSortedSet}.
663   *
664   * <p>The {@link SortedSet#tailSet} documentation states that a subset of a
665   * subset throws an {@link IllegalArgumentException} if passed a
666   * {@code fromElement} smaller than an earlier {@code fromElement}. However,
667   * this method doesn't throw an exception in that situation, but instead keeps
668   * the original {@code fromElement}.
669   */
670  @Override
671  public ImmutableSortedSet<E> tailSet(E fromElement) {
672    return tailSet(fromElement, true);
673  }
674
675  /**
676   * @since 12.0
677   */
678  @GwtIncompatible("NavigableSet")
679  @Override
680  public ImmutableSortedSet<E> tailSet(E fromElement, boolean inclusive) {
681    return tailSetImpl(checkNotNull(fromElement), inclusive);
682  }
683
684  /*
685   * These methods perform most headSet, subSet, and tailSet logic, besides
686   * parameter validation.
687   */
688  abstract ImmutableSortedSet<E> headSetImpl(E toElement, boolean inclusive);
689
690  abstract ImmutableSortedSet<E> subSetImpl(
691      E fromElement, boolean fromInclusive, E toElement, boolean toInclusive);
692
693  abstract ImmutableSortedSet<E> tailSetImpl(E fromElement, boolean inclusive);
694  
695  /**
696   * @since 12.0
697   */
698  @GwtIncompatible("NavigableSet")
699  @Override
700  public E lower(E e) {
701    return Iterators.getNext(headSet(e, false).descendingIterator(), null);
702  }
703
704  /**
705   * @since 12.0
706   */
707  @GwtIncompatible("NavigableSet")
708  @Override
709  public E floor(E e) {
710    return Iterators.getNext(headSet(e, true).descendingIterator(), null);
711  }
712
713  /**
714   * @since 12.0
715   */
716  @GwtIncompatible("NavigableSet")
717  @Override
718  public E ceiling(E e) {
719    return Iterables.getFirst(tailSet(e, true), null);
720  }
721
722  /**
723   * @since 12.0
724   */
725  @GwtIncompatible("NavigableSet")
726  @Override
727  public E higher(E e) {
728    return Iterables.getFirst(tailSet(e, false), null);
729  }
730
731  @Override
732  public E first() {
733    return iterator().next();
734  }
735
736  @Override
737  public E last() {
738    return descendingIterator().next();
739  }
740
741  /**
742   * Guaranteed to throw an exception and leave the set unmodified.
743   *
744   * @since 12.0
745   * @throws UnsupportedOperationException always
746   * @deprecated Unsupported operation.
747   */
748  @Deprecated
749  @GwtIncompatible("NavigableSet")
750  @Override
751  public final E pollFirst() {
752    throw new UnsupportedOperationException();
753  }
754
755  /**
756   * Guaranteed to throw an exception and leave the set unmodified.
757   *
758   * @since 12.0
759   * @throws UnsupportedOperationException always
760   * @deprecated Unsupported operation.
761   */
762  @Deprecated
763  @GwtIncompatible("NavigableSet")
764  @Override
765  public final E pollLast() {
766    throw new UnsupportedOperationException();
767  }
768
769  @GwtIncompatible("NavigableSet")
770  transient ImmutableSortedSet<E> descendingSet;
771
772  /**
773   * @since 12.0
774   */
775  @GwtIncompatible("NavigableSet")
776  @Override
777  public ImmutableSortedSet<E> descendingSet() {
778    // racy single-check idiom
779    ImmutableSortedSet<E> result = descendingSet;
780    if (result == null) {
781      result = descendingSet = createDescendingSet();
782      result.descendingSet = this;
783    }
784    return result;
785  }
786
787  @GwtIncompatible("NavigableSet")
788  ImmutableSortedSet<E> createDescendingSet() {
789    return new DescendingImmutableSortedSet<E>(this);
790  }
791
792  /**
793   * @since 12.0
794   */
795  @GwtIncompatible("NavigableSet")
796  @Override
797  public abstract UnmodifiableIterator<E> descendingIterator();
798
799  /**
800   * Returns the position of an element within the set, or -1 if not present.
801   */
802  abstract int indexOf(@Nullable Object target);
803
804  /*
805   * This class is used to serialize all ImmutableSortedSet instances,
806   * regardless of implementation type. It captures their "logical contents"
807   * only. This is necessary to ensure that the existence of a particular
808   * implementation type is an implementation detail.
809   */
810  private static class SerializedForm<E> implements Serializable {
811    final Comparator<? super E> comparator;
812    final Object[] elements;
813
814    public SerializedForm(Comparator<? super E> comparator, Object[] elements) {
815      this.comparator = comparator;
816      this.elements = elements;
817    }
818
819    @SuppressWarnings("unchecked")
820    Object readResolve() {
821      return new Builder<E>(comparator).add((E[]) elements).build();
822    }
823
824    private static final long serialVersionUID = 0;
825  }
826
827  private void readObject(ObjectInputStream stream)
828      throws InvalidObjectException {
829    throw new InvalidObjectException("Use SerializedForm");
830  }
831
832  @Override Object writeReplace() {
833    return new SerializedForm<E>(comparator, toArray());
834  }
835}
836