11d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/*
21d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Copyright (C) 2011 The Guava Authors
31d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
41d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
51d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * in compliance with the License. You may obtain a copy of the License at
61d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
71d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * http://www.apache.org/licenses/LICENSE-2.0
81d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
91d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Unless required by applicable law or agreed to in writing, software distributed under the
101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * express or implied. See the License for the specific language governing permissions and
121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * limitations under the License.
131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpackage com.google.common.collect;
161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.base.Preconditions.checkNotNull;
181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.GwtIncompatible;
201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.io.Serializable;
221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.ArrayList;
231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Arrays;
241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Collection;
251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Collections;
261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Comparator;
271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Iterator;
281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.List;
291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/**
311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * An immutable {@code SortedMultiset} that stores its elements in a sorted array. Some instances
321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * are ordered by an explicit comparator, while others follow the natural sort ordering of their
331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * elements. Either way, null elements are not supported.
341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>Unlike {@link Multisets#unmodifiableSortedMultiset}, which is a <i>view</i> of a separate
361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * collection that can still change, an instance of {@code ImmutableSortedMultiset} contains its
371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * own private data and will <i>never</i> change. This class is convenient for {@code public static
381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * final} multisets ("constant multisets") and also lets you easily make a "defensive copy" of a
391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * set provided to your class by a caller.
401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>The multisets returned by the {@link #headMultiset}, {@link #tailMultiset}, and
421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@link #subMultiset} methods share the same array as the original multiset, preventing that
431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * array from being garbage collected. If this is a concern, the data may be copied into a
441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * correctly-sized array by calling {@link #copyOfSorted}.
451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p><b>Note on element equivalence:</b> The {@link #contains(Object)},
471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@link #containsAll(Collection)}, and {@link #equals(Object)} implementations must check whether
481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * a provided object is equivalent to an element in the collection. Unlike most collections, an
491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@code ImmutableSortedMultiset} doesn't use {@link Object#equals} to determine if two elements
501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * are equivalent. Instead, with an explicit comparator, the following relation determines whether
511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * elements {@code x} and {@code y} are equivalent:
521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <pre>   {@code
541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *   {(x, y) | comparator.compare(x, y) == 0}}</pre>
561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * With natural ordering of elements, the following relation determines whether two elements are
581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * equivalent:
591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <pre>   {@code
611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *   {(x, y) | x.compareTo(y) == 0}}</pre>
631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *  <b>Warning:</b> Like most multisets, an {@code ImmutableSortedMultiset} will not function
651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * correctly if an element is modified after being placed in the multiset. For this reason, and to
661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * avoid general confusion, it is strongly recommended to place only immutable objects into this
671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * collection.
681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p><b>Note:</b> Although this class is not final, it cannot be subclassed as it has no public or
701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * protected constructors. Thus, instances of this type are guaranteed to be immutable.
711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Louis Wasserman
731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert@GwtIncompatible("hasn't been tested yet")
751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertabstract class ImmutableSortedMultiset<E> extends ImmutableSortedMultisetFauxverideShim<E>
761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    implements SortedMultiset<E> {
771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  // TODO(user): GWT compatibility
781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static final Comparator<Comparable> NATURAL_ORDER = Ordering.natural();
801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static final ImmutableSortedMultiset<Comparable> NATURAL_EMPTY_MULTISET =
821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      new EmptyImmutableSortedMultiset<Comparable>(NATURAL_ORDER);
831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns the empty immutable sorted multiset.
861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @SuppressWarnings("unchecked")
881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static <E> ImmutableSortedMultiset<E> of() {
891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return (ImmutableSortedMultiset) NATURAL_EMPTY_MULTISET;
901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns an immutable sorted multiset containing a single element.
941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static <E extends Comparable<? super E>> ImmutableSortedMultiset<E> of(E element) {
961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return RegularImmutableSortedMultiset.createFromSorted(
971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        NATURAL_ORDER, ImmutableList.of(Multisets.immutableEntry(checkNotNull(element), 1)));
981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns an immutable sorted multiset containing the given elements sorted by their natural
1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * ordering.
1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
1041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @throws NullPointerException if any element is null
1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @SuppressWarnings("unchecked")
1071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static <E extends Comparable<? super E>> ImmutableSortedMultiset<E> of(E e1, E e2) {
1081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return copyOf(Ordering.natural(), Arrays.asList(e1, e2));
1091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
1121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns an immutable sorted multiset containing the given elements sorted by their natural
1131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * ordering.
1141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
1151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @throws NullPointerException if any element is null
1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
1171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @SuppressWarnings("unchecked")
1181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static <E extends Comparable<? super E>> ImmutableSortedMultiset<E> of(E e1, E e2, E e3) {
1191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return copyOf(Ordering.natural(), Arrays.asList(e1, e2, e3));
1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
1231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns an immutable sorted multiset containing the given elements sorted by their natural
1241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * ordering.
1251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
1261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @throws NullPointerException if any element is null
1271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
1281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @SuppressWarnings("unchecked")
1291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static <E extends Comparable<? super E>> ImmutableSortedMultiset<E> of(
1301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      E e1, E e2, E e3, E e4) {
1311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return copyOf(Ordering.natural(), Arrays.asList(e1, e2, e3, e4));
1321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
1351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns an immutable sorted multiset containing the given elements sorted by their natural
1361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * ordering.
1371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
1381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @throws NullPointerException if any element is null
1391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
1401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @SuppressWarnings("unchecked")
1411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static <E extends Comparable<? super E>> ImmutableSortedMultiset<E> of(
1421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      E e1, E e2, E e3, E e4, E e5) {
1431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return copyOf(Ordering.natural(), Arrays.asList(e1, e2, e3, e4, e5));
1441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
1471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns an immutable sorted multiset containing the given elements sorted by their natural
1481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * ordering.
1491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
1501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @throws NullPointerException if any element is null
1511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
1521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @SuppressWarnings("unchecked")
1531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static <E extends Comparable<? super E>> ImmutableSortedMultiset<E> of(
1541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      E e1,
1551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      E e2,
1561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      E e3,
1571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      E e4,
1581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      E e5,
1591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      E e6,
1601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      E... remaining) {
1611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    int size = remaining.length + 6;
1621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<E> all = new ArrayList<E>(size);
1631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collections.addAll(all, e1, e2, e3, e4, e5, e6);
1641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collections.addAll(all, remaining);
1651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return copyOf(Ordering.natural(), all);
1661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
1691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns an immutable sorted multiset containing the given elements sorted by their natural
1701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * ordering.
1711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
1721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @throws NullPointerException if any of {@code elements} is null
1731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
1741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static <E extends Comparable<? super E>> ImmutableSortedMultiset<E> copyOf(E[] elements) {
1751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return copyOf(Ordering.natural(), Arrays.asList(elements));
1761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
1791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns an immutable sorted multiset containing the given elements sorted by their natural
1801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * ordering. To create a copy of a {@code SortedMultiset} that preserves the
1811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * comparator, call {@link #copyOfSorted} instead. This method iterates over {@code elements} at
1821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * most once.
1831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
1841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p>Note that if {@code s} is a {@code multiset<String>}, then {@code
1851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * ImmutableSortedMultiset.copyOf(s)} returns an {@code ImmutableSortedMultiset<String>}
1861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * containing each of the strings in {@code s}, while {@code ImmutableSortedMultiset.of(s)}
1871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * returns an {@code ImmutableSortedMultiset<multiset<String>>} containing one element (the given
1881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * multiset itself).
1891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
1901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p>Despite the method name, this method attempts to avoid actually copying the data when it is
1911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * safe to do so. The exact circumstances under which a copy will or will not be performed are
1921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * undocumented and subject to change.
1931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
1941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p>This method is not type-safe, as it may be called on elements that are not mutually
1951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * comparable.
1961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
1971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @throws ClassCastException if the elements are not mutually comparable
1981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @throws NullPointerException if any of {@code elements} is null
1991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
2001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static <E> ImmutableSortedMultiset<E> copyOf(Iterable<? extends E> elements) {
2011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Hack around E not being a subtype of Comparable.
2021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Unsafe, see ImmutableSortedMultisetFauxverideShim.
2031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @SuppressWarnings("unchecked")
2041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Ordering<E> naturalOrder = (Ordering<E>) Ordering.<Comparable>natural();
2051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return copyOf(naturalOrder, elements);
2061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
2091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns an immutable sorted multiset containing the given elements sorted by their natural
2101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * ordering.
2111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
2121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p>This method is not type-safe, as it may be called on elements that are not mutually
2131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * comparable.
2141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
2151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @throws ClassCastException if the elements are not mutually comparable
2161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @throws NullPointerException if any of {@code elements} is null
2171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
2181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static <E> ImmutableSortedMultiset<E> copyOf(Iterator<? extends E> elements) {
2191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Hack around E not being a subtype of Comparable.
2201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Unsafe, see ImmutableSortedMultisetFauxverideShim.
2211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @SuppressWarnings("unchecked")
2221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Ordering<E> naturalOrder = (Ordering<E>) Ordering.<Comparable>natural();
2231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return copyOfInternal(naturalOrder, elements);
2241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
2271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns an immutable sorted multiset containing the given elements sorted by the given {@code
2281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Comparator}.
2291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
2301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @throws NullPointerException if {@code comparator} or any of {@code elements} is null
2311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
2321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static <E> ImmutableSortedMultiset<E> copyOf(
2331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Comparator<? super E> comparator, Iterator<? extends E> elements) {
2341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    checkNotNull(comparator);
2351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return copyOfInternal(comparator, elements);
2361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
2391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns an immutable sorted multiset containing the given elements sorted by the given {@code
2401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Comparator}. This method iterates over {@code elements} at most once.
2411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
2421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p>Despite the method name, this method attempts to avoid actually copying the data when it is
2431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * safe to do so. The exact circumstances under which a copy will or will not be performed are
2441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * undocumented and subject to change.
2451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
2461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @throws NullPointerException if {@code comparator} or any of {@code elements} is null
2471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
2481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static <E> ImmutableSortedMultiset<E> copyOf(
2491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Comparator<? super E> comparator, Iterable<? extends E> elements) {
2501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    checkNotNull(comparator);
2511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return copyOfInternal(comparator, elements);
2521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
2551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns an immutable sorted multiset containing the elements of a sorted multiset, sorted by
2561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * the same {@code Comparator}. That behavior differs from {@link #copyOf(Iterable)}, which
2571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * always uses the natural ordering of the elements.
2581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
2591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p>Despite the method name, this method attempts to avoid actually copying the data when it is
2601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * safe to do so. The exact circumstances under which a copy will or will not be performed are
2611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * undocumented and subject to change.
2621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
2631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p>This method is safe to use even when {@code sortedMultiset} is a synchronized or concurrent
2641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * collection that is currently being modified by another thread.
2651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
2661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @throws NullPointerException if {@code sortedMultiset} or any of its elements is null
2671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
2681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @SuppressWarnings("unchecked")
2691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static <E> ImmutableSortedMultiset<E> copyOfSorted(SortedMultiset<E> sortedMultiset) {
2701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Comparator<? super E> comparator = sortedMultiset.comparator();
2711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    if (comparator == null) {
2721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      comparator = (Comparator<? super E>) NATURAL_ORDER;
2731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return copyOfInternal(comparator, sortedMultiset);
2751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @SuppressWarnings("unchecked")
2781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static <E> ImmutableSortedMultiset<E> copyOfInternal(
2791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Comparator<? super E> comparator, Iterable<? extends E> iterable) {
2801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    if (SortedIterables.hasSameComparator(comparator, iterable)
2811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        && iterable instanceof ImmutableSortedMultiset<?>) {
2821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      ImmutableSortedMultiset<E> multiset = (ImmutableSortedMultiset<E>) iterable;
2831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      if (!multiset.isPartialView()) {
2841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return (ImmutableSortedMultiset<E>) iterable;
2851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
2861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableList<Entry<E>> entries =
2881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        (ImmutableList) ImmutableList.copyOf(SortedIterables.sortedCounts(comparator, iterable));
2891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    if (entries.isEmpty()) {
2901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return emptyMultiset(comparator);
2911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    verifyEntries(entries);
2931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return RegularImmutableSortedMultiset.createFromSorted(comparator, entries);
2941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static <E> ImmutableSortedMultiset<E> copyOfInternal(
2971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Comparator<? super E> comparator, Iterator<? extends E> iterator) {
2981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @SuppressWarnings("unchecked") // We can safely cast from IL<Entry<? extends E>> to IL<Entry<E>>
2991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableList<Entry<E>> entries =
3001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        (ImmutableList) ImmutableList.copyOf(SortedIterables.sortedCounts(comparator, iterator));
3011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    if (entries.isEmpty()) {
3021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return emptyMultiset(comparator);
3031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    verifyEntries(entries);
3051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return RegularImmutableSortedMultiset.createFromSorted(comparator, entries);
3061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static <E> void verifyEntries(Collection<Entry<E>> entries) {
3091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (Entry<E> entry : entries) {
3101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      checkNotNull(entry.getElement());
3111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @SuppressWarnings("unchecked")
3151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  static <E> ImmutableSortedMultiset<E> emptyMultiset(Comparator<? super E> comparator) {
3161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    if (NATURAL_ORDER.equals(comparator)) {
3171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return (ImmutableSortedMultiset) NATURAL_EMPTY_MULTISET;
3181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return new EmptyImmutableSortedMultiset<E>(comparator);
3201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private final transient Comparator<? super E> comparator;
3231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  ImmutableSortedMultiset(Comparator<? super E> comparator) {
3251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    this.comparator = checkNotNull(comparator);
3261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override
3291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public Comparator<? super E> comparator() {
3301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return comparator;
3311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  // Pretend the comparator can compare anything. If it turns out it can't
3341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  // compare two elements, it'll throw a CCE. Only methods that are specified to
3351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  // throw CCE should call this.
3361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @SuppressWarnings("unchecked")
3371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  Comparator<Object> unsafeComparator() {
3381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return (Comparator<Object>) comparator;
3391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private transient Comparator<? super E> reverseComparator;
3421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  Comparator<? super E> reverseComparator() {
3441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Comparator<? super E> result = reverseComparator;
3451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    if (result == null) {
3461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return reverseComparator = Ordering.from(comparator).<E>reverse();
3471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return result;
3491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private transient ImmutableSortedSet<E> elementSet;
3521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override
3541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public ImmutableSortedSet<E> elementSet() {
3551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableSortedSet<E> result = elementSet;
3561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    if (result == null) {
3571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return elementSet = createElementSet();
3581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return result;
3601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  abstract ImmutableSortedSet<E> createElementSet();
3631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  abstract ImmutableSortedSet<E> createDescendingElementSet();
3651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  transient ImmutableSortedMultiset<E> descendingMultiset;
3671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override
3691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public ImmutableSortedMultiset<E> descendingMultiset() {
3701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableSortedMultiset<E> result = descendingMultiset;
3711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    if (result == null) {
3721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return descendingMultiset = new DescendingImmutableSortedMultiset<E>(this);
3731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return result;
3751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  abstract UnmodifiableIterator<Entry<E>> descendingEntryIterator();
3781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
3801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * {@inheritDoc}
3811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
3821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p>This implementation is guaranteed to throw an {@link UnsupportedOperationException}.
3831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
3841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override
3851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public final Entry<E> pollFirstEntry() {
3861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    throw new UnsupportedOperationException();
3871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
3901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * {@inheritDoc}
3911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
3921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p>This implementation is guaranteed to throw an {@link UnsupportedOperationException}.
3931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
3941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override
3951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public Entry<E> pollLastEntry() {
3961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    throw new UnsupportedOperationException();
3971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override
4001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public abstract ImmutableSortedMultiset<E> headMultiset(E upperBound, BoundType boundType);
4011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override
4031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public ImmutableSortedMultiset<E> subMultiset(
4041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      E lowerBound, BoundType lowerBoundType, E upperBound, BoundType upperBoundType) {
4051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return tailMultiset(lowerBound, lowerBoundType).headMultiset(upperBound, upperBoundType);
4061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override
4091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public abstract ImmutableSortedMultiset<E> tailMultiset(E lowerBound, BoundType boundType);
4101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
4121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns a builder that creates immutable sorted multisets with an explicit comparator. If the
4131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * comparator has a more general type than the set being generated, such as creating a {@code
4141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * SortedMultiset<Integer>} with a {@code Comparator<Number>}, use the {@link Builder}
4151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * constructor instead.
4161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
4171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @throws NullPointerException if {@code comparator} is null
4181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
4191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static <E> Builder<E> orderedBy(Comparator<E> comparator) {
4201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return new Builder<E>(comparator);
4211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
4241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns a builder that creates immutable sorted multisets whose elements are ordered by the
4251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * reverse of their natural ordering.
4261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
4271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p>Note: the type parameter {@code E} extends {@code Comparable<E>} rather than {@code
4281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Comparable<? super E>} as a workaround for javac <a
4291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6468354">bug 6468354</a>.
4301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
4311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static <E extends Comparable<E>> Builder<E> reverseOrder() {
4321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return new Builder<E>(Ordering.natural().reverse());
4331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
4361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns a builder that creates immutable sorted multisets whose elements are ordered by their
4371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * natural ordering. The sorted multisets use {@link Ordering#natural()} as the comparator. This
4381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * method provides more type-safety than {@link #builder}, as it can be called only for classes
4391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * that implement {@link Comparable}.
4401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
4411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p>Note: the type parameter {@code E} extends {@code Comparable<E>} rather than {@code
4421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Comparable<? super E>} as a workaround for javac <a
4431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6468354">bug 6468354</a>.
4441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
4451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static <E extends Comparable<E>> Builder<E> naturalOrder() {
4461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return new Builder<E>(Ordering.natural());
4471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
4501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * A builder for creating immutable multiset instances, especially {@code public static final}
4511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * multisets ("constant multisets"). Example:
4521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
4531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <pre> {@code
4541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
4551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *   public static final ImmutableSortedMultiset<Bean> BEANS =
4561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *       new ImmutableSortedMultiset.Builder<Bean>()
4571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *           .addCopies(Bean.COCOA, 4)
4581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *           .addCopies(Bean.GARDEN, 6)
4591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *           .addCopies(Bean.RED, 8)
4601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *           .addCopies(Bean.BLACK_EYED, 10)
4611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *           .build();}</pre>
4621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
4631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Builder instances can be reused; it is safe to call {@link #build} multiple times to build
4641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * multiple multisets in series.
4651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
4661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static class Builder<E> extends ImmutableMultiset.Builder<E> {
4671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    private final Comparator<? super E> comparator;
4681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    /**
4701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     * Creates a new builder. The returned builder is equivalent to the builder generated by
4711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     * {@link ImmutableSortedMultiset#orderedBy(Comparator)}.
4721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     */
4731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public Builder(Comparator<? super E> comparator) {
4741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      super(TreeMultiset.<E>create(comparator));
4751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      this.comparator = checkNotNull(comparator);
4761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
4771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    /**
4791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     * Adds {@code element} to the {@code ImmutableSortedMultiset}.
4801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     *
4811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     * @param element the element to add
4821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     * @return this {@code Builder} object
4831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     * @throws NullPointerException if {@code element} is null
4841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     */
4851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override
4861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public Builder<E> add(E element) {
4871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      super.add(element);
4881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return this;
4891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
4901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    /**
4921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     * Adds a number of occurrences of an element to this {@code ImmutableSortedMultiset}.
4931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     *
4941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     * @param element the element to add
4951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     * @param occurrences the number of occurrences of the element to add. May be zero, in which
4961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     *        case no change will be made.
4971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     * @return this {@code Builder} object
4981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     * @throws NullPointerException if {@code element} is null
4991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     * @throws IllegalArgumentException if {@code occurrences} is negative, or if this operation
5001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     *         would result in more than {@link Integer#MAX_VALUE} occurrences of the element
5011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     */
5021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override
5031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public Builder<E> addCopies(E element, int occurrences) {
5041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      super.addCopies(element, occurrences);
5051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return this;
5061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
5071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    /**
5091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     * Adds or removes the necessary occurrences of an element such that the element attains the
5101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     * desired count.
5111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     *
5121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     * @param element the element to add or remove occurrences of
5131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     * @param count the desired count of the element in this multiset
5141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     * @return this {@code Builder} object
5151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     * @throws NullPointerException if {@code element} is null
5161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     * @throws IllegalArgumentException if {@code count} is negative
5171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     */
5181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override
5191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public Builder<E> setCount(E element, int count) {
5201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      super.setCount(element, count);
5211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return this;
5221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
5231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    /**
5251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     * Adds each element of {@code elements} to the {@code ImmutableSortedMultiset}.
5261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     *
5271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     * @param elements the elements to add
5281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     * @return this {@code Builder} object
5291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     * @throws NullPointerException if {@code elements} is null or contains a null element
5301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     */
5311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override
5321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public Builder<E> add(E... elements) {
5331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      super.add(elements);
5341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return this;
5351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
5361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    /**
5381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     * Adds each element of {@code elements} to the {@code ImmutableSortedMultiset}.
5391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     *
5401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     * @param elements the {@code Iterable} to add to the {@code ImmutableSortedMultiset}
5411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     * @return this {@code Builder} object
5421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     * @throws NullPointerException if {@code elements} is null or contains a null element
5431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     */
5441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override
5451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public Builder<E> addAll(Iterable<? extends E> elements) {
5461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      super.addAll(elements);
5471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return this;
5481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
5491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    /**
5511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     * Adds each element of {@code elements} to the {@code ImmutableSortedMultiset}.
5521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     *
5531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     * @param elements the elements to add to the {@code ImmutableSortedMultiset}
5541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     * @return this {@code Builder} object
5551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     * @throws NullPointerException if {@code elements} is null or contains a null element
5561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     */
5571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override
5581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public Builder<E> addAll(Iterator<? extends E> elements) {
5591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      super.addAll(elements);
5601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return this;
5611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
5621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    /**
5641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     * Returns a newly-created {@code ImmutableSortedMultiset} based on the contents of the {@code
5651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     * Builder}.
5661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     */
5671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override
5681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public ImmutableSortedMultiset<E> build() {
5691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return copyOf(comparator, contents);
5701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
5711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static final class SerializedForm implements Serializable {
5741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Comparator comparator;
5751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Object[] elements;
5761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    int[] counts;
5771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SerializedForm(SortedMultiset<?> multiset) {
5791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      this.comparator = multiset.comparator();
5801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      int n = multiset.entrySet().size();
5811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      elements = new Object[n];
5821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      counts = new int[n];
5831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      int i = 0;
5841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      for (Entry<?> entry : multiset.entrySet()) {
5851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        elements[i] = entry.getElement();
5861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        counts[i] = entry.getCount();
5871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        i++;
5881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
5891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
5901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @SuppressWarnings("unchecked")
5921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Object readResolve() {
5931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      int n = elements.length;
5941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Builder<Object> builder = orderedBy(comparator);
5951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      for (int i = 0; i < n; i++) {
5961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        builder.addCopies(elements[i], counts[i]);
5971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
5981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return builder.build();
5991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
6001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override
6031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  Object writeReplace() {
6041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return new SerializedForm(this);
6051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert}
607