10888a09821a98ac0680fad765217302858e70fa4Paul Duffin/* 20888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Copyright (C) 2011 The Guava Authors 30888a09821a98ac0680fad765217302858e70fa4Paul Duffin * 40888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Licensed under the Apache License, Version 2.0 (the "License"); you may not 50888a09821a98ac0680fad765217302858e70fa4Paul Duffin * use this file except in compliance with the License. You may obtain a copy of 60888a09821a98ac0680fad765217302858e70fa4Paul Duffin * the License at 70888a09821a98ac0680fad765217302858e70fa4Paul Duffin * 80888a09821a98ac0680fad765217302858e70fa4Paul Duffin * http://www.apache.org/licenses/LICENSE-2.0 90888a09821a98ac0680fad765217302858e70fa4Paul Duffin * 100888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Unless required by applicable law or agreed to in writing, software 110888a09821a98ac0680fad765217302858e70fa4Paul Duffin * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 120888a09821a98ac0680fad765217302858e70fa4Paul Duffin * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 130888a09821a98ac0680fad765217302858e70fa4Paul Duffin * License for the specific language governing permissions and limitations under 140888a09821a98ac0680fad765217302858e70fa4Paul Duffin * the License. 150888a09821a98ac0680fad765217302858e70fa4Paul Duffin */ 160888a09821a98ac0680fad765217302858e70fa4Paul Duffin 170888a09821a98ac0680fad765217302858e70fa4Paul Duffinpackage com.google.common.collect; 180888a09821a98ac0680fad765217302858e70fa4Paul Duffin 190888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport static com.google.common.collect.BoundType.CLOSED; 200888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport static com.google.common.collect.BoundType.OPEN; 210888a09821a98ac0680fad765217302858e70fa4Paul Duffin 220888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport com.google.common.annotations.GwtCompatible; 230888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport com.google.common.collect.Multiset.Entry; 240888a09821a98ac0680fad765217302858e70fa4Paul Duffin 250888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport java.util.Comparator; 260888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport java.util.NoSuchElementException; 270888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport java.util.SortedSet; 280888a09821a98ac0680fad765217302858e70fa4Paul Duffin 290888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport javax.annotation.Nullable; 300888a09821a98ac0680fad765217302858e70fa4Paul Duffin 310888a09821a98ac0680fad765217302858e70fa4Paul Duffin/** 320888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Provides static utility methods for creating and working with 330888a09821a98ac0680fad765217302858e70fa4Paul Duffin * {@link SortedMultiset} instances. 340888a09821a98ac0680fad765217302858e70fa4Paul Duffin * 350888a09821a98ac0680fad765217302858e70fa4Paul Duffin * @author Louis Wasserman 360888a09821a98ac0680fad765217302858e70fa4Paul Duffin */ 370888a09821a98ac0680fad765217302858e70fa4Paul Duffin@GwtCompatible(emulated = true) 380888a09821a98ac0680fad765217302858e70fa4Paul Duffinfinal class SortedMultisets { 390888a09821a98ac0680fad765217302858e70fa4Paul Duffin private SortedMultisets() { 400888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 410888a09821a98ac0680fad765217302858e70fa4Paul Duffin 420888a09821a98ac0680fad765217302858e70fa4Paul Duffin /** 430888a09821a98ac0680fad765217302858e70fa4Paul Duffin * A skeleton implementation for {@link SortedMultiset#elementSet}. 440888a09821a98ac0680fad765217302858e70fa4Paul Duffin */ 450888a09821a98ac0680fad765217302858e70fa4Paul Duffin static class ElementSet<E> extends Multisets.ElementSet<E> implements 460888a09821a98ac0680fad765217302858e70fa4Paul Duffin SortedSet<E> { 470888a09821a98ac0680fad765217302858e70fa4Paul Duffin private final SortedMultiset<E> multiset; 480888a09821a98ac0680fad765217302858e70fa4Paul Duffin 490888a09821a98ac0680fad765217302858e70fa4Paul Duffin ElementSet(SortedMultiset<E> multiset) { 500888a09821a98ac0680fad765217302858e70fa4Paul Duffin this.multiset = multiset; 510888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 520888a09821a98ac0680fad765217302858e70fa4Paul Duffin 530888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override final SortedMultiset<E> multiset() { 540888a09821a98ac0680fad765217302858e70fa4Paul Duffin return multiset; 550888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 560888a09821a98ac0680fad765217302858e70fa4Paul Duffin 570888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public Comparator<? super E> comparator() { 580888a09821a98ac0680fad765217302858e70fa4Paul Duffin return multiset().comparator(); 590888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 600888a09821a98ac0680fad765217302858e70fa4Paul Duffin 610888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public SortedSet<E> subSet(E fromElement, E toElement) { 620888a09821a98ac0680fad765217302858e70fa4Paul Duffin return multiset().subMultiset(fromElement, CLOSED, toElement, OPEN).elementSet(); 630888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 640888a09821a98ac0680fad765217302858e70fa4Paul Duffin 650888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public SortedSet<E> headSet(E toElement) { 660888a09821a98ac0680fad765217302858e70fa4Paul Duffin return multiset().headMultiset(toElement, OPEN).elementSet(); 670888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 680888a09821a98ac0680fad765217302858e70fa4Paul Duffin 690888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public SortedSet<E> tailSet(E fromElement) { 700888a09821a98ac0680fad765217302858e70fa4Paul Duffin return multiset().tailMultiset(fromElement, CLOSED).elementSet(); 710888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 720888a09821a98ac0680fad765217302858e70fa4Paul Duffin 730888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public E first() { 740888a09821a98ac0680fad765217302858e70fa4Paul Duffin return getElementOrThrow(multiset().firstEntry()); 750888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 760888a09821a98ac0680fad765217302858e70fa4Paul Duffin 770888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public E last() { 780888a09821a98ac0680fad765217302858e70fa4Paul Duffin return getElementOrThrow(multiset().lastEntry()); 790888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 800888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 810888a09821a98ac0680fad765217302858e70fa4Paul Duffin 820888a09821a98ac0680fad765217302858e70fa4Paul Duffin private static <E> E getElementOrThrow(Entry<E> entry) { 830888a09821a98ac0680fad765217302858e70fa4Paul Duffin if (entry == null) { 840888a09821a98ac0680fad765217302858e70fa4Paul Duffin throw new NoSuchElementException(); 850888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 860888a09821a98ac0680fad765217302858e70fa4Paul Duffin return entry.getElement(); 870888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 880888a09821a98ac0680fad765217302858e70fa4Paul Duffin 890888a09821a98ac0680fad765217302858e70fa4Paul Duffin private static <E> E getElementOrNull(@Nullable Entry<E> entry) { 900888a09821a98ac0680fad765217302858e70fa4Paul Duffin return (entry == null) ? null : entry.getElement(); 910888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 920888a09821a98ac0680fad765217302858e70fa4Paul Duffin} 930888a09821a98ac0680fad765217302858e70fa4Paul Duffin 94