11d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/*
21d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Copyright (C) 2007 The Guava Authors
31d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
41d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Licensed under the Apache License, Version 2.0 (the "License");
51d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * you may not use this file except in compliance with the License.
61d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * You may obtain a copy of the License at
71d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
81d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * http://www.apache.org/licenses/LICENSE-2.0
91d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Unless required by applicable law or agreed to in writing, software
111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * distributed under the License is distributed on an "AS IS" BASIS,
121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * See the License for the specific language governing permissions and
141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * limitations under the License.
151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpackage com.google.common.collect;
181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.GwtCompatible;
201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.base.Objects;
211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Collection;
231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Iterator;
241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport javax.annotation.Nullable;
261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/**
281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * A collection which forwards all its method calls to another collection.
291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Subclasses should override one or more methods to modify the behavior of the
301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * backing collection as desired per the <a
311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * href="http://en.wikipedia.org/wiki/Decorator_pattern">decorator pattern</a>.
321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p><b>Warning:</b> The methods of {@code ForwardingCollection} forward
341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <b>indiscriminately</b> to the methods of the delegate. For example,
351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * overriding {@link #add} alone <b>will not</b> change the behavior of {@link
361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * #addAll}, which can lead to unexpected behavior. In this case, you should
371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * override {@code addAll} as well, either providing your own implementation, or
381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * delegating to the provided {@code standardAddAll} method.
391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>The {@code standard} methods are not guaranteed to be thread-safe, even
411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * when all of the methods that they depend on are thread-safe.
421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Kevin Bourrillion
441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Louis Wasserman
451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @since 2.0 (imported from Google Collections Library)
461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert@GwtCompatible
480888a09821a98ac0680fad765217302858e70fa4Paul Duffinpublic abstract class ForwardingCollection<E> extends ForwardingObject
490888a09821a98ac0680fad765217302858e70fa4Paul Duffin    implements Collection<E> {
501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  // TODO(user): identify places where thread safety is actually lost
511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /** Constructor for use by subclasses. */
531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  protected ForwardingCollection() {}
541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
550888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Override protected abstract Collection<E> delegate();
567dd252788645e940eada959bdde927426e2531c9Paul Duffin
570888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Override
581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public Iterator<E> iterator() {
591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return delegate().iterator();
601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
620888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Override
631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public int size() {
641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return delegate().size();
651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
670888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Override
681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public boolean removeAll(Collection<?> collection) {
691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return delegate().removeAll(collection);
701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
720888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Override
731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public boolean isEmpty() {
741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return delegate().isEmpty();
751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
770888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Override
781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public boolean contains(Object object) {
791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return delegate().contains(object);
801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
820888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Override
831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public boolean add(E element) {
841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return delegate().add(element);
851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
870888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Override
881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public boolean remove(Object object) {
891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return delegate().remove(object);
901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
920888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Override
931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public boolean containsAll(Collection<?> collection) {
941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return delegate().containsAll(collection);
951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
970888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Override
981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public boolean addAll(Collection<? extends E> collection) {
991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return delegate().addAll(collection);
1001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1020888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Override
1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public boolean retainAll(Collection<?> collection) {
1041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return delegate().retainAll(collection);
1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1070888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Override
1081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void clear() {
1091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    delegate().clear();
1101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1120888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Override
1131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public Object[] toArray() {
1141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return delegate().toArray();
1151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1170888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Override
1181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public <T> T[] toArray(T[] array) {
1191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return delegate().toArray(array);
1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
1231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * A sensible definition of {@link #contains} in terms of {@link #iterator}.
1241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * If you override {@link #iterator}, you may wish to override {@link
1251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * #contains} to forward to this implementation.
1261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
1271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @since 7.0
1281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
1297dd252788645e940eada959bdde927426e2531c9Paul Duffin  protected boolean standardContains(@Nullable Object object) {
1301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return Iterators.contains(iterator(), object);
1311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
1341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * A sensible definition of {@link #containsAll} in terms of {@link #contains}
1351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * . If you override {@link #contains}, you may wish to override {@link
1361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * #containsAll} to forward to this implementation.
1371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
1381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @since 7.0
1391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
1407dd252788645e940eada959bdde927426e2531c9Paul Duffin  protected boolean standardContainsAll(Collection<?> collection) {
1410888a09821a98ac0680fad765217302858e70fa4Paul Duffin    return Collections2.containsAllImpl(this, collection);
1421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
1451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * A sensible definition of {@link #addAll} in terms of {@link #add}. If you
1461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * override {@link #add}, you may wish to override {@link #addAll} to forward
1471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * to this implementation.
1481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
1491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @since 7.0
1501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
1517dd252788645e940eada959bdde927426e2531c9Paul Duffin  protected boolean standardAddAll(Collection<? extends E> collection) {
1521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return Iterators.addAll(this, collection.iterator());
1531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
1561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * A sensible definition of {@link #remove} in terms of {@link #iterator},
1571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * using the iterator's {@code remove} method. If you override {@link
1581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * #iterator}, you may wish to override {@link #remove} to forward to this
1591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * implementation.
1601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
1611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @since 7.0
1621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
1637dd252788645e940eada959bdde927426e2531c9Paul Duffin  protected boolean standardRemove(@Nullable Object object) {
1641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<E> iterator = iterator();
1651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    while (iterator.hasNext()) {
1661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      if (Objects.equal(iterator.next(), object)) {
1671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        iterator.remove();
1681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return true;
1691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
1701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return false;
1721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
1751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * A sensible definition of {@link #removeAll} in terms of {@link #iterator},
1761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * using the iterator's {@code remove} method. If you override {@link
1771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * #iterator}, you may wish to override {@link #removeAll} to forward to this
1781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * implementation.
1791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
1801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @since 7.0
1811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
1827dd252788645e940eada959bdde927426e2531c9Paul Duffin  protected boolean standardRemoveAll(Collection<?> collection) {
1831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return Iterators.removeAll(iterator(), collection);
1841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
1871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * A sensible definition of {@link #retainAll} in terms of {@link #iterator},
1881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * using the iterator's {@code remove} method. If you override {@link
1891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * #iterator}, you may wish to override {@link #retainAll} to forward to this
1901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * implementation.
1911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
1921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @since 7.0
1931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
1947dd252788645e940eada959bdde927426e2531c9Paul Duffin  protected boolean standardRetainAll(Collection<?> collection) {
1951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return Iterators.retainAll(iterator(), collection);
1961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
1991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * A sensible definition of {@link #clear} in terms of {@link #iterator},
2001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * using the iterator's {@code remove} method. If you override {@link
2011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * #iterator}, you may wish to override {@link #clear} to forward to this
2021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * implementation.
2031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
2041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @since 7.0
2051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
2067dd252788645e940eada959bdde927426e2531c9Paul Duffin  protected void standardClear() {
2077dd252788645e940eada959bdde927426e2531c9Paul Duffin    Iterators.clear(iterator());
2081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
2111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * A sensible definition of {@link #isEmpty} as {@code !iterator().hasNext}.
2121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * If you override {@link #isEmpty}, you may wish to override {@link #isEmpty}
2131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * to forward to this implementation. Alternately, it may be more efficient to
2141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * implement {@code isEmpty} as {@code size() == 0}.
2151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
2161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @since 7.0
2171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
2187dd252788645e940eada959bdde927426e2531c9Paul Duffin  protected boolean standardIsEmpty() {
2191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return !iterator().hasNext();
2201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
2231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * A sensible definition of {@link #toString} in terms of {@link #iterator}.
2241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * If you override {@link #iterator}, you may wish to override {@link
2251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * #toString} to forward to this implementation.
2261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
2271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @since 7.0
2281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
2297dd252788645e940eada959bdde927426e2531c9Paul Duffin  protected String standardToString() {
2301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return Collections2.toStringImpl(this);
2311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
2341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * A sensible definition of {@link #toArray()} in terms of {@link
2351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * #toArray(Object[])}. If you override {@link #toArray(Object[])}, you may
2361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * wish to override {@link #toArray} to forward to this implementation.
2371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
2381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @since 7.0
2391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
2407dd252788645e940eada959bdde927426e2531c9Paul Duffin  protected Object[] standardToArray() {
2411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Object[] newArray = new Object[size()];
2421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return toArray(newArray);
2431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
2461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * A sensible definition of {@link #toArray(Object[])} in terms of {@link
2471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * #size} and {@link #iterator}. If you override either of these methods, you
2481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * may wish to override {@link #toArray} to forward to this implementation.
2491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
2501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @since 7.0
2511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
2527dd252788645e940eada959bdde927426e2531c9Paul Duffin  protected <T> T[] standardToArray(T[] array) {
2531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return ObjectArrays.toArrayImpl(this, array);
2541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert}
256