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.Beta;
201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.GwtCompatible;
211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Collection;
231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Iterator;
241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.List;
251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.ListIterator;
261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport javax.annotation.Nullable;
281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/**
301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * A list which forwards all its method calls to another list. Subclasses should
311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * override one or more methods to modify the behavior of the backing list as
321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * desired per the <a
331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * href="http://en.wikipedia.org/wiki/Decorator_pattern">decorator pattern</a>.
341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>This class does not implement {@link java.util.RandomAccess}. If the
361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * delegate supports random access, the {@code ForwardingList} subclass should
371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * implement the {@code RandomAccess} interface.
381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p><b>Warning:</b> The methods of {@code ForwardingList} forward
401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <b>indiscriminately</b> to the methods of the delegate. For example,
411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * overriding {@link #add} alone <b>will not</b> change the behavior of {@link
421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * #addAll}, which can lead to unexpected behavior. In this case, you should
431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * override {@code addAll} as well, either providing your own implementation, or
441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * delegating to the provided {@code standardAddAll} method.
451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>The {@code standard} methods and any collection views they return are not
471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * guaranteed to be thread-safe, even when all of the methods that they depend
481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * on are thread-safe.
491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Mike Bostock
511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Louis Wasserman
521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @since 2.0 (imported from Google Collections Library)
531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert@GwtCompatible
551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic abstract class ForwardingList<E> extends ForwardingCollection<E>
561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    implements List<E> {
571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  // TODO(user): identify places where thread safety is actually lost
581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /** Constructor for use by subclasses. */
601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  protected ForwardingList() {}
611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override protected abstract List<E> delegate();
631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override
651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void add(int index, E element) {
661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    delegate().add(index, element);
671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override
701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public boolean addAll(int index, Collection<? extends E> elements) {
711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return delegate().addAll(index, elements);
721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override
751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public E get(int index) {
761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return delegate().get(index);
771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override
801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public int indexOf(Object element) {
811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return delegate().indexOf(element);
821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override
851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public int lastIndexOf(Object element) {
861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return delegate().lastIndexOf(element);
871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override
901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public ListIterator<E> listIterator() {
911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return delegate().listIterator();
921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override
951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public ListIterator<E> listIterator(int index) {
961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return delegate().listIterator(index);
971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override
1001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public E remove(int index) {
1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return delegate().remove(index);
1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override
1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public E set(int index, E element) {
1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return delegate().set(index, element);
1071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override
1101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public List<E> subList(int fromIndex, int toIndex) {
1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return delegate().subList(fromIndex, toIndex);
1121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override public boolean equals(@Nullable Object object) {
1151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return object == this || delegate().equals(object);
1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override public int hashCode() {
1191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return delegate().hashCode();
1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
1231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * A sensible default implementation of {@link #add(Object)}, in terms of
1241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * {@link #add(int, Object)}. If you override {@link #add(int, Object)}, you
1251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * may wish to override {@link #add(Object)} to forward to this
1261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * implementation.
1271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
1281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @since 7.0
1291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
1301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Beta protected boolean standardAdd(E element){
1311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    add(size(), element);
1321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return true;
1331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
1361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * A sensible default implementation of {@link #addAll(int, Collection)}, in
1371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * terms of the {@code add} method of {@link #listIterator(int)}. If you
1381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * override {@link #listIterator(int)}, you may wish to override {@link
1391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * #addAll(int, Collection)} to forward to this implementation.
1401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
1411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @since 7.0
1421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
1431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Beta protected boolean standardAddAll(
1441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      int index, Iterable<? extends E> elements) {
1451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return Lists.addAllImpl(this, index, elements);
1461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
1491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * A sensible default implementation of {@link #indexOf}, in terms of {@link
1501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * #listIterator()}. If you override {@link #listIterator()}, you may wish to
1511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * override {@link #indexOf} to forward to this implementation.
1521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
1531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @since 7.0
1541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
1551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Beta protected int standardIndexOf(@Nullable Object element) {
1561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return Lists.indexOfImpl(this, element);
1571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
1601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * A sensible default implementation of {@link #lastIndexOf}, in terms of
1611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * {@link #listIterator(int)}. If you override {@link #listIterator(int)}, you
1621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * may wish to override {@link #lastIndexOf} to forward to this
1631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * implementation.
1641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
1651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @since 7.0
1661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
1671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Beta protected int standardLastIndexOf(@Nullable Object element) {
1681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return Lists.lastIndexOfImpl(this, element);
1691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
1721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * A sensible default implementation of {@link #iterator}, in terms of
1731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * {@link #listIterator()}. If you override {@link #listIterator()}, you may
1741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * wish to override {@link #iterator} to forward to this implementation.
1751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
1761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @since 7.0
1771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
1781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Beta protected Iterator<E> standardIterator() {
1791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return listIterator();
1801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
1831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * A sensible default implementation of {@link #listIterator()}, in terms of
1841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * {@link #listIterator(int)}. If you override {@link #listIterator(int)}, you
1851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * may wish to override {@link #listIterator()} to forward to this
1861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * implementation.
1871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
1881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @since 7.0
1891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
1901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Beta protected ListIterator<E> standardListIterator(){
1911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return listIterator(0);
1921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
1951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * A sensible default implementation of {@link #listIterator(int)}, in terms
1961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * of {@link #size} and {@link #get(int)}. If you override either of these
1971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * methods you may wish to override {@link #listIterator(int)} to forward to
1981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * this implementation.
1991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
2001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @since 7.0
2011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
2021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Beta protected ListIterator<E> standardListIterator(int start) {
2031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return Lists.listIteratorImpl(this, start);
2041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
2071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * A sensible default implementation of {@link #subList(int, int)}. If you
2081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * override any other methods, you may wish to override {@link #subList(int,
2091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * int)} to forward to this implementation.
2101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
2111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @since 7.0
2121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
2131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Beta protected List<E> standardSubList(int fromIndex, int toIndex) {
2141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return Lists.subListImpl(this, fromIndex, toIndex);
2151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
2181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * A sensible definition of {@link #equals(Object)} in terms of {@link #size}
2191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * and {@link #iterator}. If you override either of those methods, you may
2201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * wish to override {@link #equals(Object)} to forward to this implementation.
2211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
2221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @since 7.0
2231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
2241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Beta protected boolean standardEquals(@Nullable Object object) {
2251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return Lists.equalsImpl(this, object);
2261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
2291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * A sensible definition of {@link #hashCode} in terms of {@link #iterator}.
2301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * If you override {@link #iterator}, you may wish to override {@link
2311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * #hashCode} to forward to this implementation.
2321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
2331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @since 7.0
2341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
2351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Beta protected int standardHashCode() {
2361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return Lists.hashCodeImpl(this);
2371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert}
239