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