001    /*
002     * Copyright (C) 2007 The Guava Authors
003     *
004     * Licensed under the Apache License, Version 2.0 (the "License");
005     * you may not use this file except in compliance with the License.
006     * You may obtain a copy of the License at
007     *
008     * http://www.apache.org/licenses/LICENSE-2.0
009     *
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS,
012     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013     * See the License for the specific language governing permissions and
014     * limitations under the License.
015     */
016    
017    package com.google.common.collect;
018    
019    import static com.google.common.base.Preconditions.checkArgument;
020    import static com.google.common.base.Preconditions.checkElementIndex;
021    import static com.google.common.base.Preconditions.checkNotNull;
022    import static com.google.common.base.Preconditions.checkPositionIndex;
023    import static com.google.common.base.Preconditions.checkPositionIndexes;
024    import static com.google.common.base.Preconditions.checkState;
025    
026    import com.google.common.annotations.Beta;
027    import com.google.common.annotations.GwtCompatible;
028    import com.google.common.annotations.VisibleForTesting;
029    import com.google.common.base.Function;
030    import com.google.common.base.Objects;
031    import com.google.common.primitives.Ints;
032    
033    import java.io.Serializable;
034    import java.util.AbstractList;
035    import java.util.AbstractSequentialList;
036    import java.util.ArrayList;
037    import java.util.Arrays;
038    import java.util.Collection;
039    import java.util.Collections;
040    import java.util.Iterator;
041    import java.util.LinkedList;
042    import java.util.List;
043    import java.util.ListIterator;
044    import java.util.NoSuchElementException;
045    import java.util.RandomAccess;
046    
047    import javax.annotation.Nullable;
048    
049    /**
050     * Static utility methods pertaining to {@link List} instances. Also see this
051     * class's counterparts {@link Sets} and {@link Maps}.
052     *
053     * @author Kevin Bourrillion
054     * @author Mike Bostock
055     * @author Louis Wasserman
056     * @since 2.0 (imported from Google Collections Library)
057     */
058    @GwtCompatible
059    public final class Lists {
060      private Lists() {}
061    
062      // ArrayList
063    
064      /**
065       * Creates a <i>mutable</i>, empty {@code ArrayList} instance.
066       *
067       * <p><b>Note:</b> if mutability is not required, use {@link
068       * ImmutableList#of()} instead.
069       *
070       * @return a new, empty {@code ArrayList}
071       */
072      @GwtCompatible(serializable = true)
073      public static <E> ArrayList<E> newArrayList() {
074        return new ArrayList<E>();
075      }
076    
077      /**
078       * Creates a <i>mutable</i> {@code ArrayList} instance containing the given
079       * elements.
080       *
081       * <p><b>Note:</b> if mutability is not required and the elements are
082       * non-null, use an overload of {@link ImmutableList#of()} (for varargs) or
083       * {@link ImmutableList#copyOf(Object[])} (for an array) instead.
084       *
085       * @param elements the elements that the list should contain, in order
086       * @return a new {@code ArrayList} containing those elements
087       */
088      @GwtCompatible(serializable = true)
089      public static <E> ArrayList<E> newArrayList(E... elements) {
090        checkNotNull(elements); // for GWT
091        // Avoid integer overflow when a large array is passed in
092        int capacity = computeArrayListCapacity(elements.length);
093        ArrayList<E> list = new ArrayList<E>(capacity);
094        Collections.addAll(list, elements);
095        return list;
096      }
097    
098      @VisibleForTesting static int computeArrayListCapacity(int arraySize) {
099        checkArgument(arraySize >= 0);
100    
101        // TODO(kevinb): Figure out the right behavior, and document it
102        return Ints.saturatedCast(5L + arraySize + (arraySize / 10));
103      }
104    
105      /**
106       * Creates a <i>mutable</i> {@code ArrayList} instance containing the given
107       * elements.
108       *
109       * <p><b>Note:</b> if mutability is not required and the elements are
110       * non-null, use {@link ImmutableList#copyOf(Iterator)} instead.
111       *
112       * @param elements the elements that the list should contain, in order
113       * @return a new {@code ArrayList} containing those elements
114       */
115      @GwtCompatible(serializable = true)
116      public static <E> ArrayList<E> newArrayList(Iterable<? extends E> elements) {
117        checkNotNull(elements); // for GWT
118        // Let ArrayList's sizing logic work, if possible
119        return (elements instanceof Collection)
120            ? new ArrayList<E>(Collections2.cast(elements))
121            : newArrayList(elements.iterator());
122      }
123    
124      /**
125       * Creates a <i>mutable</i> {@code ArrayList} instance containing the given
126       * elements.
127       *
128       * <p><b>Note:</b> if mutability is not required and the elements are
129       * non-null, use {@link ImmutableList#copyOf(Iterator)} instead.
130       *
131       * @param elements the elements that the list should contain, in order
132       * @return a new {@code ArrayList} containing those elements
133       */
134      @GwtCompatible(serializable = true)
135      public static <E> ArrayList<E> newArrayList(Iterator<? extends E> elements) {
136        checkNotNull(elements); // for GWT
137        ArrayList<E> list = newArrayList();
138        while (elements.hasNext()) {
139          list.add(elements.next());
140        }
141        return list;
142      }
143    
144      /**
145       * Creates an {@code ArrayList} instance backed by an array of the
146       * <i>exact</i> size specified; equivalent to
147       * {@link ArrayList#ArrayList(int)}.
148       *
149       * <p><b>Note:</b> if you know the exact size your list will be, consider
150       * using a fixed-size list ({@link Arrays#asList(Object[])}) or an {@link
151       * ImmutableList} instead of a growable {@link ArrayList}.
152       *
153       * <p><b>Note:</b> If you have only an <i>estimate</i> of the eventual size of
154       * the list, consider padding this estimate by a suitable amount, or simply
155       * use {@link #newArrayListWithExpectedSize(int)} instead.
156       *
157       * @param initialArraySize the exact size of the initial backing array for
158       *     the returned array list ({@code ArrayList} documentation calls this
159       *     value the "capacity")
160       * @return a new, empty {@code ArrayList} which is guaranteed not to resize
161       *     itself unless its size reaches {@code initialArraySize + 1}
162       * @throws IllegalArgumentException if {@code initialArraySize} is negative
163       */
164      @GwtCompatible(serializable = true)
165      public static <E> ArrayList<E> newArrayListWithCapacity(
166          int initialArraySize) {
167        checkArgument(initialArraySize >= 0);  // for GWT.
168        return new ArrayList<E>(initialArraySize);
169      }
170    
171      /**
172       * Creates an {@code ArrayList} instance sized appropriately to hold an
173       * <i>estimated</i> number of elements without resizing. A small amount of
174       * padding is added in case the estimate is low.
175       *
176       * <p><b>Note:</b> If you know the <i>exact</i> number of elements the list
177       * will hold, or prefer to calculate your own amount of padding, refer to
178       * {@link #newArrayListWithCapacity(int)}.
179       *
180       * @param estimatedSize an estimate of the eventual {@link List#size()} of
181       *     the new list
182       * @return a new, empty {@code ArrayList}, sized appropriately to hold the
183       *     estimated number of elements
184       * @throws IllegalArgumentException if {@code estimatedSize} is negative
185       */
186      @GwtCompatible(serializable = true)
187      public static <E> ArrayList<E> newArrayListWithExpectedSize(
188          int estimatedSize) {
189        return new ArrayList<E>(computeArrayListCapacity(estimatedSize));
190      }
191    
192      // LinkedList
193    
194      /**
195       * Creates an empty {@code LinkedList} instance.
196       *
197       * <p><b>Note:</b> if you need an immutable empty {@link List}, use
198       * {@link ImmutableList#of()} instead.
199       *
200       * @return a new, empty {@code LinkedList}
201       */
202      @GwtCompatible(serializable = true)
203      public static <E> LinkedList<E> newLinkedList() {
204        return new LinkedList<E>();
205      }
206    
207      /**
208       * Creates a {@code LinkedList} instance containing the given elements.
209       *
210       * @param elements the elements that the list should contain, in order
211       * @return a new {@code LinkedList} containing those elements
212       */
213      @GwtCompatible(serializable = true)
214      public static <E> LinkedList<E> newLinkedList(
215          Iterable<? extends E> elements) {
216        LinkedList<E> list = newLinkedList();
217        for (E element : elements) {
218          list.add(element);
219        }
220        return list;
221      }
222    
223      /**
224       * Returns an unmodifiable list containing the specified first element and
225       * backed by the specified array of additional elements. Changes to the {@code
226       * rest} array will be reflected in the returned list. Unlike {@link
227       * Arrays#asList}, the returned list is unmodifiable.
228       *
229       * <p>This is useful when a varargs method needs to use a signature such as
230       * {@code (Foo firstFoo, Foo... moreFoos)}, in order to avoid overload
231       * ambiguity or to enforce a minimum argument count.
232       *
233       * <p>The returned list is serializable and implements {@link RandomAccess}.
234       *
235       * @param first the first element
236       * @param rest an array of additional elements, possibly empty
237       * @return an unmodifiable list containing the specified elements
238       */
239      public static <E> List<E> asList(@Nullable E first, E[] rest) {
240        return new OnePlusArrayList<E>(first, rest);
241      }
242    
243      /** @see Lists#asList(Object, Object[]) */
244      private static class OnePlusArrayList<E> extends AbstractList<E>
245          implements Serializable, RandomAccess {
246        final E first;
247        final E[] rest;
248    
249        OnePlusArrayList(@Nullable E first, E[] rest) {
250          this.first = first;
251          this.rest = checkNotNull(rest);
252        }
253        @Override public int size() {
254          return rest.length + 1;
255        }
256        @Override public E get(int index) {
257          // check explicitly so the IOOBE will have the right message
258          checkElementIndex(index, size());
259          return (index == 0) ? first : rest[index - 1];
260        }
261        private static final long serialVersionUID = 0;
262      }
263    
264      /**
265       * Returns an unmodifiable list containing the specified first and second
266       * element, and backed by the specified array of additional elements. Changes
267       * to the {@code rest} array will be reflected in the returned list. Unlike
268       * {@link Arrays#asList}, the returned list is unmodifiable.
269       *
270       * <p>This is useful when a varargs method needs to use a signature such as
271       * {@code (Foo firstFoo, Foo secondFoo, Foo... moreFoos)}, in order to avoid
272       * overload ambiguity or to enforce a minimum argument count.
273       *
274       * <p>The returned list is serializable and implements {@link RandomAccess}.
275       *
276       * @param first the first element
277       * @param second the second element
278       * @param rest an array of additional elements, possibly empty
279       * @return an unmodifiable list containing the specified elements
280       */
281      public static <E> List<E> asList(
282          @Nullable E first, @Nullable E second, E[] rest) {
283        return new TwoPlusArrayList<E>(first, second, rest);
284      }
285    
286      /** @see Lists#asList(Object, Object, Object[]) */
287      private static class TwoPlusArrayList<E> extends AbstractList<E>
288          implements Serializable, RandomAccess {
289        final E first;
290        final E second;
291        final E[] rest;
292    
293        TwoPlusArrayList(@Nullable E first, @Nullable E second, E[] rest) {
294          this.first = first;
295          this.second = second;
296          this.rest = checkNotNull(rest);
297        }
298        @Override public int size() {
299          return rest.length + 2;
300        }
301        @Override public E get(int index) {
302          switch (index) {
303            case 0:
304              return first;
305            case 1:
306              return second;
307            default:
308              // check explicitly so the IOOBE will have the right message
309              checkElementIndex(index, size());
310              return rest[index - 2];
311          }
312        }
313        private static final long serialVersionUID = 0;
314      }
315    
316      /**
317       * Returns a list that applies {@code function} to each element of {@code
318       * fromList}. The returned list is a transformed view of {@code fromList};
319       * changes to {@code fromList} will be reflected in the returned list and vice
320       * versa.
321       *
322       * <p>Since functions are not reversible, the transform is one-way and new
323       * items cannot be stored in the returned list. The {@code add},
324       * {@code addAll} and {@code set} methods are unsupported in the returned
325       * list.
326       *
327       * <p>The function is applied lazily, invoked when needed. This is necessary
328       * for the returned list to be a view, but it means that the function will be
329       * applied many times for bulk operations like {@link List#contains} and
330       * {@link List#hashCode}. For this to perform well, {@code function} should be
331       * fast. To avoid lazy evaluation when the returned list doesn't need to be a
332       * view, copy the returned list into a new list of your choosing.
333       *
334       * <p>If {@code fromList} implements {@link RandomAccess}, so will the
335       * returned list. The returned list always implements {@link Serializable},
336       * but serialization will succeed only when {@code fromList} and
337       * {@code function} are serializable. The returned list is threadsafe if the
338       * supplied list and function are.
339       *
340       * <p>If only a {@code Collection} or {@code Iterable} input is available, use
341       * {@link Collections2#transform} or {@link Iterables#transform}.
342       */
343      public static <F, T> List<T> transform(
344          List<F> fromList, Function<? super F, ? extends T> function) {
345        return (fromList instanceof RandomAccess)
346            ? new TransformingRandomAccessList<F, T>(fromList, function)
347            : new TransformingSequentialList<F, T>(fromList, function);
348      }
349    
350      /**
351       * Implementation of a sequential transforming list.
352       *
353       * @see Lists#transform
354       */
355      private static class TransformingSequentialList<F, T>
356          extends AbstractSequentialList<T> implements Serializable {
357        final List<F> fromList;
358        final Function<? super F, ? extends T> function;
359    
360        TransformingSequentialList(
361            List<F> fromList, Function<? super F, ? extends T> function) {
362          this.fromList = checkNotNull(fromList);
363          this.function = checkNotNull(function);
364        }
365        /**
366         * The default implementation inherited is based on iteration and removal of
367         * each element which can be overkill. That's why we forward this call
368         * directly to the backing list.
369         */
370        @Override public void clear() {
371          fromList.clear();
372        }
373        @Override public int size() {
374          return fromList.size();
375        }
376        @Override public ListIterator<T> listIterator(final int index) {
377          final ListIterator<F> delegate = fromList.listIterator(index);
378          return new ListIterator<T>() {
379            @Override
380            public void add(T e) {
381              throw new UnsupportedOperationException();
382            }
383    
384            @Override
385            public boolean hasNext() {
386              return delegate.hasNext();
387            }
388    
389            @Override
390            public boolean hasPrevious() {
391              return delegate.hasPrevious();
392            }
393    
394            @Override
395            public T next() {
396              return function.apply(delegate.next());
397            }
398    
399            @Override
400            public int nextIndex() {
401              return delegate.nextIndex();
402            }
403    
404            @Override
405            public T previous() {
406              return function.apply(delegate.previous());
407            }
408    
409            @Override
410            public int previousIndex() {
411              return delegate.previousIndex();
412            }
413    
414            @Override
415            public void remove() {
416              delegate.remove();
417            }
418    
419            @Override
420            public void set(T e) {
421              throw new UnsupportedOperationException("not supported");
422            }
423          };
424        }
425    
426        private static final long serialVersionUID = 0;
427      }
428    
429      /**
430       * Implementation of a transforming random access list. We try to make as many
431       * of these methods pass-through to the source list as possible so that the
432       * performance characteristics of the source list and transformed list are
433       * similar.
434       *
435       * @see Lists#transform
436       */
437      private static class TransformingRandomAccessList<F, T>
438          extends AbstractList<T> implements RandomAccess, Serializable {
439        final List<F> fromList;
440        final Function<? super F, ? extends T> function;
441    
442        TransformingRandomAccessList(
443            List<F> fromList, Function<? super F, ? extends T> function) {
444          this.fromList = checkNotNull(fromList);
445          this.function = checkNotNull(function);
446        }
447        @Override public void clear() {
448          fromList.clear();
449        }
450        @Override public T get(int index) {
451          return function.apply(fromList.get(index));
452        }
453        @Override public boolean isEmpty() {
454          return fromList.isEmpty();
455        }
456        @Override public T remove(int index) {
457          return function.apply(fromList.remove(index));
458        }
459        @Override public int size() {
460          return fromList.size();
461        }
462        private static final long serialVersionUID = 0;
463      }
464    
465      /**
466       * Returns consecutive {@linkplain List#subList(int, int) sublists} of a list,
467       * each of the same size (the final list may be smaller). For example,
468       * partitioning a list containing {@code [a, b, c, d, e]} with a partition
469       * size of 3 yields {@code [[a, b, c], [d, e]]} -- an outer list containing
470       * two inner lists of three and two elements, all in the original order.
471       *
472       * <p>The outer list is unmodifiable, but reflects the latest state of the
473       * source list. The inner lists are sublist views of the original list,
474       * produced on demand using {@link List#subList(int, int)}, and are subject
475       * to all the usual caveats about modification as explained in that API.
476       *
477       * @param list the list to return consecutive sublists of
478       * @param size the desired size of each sublist (the last may be
479       *     smaller)
480       * @return a list of consecutive sublists
481       * @throws IllegalArgumentException if {@code partitionSize} is nonpositive
482       */
483      public static <T> List<List<T>> partition(List<T> list, int size) {
484        checkNotNull(list);
485        checkArgument(size > 0);
486        return (list instanceof RandomAccess)
487            ? new RandomAccessPartition<T>(list, size)
488            : new Partition<T>(list, size);
489      }
490    
491      private static class Partition<T> extends AbstractList<List<T>> {
492        final List<T> list;
493        final int size;
494    
495        Partition(List<T> list, int size) {
496          this.list = list;
497          this.size = size;
498        }
499    
500        @Override public List<T> get(int index) {
501          int listSize = size();
502          checkElementIndex(index, listSize);
503          int start = index * size;
504          int end = Math.min(start + size, list.size());
505          return list.subList(start, end);
506        }
507    
508        @Override public int size() {
509          // TODO(user): refactor to common.math.IntMath.divide
510          int result = list.size() / size;
511          if (result * size != list.size()) {
512            result++;
513          }
514          return result;
515        }
516    
517        @Override public boolean isEmpty() {
518          return list.isEmpty();
519        }
520      }
521    
522      private static class RandomAccessPartition<T> extends Partition<T>
523          implements RandomAccess {
524        RandomAccessPartition(List<T> list, int size) {
525          super(list, size);
526        }
527      }
528    
529      /**
530       * Returns a view of the specified string as an immutable list of {@code
531       * Character} values.
532       *
533       * @since 7.0
534       */
535      @Beta public static ImmutableList<Character> charactersOf(String string) {
536        return new StringAsImmutableList(checkNotNull(string));
537      }
538    
539      @SuppressWarnings("serial") // serialized using ImmutableList serialization
540      private static final class StringAsImmutableList
541          extends ImmutableList<Character> {
542    
543        private final String string;
544    
545        StringAsImmutableList(String string) {
546          this.string = string;
547        }
548    
549        @Override public boolean contains(@Nullable Object object) {
550          return indexOf(object) >= 0;
551        }
552    
553        @Override public int indexOf(@Nullable Object object) {
554          return (object instanceof Character)
555              ? string.indexOf((Character) object) : -1;
556        }
557    
558        @Override public int lastIndexOf(@Nullable Object object) {
559          return (object instanceof Character)
560              ? string.lastIndexOf((Character) object) : -1;
561        }
562    
563        @Override public UnmodifiableListIterator<Character> listIterator(
564            int index) {
565          return new AbstractIndexedListIterator<Character>(size(), index) {
566            @Override protected Character get(int index) {
567              return string.charAt(index);
568            }
569          };
570        }
571    
572        @Override public ImmutableList<Character> subList(
573            int fromIndex, int toIndex) {
574          return charactersOf(string.substring(fromIndex, toIndex));
575        }
576    
577        @Override boolean isPartialView() {
578          return false;
579        }
580    
581        @Override public Character get(int index) {
582          return string.charAt(index);
583        }
584    
585        @Override public int size() {
586          return string.length();
587        }
588    
589        @Override public boolean equals(@Nullable Object obj) {
590          if (!(obj instanceof List)) {
591            return false;
592          }
593          List<?> list = (List<?>) obj;
594          int n = string.length();
595          if (n != list.size()) {
596            return false;
597          }
598          Iterator<?> iterator = list.iterator();
599          for (int i = 0; i < n; i++) {
600            Object elem = iterator.next();
601            if (!(elem instanceof Character)
602                || ((Character) elem).charValue() != string.charAt(i)) {
603              return false;
604            }
605          }
606          return true;
607        }
608    
609        int hash = 0;
610    
611        @Override public int hashCode() {
612          int h = hash;
613          if (h == 0) {
614            h = 1;
615            for (int i = 0; i < string.length(); i++) {
616              h = h * 31 + string.charAt(i);
617            }
618            hash = h;
619          }
620          return h;
621        }
622      }
623    
624      /**
625       * Returns a view of the specified {@code CharSequence} as a {@code
626       * List<Character>}, viewing {@code sequence} as a sequence of Unicode code
627       * units. The view does not support any modification operations, but reflects
628       * any changes to the underlying character sequence.
629       *
630       * @param sequence the character sequence to view as a {@code List} of
631       *        characters
632       * @return an {@code List<Character>} view of the character sequence
633       * @since 7.0
634       */
635      @Beta public static List<Character> charactersOf(CharSequence sequence) {
636        return new CharSequenceAsList(checkNotNull(sequence));
637      }
638    
639      private static final class CharSequenceAsList
640          extends AbstractList<Character> {
641        private final CharSequence sequence;
642    
643        CharSequenceAsList(CharSequence sequence) {
644          this.sequence = sequence;
645        }
646    
647        @Override public Character get(int index) {
648          return sequence.charAt(index);
649        }
650    
651        @Override public boolean contains(@Nullable Object o) {
652          return indexOf(o) >= 0;
653        }
654    
655        @Override public int indexOf(@Nullable Object o) {
656          if (o instanceof Character) {
657            char c = (Character) o;
658            for (int i = 0; i < sequence.length(); i++) {
659              if (sequence.charAt(i) == c) {
660                return i;
661              }
662            }
663          }
664          return -1;
665        }
666    
667        @Override public int lastIndexOf(@Nullable Object o) {
668          if (o instanceof Character) {
669            char c = ((Character) o).charValue();
670            for (int i = sequence.length() - 1; i >= 0; i--) {
671              if (sequence.charAt(i) == c) {
672                return i;
673              }
674            }
675          }
676          return -1;
677        }
678    
679        @Override public int size() {
680          return sequence.length();
681        }
682    
683        @Override public List<Character> subList(int fromIndex, int toIndex) {
684          return charactersOf(sequence.subSequence(fromIndex, toIndex));
685        }
686    
687        @Override public int hashCode() {
688          int hash = 1;
689          for (int i = 0; i < sequence.length(); i++) {
690            hash = hash * 31 + sequence.charAt(i);
691          }
692          return hash;
693        }
694    
695        @Override public boolean equals(@Nullable Object o) {
696          if (!(o instanceof List)) {
697            return false;
698          }
699          List<?> list = (List<?>) o;
700          int n = sequence.length();
701          if (n != list.size()) {
702            return false;
703          }
704          Iterator<?> iterator = list.iterator();
705          for (int i = 0; i < n; i++) {
706            Object elem = iterator.next();
707            if (!(elem instanceof Character)
708                || ((Character) elem).charValue() != sequence.charAt(i)) {
709              return false;
710            }
711          }
712          return true;
713        }
714      }
715    
716      /**
717       * Returns a reversed view of the specified list. For example, {@code
718       * Lists.reverse(Arrays.asList(1, 2, 3))} returns a list containing {@code 3,
719       * 2, 1}. The returned list is backed by this list, so changes in the returned
720       * list are reflected in this list, and vice-versa. The returned list supports
721       * all of the optional list operations supported by this list.
722       *
723       * <p>The returned list is random-access if the specified list is random
724       * access.
725       *
726       * @since 7.0
727       */
728      public static <T> List<T> reverse(List<T> list) {
729        if (list instanceof ReverseList) {
730          return ((ReverseList<T>) list).getForwardList();
731        } else if (list instanceof RandomAccess) {
732          return new RandomAccessReverseList<T>(list);
733        } else {
734          return new ReverseList<T>(list);
735        }
736      }
737    
738      private static class ReverseList<T> extends AbstractList<T> {
739        private final List<T> forwardList;
740    
741        ReverseList(List<T> forwardList) {
742          this.forwardList = checkNotNull(forwardList);
743        }
744    
745        List<T> getForwardList() {
746          return forwardList;
747        }
748    
749        private int reverseIndex(int index) {
750          int size = size();
751          checkElementIndex(index, size);
752          return (size - 1) - index;
753        }
754    
755        private int reversePosition(int index) {
756          int size = size();
757          checkPositionIndex(index, size);
758          return size - index;
759        }
760    
761        @Override public void add(int index, @Nullable T element) {
762          forwardList.add(reversePosition(index), element);
763        }
764    
765        @Override public void clear() {
766          forwardList.clear();
767        }
768    
769        @Override public T remove(int index) {
770          return forwardList.remove(reverseIndex(index));
771        }
772    
773        @Override protected void removeRange(int fromIndex, int toIndex) {
774          subList(fromIndex, toIndex).clear();
775        }
776    
777        @Override public T set(int index, @Nullable T element) {
778          return forwardList.set(reverseIndex(index), element);
779        }
780    
781        @Override public T get(int index) {
782          return forwardList.get(reverseIndex(index));
783        }
784    
785        @Override public boolean isEmpty() {
786          return forwardList.isEmpty();
787        }
788    
789        @Override public int size() {
790          return forwardList.size();
791        }
792    
793        @Override public boolean contains(@Nullable Object o) {
794          return forwardList.contains(o);
795        }
796    
797        @Override public boolean containsAll(Collection<?> c) {
798          return forwardList.containsAll(c);
799        }
800    
801        @Override public List<T> subList(int fromIndex, int toIndex) {
802          checkPositionIndexes(fromIndex, toIndex, size());
803          return reverse(forwardList.subList(
804              reversePosition(toIndex), reversePosition(fromIndex)));
805        }
806    
807        @Override public int indexOf(@Nullable Object o) {
808          int index = forwardList.lastIndexOf(o);
809          return (index >= 0) ? reverseIndex(index) : -1;
810        }
811    
812        @Override public int lastIndexOf(@Nullable Object o) {
813          int index = forwardList.indexOf(o);
814          return (index >= 0) ? reverseIndex(index) : -1;
815        }
816    
817        @Override public Iterator<T> iterator() {
818          return listIterator();
819        }
820    
821        @Override public ListIterator<T> listIterator(int index) {
822          int start = reversePosition(index);
823          final ListIterator<T> forwardIterator = forwardList.listIterator(start);
824          return new ListIterator<T>() {
825    
826            boolean canRemove;
827            boolean canSet;
828    
829            @Override public void add(T e) {
830              forwardIterator.add(e);
831              forwardIterator.previous();
832              canSet = canRemove = false;
833            }
834    
835            @Override public boolean hasNext() {
836              return forwardIterator.hasPrevious();
837            }
838    
839            @Override public boolean hasPrevious() {
840              return forwardIterator.hasNext();
841            }
842    
843            @Override public T next() {
844              if (!hasNext()) {
845                throw new NoSuchElementException();
846              }
847              canSet = canRemove = true;
848              return forwardIterator.previous();
849            }
850    
851            @Override public int nextIndex() {
852              return reversePosition(forwardIterator.nextIndex());
853            }
854    
855            @Override public T previous() {
856              if (!hasPrevious()) {
857                throw new NoSuchElementException();
858              }
859              canSet = canRemove = true;
860              return forwardIterator.next();
861            }
862    
863            @Override public int previousIndex() {
864              return nextIndex() - 1;
865            }
866    
867            @Override public void remove() {
868              checkState(canRemove);
869              forwardIterator.remove();
870              canRemove = canSet = false;
871            }
872    
873            @Override public void set(T e) {
874              checkState(canSet);
875              forwardIterator.set(e);
876            }
877          };
878        }
879      }
880    
881      private static class RandomAccessReverseList<T> extends ReverseList<T>
882          implements RandomAccess {
883        RandomAccessReverseList(List<T> forwardList) {
884          super(forwardList);
885        }
886      }
887    
888      /**
889       * An implementation of {@link List#hashCode()}.
890       */
891      static int hashCodeImpl(List<?> list){
892        int hashCode = 1;
893        for (Object o : list) {
894          hashCode = 31 * hashCode + (o == null ? 0 : o.hashCode());
895        }
896        return hashCode;
897      }
898    
899      /**
900       * An implementation of {@link List#equals(Object)}.
901       */
902      static boolean equalsImpl(List<?> list, @Nullable Object object) {
903        if (object == checkNotNull(list)) {
904          return true;
905        }
906        if (!(object instanceof List)) {
907          return false;
908        }
909    
910        List<?> o = (List<?>) object;
911    
912        return list.size() == o.size()
913            && Iterators.elementsEqual(list.iterator(), o.iterator());
914      }
915    
916      /**
917       * An implementation of {@link List#addAll(int, Collection)}.
918       */
919      static <E> boolean addAllImpl(
920          List<E> list, int index, Iterable<? extends E> elements) {
921        boolean changed = false;
922        ListIterator<E> listIterator = list.listIterator(index);
923        for (E e : elements) {
924          listIterator.add(e);
925          changed = true;
926        }
927        return changed;
928      }
929    
930      /**
931       * An implementation of {@link List#indexOf(Object)}.
932       */
933      static int indexOfImpl(List<?> list, @Nullable Object element){
934        ListIterator<?> listIterator = list.listIterator();
935        while (listIterator.hasNext()) {
936          if (Objects.equal(element, listIterator.next())) {
937            return listIterator.previousIndex();
938          }
939        }
940        return -1;
941      }
942    
943      /**
944       * An implementation of {@link List#lastIndexOf(Object)}.
945       */
946      static int lastIndexOfImpl(List<?> list, @Nullable Object element){
947        ListIterator<?> listIterator = list.listIterator(list.size());
948        while (listIterator.hasPrevious()) {
949          if (Objects.equal(element, listIterator.previous())) {
950            return listIterator.nextIndex();
951          }
952        }
953        return -1;
954      }
955    
956      /**
957       * Returns an implementation of {@link List#listIterator(int)}.
958       */
959      static <E> ListIterator<E> listIteratorImpl(List<E> list, int index) {
960        return new AbstractListWrapper<E>(list).listIterator(index);
961      }
962    
963      /**
964       * An implementation of {@link List#subList(int, int)}.
965       */
966      static <E> List<E> subListImpl(
967          final List<E> list, int fromIndex, int toIndex) {
968        List<E> wrapper;
969        if (list instanceof RandomAccess) {
970          wrapper = new RandomAccessListWrapper<E>(list) {
971            @Override public ListIterator<E> listIterator(int index) {
972              return backingList.listIterator(index);
973            }
974    
975            private static final long serialVersionUID = 0;
976          };
977        } else {
978          wrapper = new AbstractListWrapper<E>(list) {
979            @Override public ListIterator<E> listIterator(int index) {
980              return backingList.listIterator(index);
981            }
982    
983            private static final long serialVersionUID = 0;
984          };
985        }
986        return wrapper.subList(fromIndex, toIndex);
987      }
988    
989      private static class AbstractListWrapper<E> extends AbstractList<E> {
990        final List<E> backingList;
991    
992        AbstractListWrapper(List<E> backingList) {
993          this.backingList = checkNotNull(backingList);
994        }
995    
996        @Override public void add(int index, E element) {
997          backingList.add(index, element);
998        }
999    
1000        @Override public boolean addAll(int index, Collection<? extends E> c) {
1001          return backingList.addAll(index, c);
1002        }
1003    
1004        @Override public E get(int index) {
1005          return backingList.get(index);
1006        }
1007    
1008        @Override public E remove(int index) {
1009          return backingList.remove(index);
1010        }
1011    
1012        @Override public E set(int index, E element) {
1013          return backingList.set(index, element);
1014        }
1015    
1016        @Override public boolean contains(Object o) {
1017          return backingList.contains(o);
1018        }
1019    
1020        @Override public int size() {
1021          return backingList.size();
1022        }
1023      }
1024    
1025      private static class RandomAccessListWrapper<E>
1026          extends AbstractListWrapper<E> implements RandomAccess {
1027        RandomAccessListWrapper(List<E> backingList) {
1028          super(backingList);
1029        }
1030      }
1031    }