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 use this file except
50888a09821a98ac0680fad765217302858e70fa4Paul Duffin * in compliance with the License. You may obtain a copy of the License at
60888a09821a98ac0680fad765217302858e70fa4Paul Duffin *
70888a09821a98ac0680fad765217302858e70fa4Paul Duffin * http://www.apache.org/licenses/LICENSE-2.0
80888a09821a98ac0680fad765217302858e70fa4Paul Duffin *
90888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Unless required by applicable law or agreed to in writing, software distributed under the
100888a09821a98ac0680fad765217302858e70fa4Paul Duffin * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
110888a09821a98ac0680fad765217302858e70fa4Paul Duffin * express or implied. See the License for the specific language governing permissions and
120888a09821a98ac0680fad765217302858e70fa4Paul Duffin * limitations under the License.
130888a09821a98ac0680fad765217302858e70fa4Paul Duffin */
140888a09821a98ac0680fad765217302858e70fa4Paul Duffin
150888a09821a98ac0680fad765217302858e70fa4Paul Duffinpackage com.google.common.collect;
160888a09821a98ac0680fad765217302858e70fa4Paul Duffin
170888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport com.google.common.annotations.Beta;
180888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport com.google.common.annotations.GwtCompatible;
190888a09821a98ac0680fad765217302858e70fa4Paul Duffin
200888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport java.util.Comparator;
210888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport java.util.Iterator;
220888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport java.util.SortedSet;
230888a09821a98ac0680fad765217302858e70fa4Paul Duffin
240888a09821a98ac0680fad765217302858e70fa4Paul Duffin/**
250888a09821a98ac0680fad765217302858e70fa4Paul Duffin * A sorted multiset which forwards all its method calls to another sorted multiset. Subclasses
260888a09821a98ac0680fad765217302858e70fa4Paul Duffin * should override one or more methods to modify the behavior of the backing multiset as desired
270888a09821a98ac0680fad765217302858e70fa4Paul Duffin * per the <a href="http://en.wikipedia.org/wiki/Decorator_pattern">decorator pattern</a>.
280888a09821a98ac0680fad765217302858e70fa4Paul Duffin *
290888a09821a98ac0680fad765217302858e70fa4Paul Duffin * <p><b>Warning:</b> The methods of {@code ForwardingSortedMultiset} forward
300888a09821a98ac0680fad765217302858e70fa4Paul Duffin * <b>indiscriminately</b> to the methods of the delegate. For example, overriding
310888a09821a98ac0680fad765217302858e70fa4Paul Duffin * {@link #add(Object, int)} alone <b>will not</b> change the behavior of {@link #add(Object)},
320888a09821a98ac0680fad765217302858e70fa4Paul Duffin * which can lead to unexpected behavior. In this case, you should override {@code add(Object)} as
330888a09821a98ac0680fad765217302858e70fa4Paul Duffin * well, either providing your own implementation, or delegating to the provided {@code
340888a09821a98ac0680fad765217302858e70fa4Paul Duffin * standardAdd} method.
350888a09821a98ac0680fad765217302858e70fa4Paul Duffin *
360888a09821a98ac0680fad765217302858e70fa4Paul Duffin * <p>The {@code standard} methods and any collection views they return are not guaranteed to be
370888a09821a98ac0680fad765217302858e70fa4Paul Duffin * thread-safe, even when all of the methods that they depend on are thread-safe.
380888a09821a98ac0680fad765217302858e70fa4Paul Duffin *
390888a09821a98ac0680fad765217302858e70fa4Paul Duffin * @author Louis Wasserman
400888a09821a98ac0680fad765217302858e70fa4Paul Duffin * @since 15.0
410888a09821a98ac0680fad765217302858e70fa4Paul Duffin */
420888a09821a98ac0680fad765217302858e70fa4Paul Duffin@Beta
430888a09821a98ac0680fad765217302858e70fa4Paul Duffin@GwtCompatible(emulated = true)
440888a09821a98ac0680fad765217302858e70fa4Paul Duffinpublic abstract class ForwardingSortedMultiset<E> extends ForwardingMultiset<E>
450888a09821a98ac0680fad765217302858e70fa4Paul Duffin    implements SortedMultiset<E> {
460888a09821a98ac0680fad765217302858e70fa4Paul Duffin  /** Constructor for use by subclasses. */
470888a09821a98ac0680fad765217302858e70fa4Paul Duffin  protected ForwardingSortedMultiset() {}
480888a09821a98ac0680fad765217302858e70fa4Paul Duffin
490888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Override
500888a09821a98ac0680fad765217302858e70fa4Paul Duffin  protected abstract SortedMultiset<E> delegate();
510888a09821a98ac0680fad765217302858e70fa4Paul Duffin
520888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Override
530888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public SortedSet<E> elementSet() {
540888a09821a98ac0680fad765217302858e70fa4Paul Duffin    return (SortedSet<E>) super.elementSet();
550888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
560888a09821a98ac0680fad765217302858e70fa4Paul Duffin
570888a09821a98ac0680fad765217302858e70fa4Paul Duffin  /**
580888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * A sensible implementation of {@link SortedMultiset#elementSet} in terms of the following
590888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * methods: {@link SortedMultiset#clear}, {@link SortedMultiset#comparator}, {@link
600888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * SortedMultiset#contains}, {@link SortedMultiset#containsAll}, {@link SortedMultiset#count},
610888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * {@link SortedMultiset#firstEntry} {@link SortedMultiset#headMultiset}, {@link
620888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * SortedMultiset#isEmpty}, {@link SortedMultiset#lastEntry}, {@link SortedMultiset#subMultiset},
630888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * {@link SortedMultiset#tailMultiset}, the {@code size()} and {@code iterator()} methods of
640888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * {@link SortedMultiset#entrySet}, and {@link SortedMultiset#remove(Object, int)}. In many
650888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * situations, you may wish to override {@link SortedMultiset#elementSet} to forward to this
660888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * implementation or a subclass thereof.
670888a09821a98ac0680fad765217302858e70fa4Paul Duffin   */
680888a09821a98ac0680fad765217302858e70fa4Paul Duffin  protected class StandardElementSet extends SortedMultisets.ElementSet<E> {
690888a09821a98ac0680fad765217302858e70fa4Paul Duffin    /** Constructor for use by subclasses. */
700888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public StandardElementSet() {
710888a09821a98ac0680fad765217302858e70fa4Paul Duffin      super(ForwardingSortedMultiset.this);
720888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
730888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
740888a09821a98ac0680fad765217302858e70fa4Paul Duffin
750888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Override
760888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public Comparator<? super E> comparator() {
770888a09821a98ac0680fad765217302858e70fa4Paul Duffin    return delegate().comparator();
780888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
790888a09821a98ac0680fad765217302858e70fa4Paul Duffin
800888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Override
810888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public SortedMultiset<E> descendingMultiset() {
820888a09821a98ac0680fad765217302858e70fa4Paul Duffin    return delegate().descendingMultiset();
830888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
840888a09821a98ac0680fad765217302858e70fa4Paul Duffin
850888a09821a98ac0680fad765217302858e70fa4Paul Duffin  /**
860888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * A skeleton implementation of a descending multiset view. Normally,
870888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * {@link #descendingMultiset()} will not reflect any changes you make to the behavior of methods
880888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * such as {@link #add(Object)} or {@link #pollFirstEntry}. This skeleton implementation
890888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * correctly delegates each of its operations to the appropriate methods of this {@code
900888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * ForwardingSortedMultiset}.
910888a09821a98ac0680fad765217302858e70fa4Paul Duffin   *
920888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * In many cases, you may wish to override {@link #descendingMultiset()} to return an instance of
930888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * a subclass of {@code StandardDescendingMultiset}.
940888a09821a98ac0680fad765217302858e70fa4Paul Duffin   */
950888a09821a98ac0680fad765217302858e70fa4Paul Duffin  protected abstract class StandardDescendingMultiset
960888a09821a98ac0680fad765217302858e70fa4Paul Duffin      extends DescendingMultiset<E> {
970888a09821a98ac0680fad765217302858e70fa4Paul Duffin    /** Constructor for use by subclasses. */
980888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public StandardDescendingMultiset() {}
990888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1000888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override
1010888a09821a98ac0680fad765217302858e70fa4Paul Duffin    SortedMultiset<E> forwardMultiset() {
1020888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return ForwardingSortedMultiset.this;
1030888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
1040888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
1050888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1060888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Override
1070888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public Entry<E> firstEntry() {
1080888a09821a98ac0680fad765217302858e70fa4Paul Duffin    return delegate().firstEntry();
1090888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
1100888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1110888a09821a98ac0680fad765217302858e70fa4Paul Duffin  /**
1120888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * A sensible definition of {@link #firstEntry()} in terms of {@code entrySet().iterator()}.
1130888a09821a98ac0680fad765217302858e70fa4Paul Duffin   *
1140888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * If you override {@link #entrySet()}, you may wish to override {@link #firstEntry()} to forward
1150888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * to this implementation.
1160888a09821a98ac0680fad765217302858e70fa4Paul Duffin   */
1170888a09821a98ac0680fad765217302858e70fa4Paul Duffin  protected Entry<E> standardFirstEntry() {
1180888a09821a98ac0680fad765217302858e70fa4Paul Duffin    Iterator<Entry<E>> entryIterator = entrySet().iterator();
1190888a09821a98ac0680fad765217302858e70fa4Paul Duffin    if (!entryIterator.hasNext()) {
1200888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return null;
1210888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
1220888a09821a98ac0680fad765217302858e70fa4Paul Duffin    Entry<E> entry = entryIterator.next();
1230888a09821a98ac0680fad765217302858e70fa4Paul Duffin    return Multisets.immutableEntry(entry.getElement(), entry.getCount());
1240888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
1250888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1260888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Override
1270888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public Entry<E> lastEntry() {
1280888a09821a98ac0680fad765217302858e70fa4Paul Duffin    return delegate().lastEntry();
1290888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
1300888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1310888a09821a98ac0680fad765217302858e70fa4Paul Duffin  /**
1320888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * A sensible definition of {@link #lastEntry()} in terms of {@code
1330888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * descendingMultiset().entrySet().iterator()}.
1340888a09821a98ac0680fad765217302858e70fa4Paul Duffin   *
1350888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * If you override {@link #descendingMultiset} or {@link #entrySet()}, you may wish to override
1360888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * {@link #firstEntry()} to forward to this implementation.
1370888a09821a98ac0680fad765217302858e70fa4Paul Duffin   */
1380888a09821a98ac0680fad765217302858e70fa4Paul Duffin  protected Entry<E> standardLastEntry() {
1390888a09821a98ac0680fad765217302858e70fa4Paul Duffin    Iterator<Entry<E>> entryIterator = descendingMultiset()
1400888a09821a98ac0680fad765217302858e70fa4Paul Duffin        .entrySet()
1410888a09821a98ac0680fad765217302858e70fa4Paul Duffin        .iterator();
1420888a09821a98ac0680fad765217302858e70fa4Paul Duffin    if (!entryIterator.hasNext()) {
1430888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return null;
1440888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
1450888a09821a98ac0680fad765217302858e70fa4Paul Duffin    Entry<E> entry = entryIterator.next();
1460888a09821a98ac0680fad765217302858e70fa4Paul Duffin    return Multisets.immutableEntry(entry.getElement(), entry.getCount());
1470888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
1480888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1490888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Override
1500888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public Entry<E> pollFirstEntry() {
1510888a09821a98ac0680fad765217302858e70fa4Paul Duffin    return delegate().pollFirstEntry();
1520888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
1530888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1540888a09821a98ac0680fad765217302858e70fa4Paul Duffin  /**
1550888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * A sensible definition of {@link #pollFirstEntry()} in terms of {@code entrySet().iterator()}.
1560888a09821a98ac0680fad765217302858e70fa4Paul Duffin   *
1570888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * If you override {@link #entrySet()}, you may wish to override {@link #pollFirstEntry()} to
1580888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * forward to this implementation.
1590888a09821a98ac0680fad765217302858e70fa4Paul Duffin   */
1600888a09821a98ac0680fad765217302858e70fa4Paul Duffin  protected Entry<E> standardPollFirstEntry() {
1610888a09821a98ac0680fad765217302858e70fa4Paul Duffin    Iterator<Entry<E>> entryIterator = entrySet().iterator();
1620888a09821a98ac0680fad765217302858e70fa4Paul Duffin    if (!entryIterator.hasNext()) {
1630888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return null;
1640888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
1650888a09821a98ac0680fad765217302858e70fa4Paul Duffin    Entry<E> entry = entryIterator.next();
1660888a09821a98ac0680fad765217302858e70fa4Paul Duffin    entry = Multisets.immutableEntry(entry.getElement(), entry.getCount());
1670888a09821a98ac0680fad765217302858e70fa4Paul Duffin    entryIterator.remove();
1680888a09821a98ac0680fad765217302858e70fa4Paul Duffin    return entry;
1690888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
1700888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1710888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Override
1720888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public Entry<E> pollLastEntry() {
1730888a09821a98ac0680fad765217302858e70fa4Paul Duffin    return delegate().pollLastEntry();
1740888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
1750888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1760888a09821a98ac0680fad765217302858e70fa4Paul Duffin  /**
1770888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * A sensible definition of {@link #pollLastEntry()} in terms of {@code
1780888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * descendingMultiset().entrySet().iterator()}.
1790888a09821a98ac0680fad765217302858e70fa4Paul Duffin   *
1800888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * If you override {@link #descendingMultiset()} or {@link #entrySet()}, you may wish to override
1810888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * {@link #pollLastEntry()} to forward to this implementation.
1820888a09821a98ac0680fad765217302858e70fa4Paul Duffin   */
1830888a09821a98ac0680fad765217302858e70fa4Paul Duffin  protected Entry<E> standardPollLastEntry() {
1840888a09821a98ac0680fad765217302858e70fa4Paul Duffin    Iterator<Entry<E>> entryIterator = descendingMultiset()
1850888a09821a98ac0680fad765217302858e70fa4Paul Duffin        .entrySet()
1860888a09821a98ac0680fad765217302858e70fa4Paul Duffin        .iterator();
1870888a09821a98ac0680fad765217302858e70fa4Paul Duffin    if (!entryIterator.hasNext()) {
1880888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return null;
1890888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
1900888a09821a98ac0680fad765217302858e70fa4Paul Duffin    Entry<E> entry = entryIterator.next();
1910888a09821a98ac0680fad765217302858e70fa4Paul Duffin    entry = Multisets.immutableEntry(entry.getElement(), entry.getCount());
1920888a09821a98ac0680fad765217302858e70fa4Paul Duffin    entryIterator.remove();
1930888a09821a98ac0680fad765217302858e70fa4Paul Duffin    return entry;
1940888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
1950888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1960888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Override
1970888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public SortedMultiset<E> headMultiset(E upperBound, BoundType boundType) {
1980888a09821a98ac0680fad765217302858e70fa4Paul Duffin    return delegate().headMultiset(upperBound, boundType);
1990888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
2000888a09821a98ac0680fad765217302858e70fa4Paul Duffin
2010888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Override
2020888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public SortedMultiset<E> subMultiset(
2030888a09821a98ac0680fad765217302858e70fa4Paul Duffin      E lowerBound, BoundType lowerBoundType, E upperBound, BoundType upperBoundType) {
2040888a09821a98ac0680fad765217302858e70fa4Paul Duffin    return delegate().subMultiset(lowerBound, lowerBoundType, upperBound, upperBoundType);
2050888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
2060888a09821a98ac0680fad765217302858e70fa4Paul Duffin
2070888a09821a98ac0680fad765217302858e70fa4Paul Duffin  /**
2080888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * A sensible definition of {@link #subMultiset(Object, BoundType, Object, BoundType)} in terms
2090888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * of {@link #headMultiset(Object, BoundType) headMultiset} and
2100888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * {@link #tailMultiset(Object, BoundType) tailMultiset}.
2110888a09821a98ac0680fad765217302858e70fa4Paul Duffin   *
2120888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * If you override either of these methods, you may wish to override
2130888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * {@link #subMultiset(Object, BoundType, Object, BoundType)} to forward to this implementation.
2140888a09821a98ac0680fad765217302858e70fa4Paul Duffin   */
2150888a09821a98ac0680fad765217302858e70fa4Paul Duffin  protected SortedMultiset<E> standardSubMultiset(
2160888a09821a98ac0680fad765217302858e70fa4Paul Duffin      E lowerBound, BoundType lowerBoundType, E upperBound, BoundType upperBoundType) {
2170888a09821a98ac0680fad765217302858e70fa4Paul Duffin    return tailMultiset(lowerBound, lowerBoundType).headMultiset(upperBound, upperBoundType);
2180888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
2190888a09821a98ac0680fad765217302858e70fa4Paul Duffin
2200888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Override
2210888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public SortedMultiset<E> tailMultiset(E lowerBound, BoundType boundType) {
2220888a09821a98ac0680fad765217302858e70fa4Paul Duffin    return delegate().tailMultiset(lowerBound, boundType);
2230888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
2240888a09821a98ac0680fad765217302858e70fa4Paul Duffin
2250888a09821a98ac0680fad765217302858e70fa4Paul Duffin}
226