1090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson/* 21d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Copyright (C) 2007 The Guava Authors 3090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * 4090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * Licensed under the Apache License, Version 2.0 (the "License"); 5090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * you may not use this file except in compliance with the License. 6090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * You may obtain a copy of the License at 7090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * 8090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * http://www.apache.org/licenses/LICENSE-2.0 9090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * 10090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * Unless required by applicable law or agreed to in writing, software 11090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * distributed under the License is distributed on an "AS IS" BASIS, 12090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * See the License for the specific language governing permissions and 14090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * limitations under the License. 15090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson */ 16090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 17090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilsonpackage com.google.common.collect; 18090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 197dd252788645e940eada959bdde927426e2531c9Paul Duffinimport static com.google.common.base.Preconditions.checkElementIndex; 201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.base.Preconditions.checkNotNull; 217dd252788645e940eada959bdde927426e2531c9Paul Duffinimport static com.google.common.base.Preconditions.checkPositionIndexes; 220888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport static com.google.common.collect.ObjectArrays.arraysCopyOf; 230888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport static com.google.common.collect.ObjectArrays.checkElementsNotNull; 241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 25090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilsonimport com.google.common.annotations.GwtCompatible; 26090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 27090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilsonimport java.io.InvalidObjectException; 28090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilsonimport java.io.ObjectInputStream; 29090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilsonimport java.io.Serializable; 30090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilsonimport java.util.Collection; 31090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilsonimport java.util.Iterator; 32090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilsonimport java.util.List; 33090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilsonimport java.util.RandomAccess; 34090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 35090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilsonimport javax.annotation.Nullable; 36090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 37090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson/** 38090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * A high-performance, immutable, random-access {@code List} implementation. 39090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * Does not permit null elements. 40090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * 41090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * <p>Unlike {@link Collections#unmodifiableList}, which is a <i>view</i> of a 42090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * separate collection that can still change, an instance of {@code 43090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * ImmutableList} contains its own private data and will <i>never</i> change. 44090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * {@code ImmutableList} is convenient for {@code public static final} lists 45090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * ("constant lists") and also lets you easily make a "defensive copy" of a list 46090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * provided to your class by a caller. 47090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * 481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p><b>Note:</b> Although this class is not final, it cannot be subclassed as 49090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * it has no public or protected constructors. Thus, instances of this type are 50090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * guaranteed to be immutable. 51090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * 527dd252788645e940eada959bdde927426e2531c9Paul Duffin * <p>See the Guava User Guide article on <a href= 537dd252788645e940eada959bdde927426e2531c9Paul Duffin * "http://code.google.com/p/guava-libraries/wiki/ImmutableCollectionsExplained"> 547dd252788645e940eada959bdde927426e2531c9Paul Duffin * immutable collections</a>. 557dd252788645e940eada959bdde927426e2531c9Paul Duffin * 56090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * @see ImmutableMap 57090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * @see ImmutableSet 58090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * @author Kevin Bourrillion 591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @since 2.0 (imported from Google Collections Library) 60090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson */ 611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert@GwtCompatible(serializable = true, emulated = true) 620888a09821a98ac0680fad765217302858e70fa4Paul Duffin@SuppressWarnings("serial") // we're overriding default serialization 630888a09821a98ac0680fad765217302858e70fa4Paul Duffinpublic abstract class ImmutableList<E> extends ImmutableCollection<E> 640888a09821a98ac0680fad765217302858e70fa4Paul Duffin implements List<E>, RandomAccess { 650888a09821a98ac0680fad765217302858e70fa4Paul Duffin 660888a09821a98ac0680fad765217302858e70fa4Paul Duffin private static final ImmutableList<Object> EMPTY = 670888a09821a98ac0680fad765217302858e70fa4Paul Duffin new RegularImmutableList<Object>(ObjectArrays.EMPTY_ARRAY); 680888a09821a98ac0680fad765217302858e70fa4Paul Duffin 69090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson /** 70090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * Returns the empty immutable list. This set behaves and performs comparably 71090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * to {@link Collections#emptyList}, and is preferable mainly for consistency 72090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * and maintainability of your code. 73090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson */ 74090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson // Casting to any type is safe because the list will never hold any elements. 75090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson @SuppressWarnings("unchecked") 76090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson public static <E> ImmutableList<E> of() { 770888a09821a98ac0680fad765217302858e70fa4Paul Duffin return (ImmutableList<E>) EMPTY; 78090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 79090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 80090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson /** 81090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * Returns an immutable list containing a single element. This list behaves 82090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * and performs comparably to {@link Collections#singleton}, but will not 83090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * accept a null element. It is preferable mainly for consistency and 84090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * maintainability of your code. 85090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * 86090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * @throws NullPointerException if {@code element} is null 87090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson */ 88090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson public static <E> ImmutableList<E> of(E element) { 89090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson return new SingletonImmutableList<E>(element); 90090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 91090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 92090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson /** 931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Returns an immutable list containing the given elements, in order. 94090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * 95090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * @throws NullPointerException if any element is null 96090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson */ 97090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson public static <E> ImmutableList<E> of(E e1, E e2) { 981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return construct(e1, e2); 99090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 100090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 101090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson /** 1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Returns an immutable list containing the given elements, in order. 103090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * 104090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * @throws NullPointerException if any element is null 105090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson */ 106090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson public static <E> ImmutableList<E> of(E e1, E e2, E e3) { 1071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return construct(e1, e2, e3); 108090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 109090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 110090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson /** 1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Returns an immutable list containing the given elements, in order. 112090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * 113090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * @throws NullPointerException if any element is null 114090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson */ 115090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson public static <E> ImmutableList<E> of(E e1, E e2, E e3, E e4) { 1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return construct(e1, e2, e3, e4); 117090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 118090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 119090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson /** 1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Returns an immutable list containing the given elements, in order. 121090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * 122090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * @throws NullPointerException if any element is null 123090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson */ 124090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson public static <E> ImmutableList<E> of(E e1, E e2, E e3, E e4, E e5) { 1251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return construct(e1, e2, e3, e4, e5); 126090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 127090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 128090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson /** 1291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Returns an immutable list containing the given elements, in order. 130090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * 131090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * @throws NullPointerException if any element is null 132090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson */ 133090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson public static <E> ImmutableList<E> of(E e1, E e2, E e3, E e4, E e5, E e6) { 1341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return construct(e1, e2, e3, e4, e5, e6); 135090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 136090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 137090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson /** 1381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Returns an immutable list containing the given elements, in order. 139090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * 140090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * @throws NullPointerException if any element is null 141090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson */ 1420888a09821a98ac0680fad765217302858e70fa4Paul Duffin public static <E> ImmutableList<E> of( 1430888a09821a98ac0680fad765217302858e70fa4Paul Duffin E e1, E e2, E e3, E e4, E e5, E e6, E e7) { 1441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return construct(e1, e2, e3, e4, e5, e6, e7); 145090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 146090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 147090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson /** 1481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Returns an immutable list containing the given elements, in order. 149090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * 150090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * @throws NullPointerException if any element is null 151090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson */ 1520888a09821a98ac0680fad765217302858e70fa4Paul Duffin public static <E> ImmutableList<E> of( 1530888a09821a98ac0680fad765217302858e70fa4Paul Duffin E e1, E e2, E e3, E e4, E e5, E e6, E e7, E e8) { 1541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return construct(e1, e2, e3, e4, e5, e6, e7, e8); 155090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 156090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 157090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson /** 1581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Returns an immutable list containing the given elements, in order. 159090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * 160090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * @throws NullPointerException if any element is null 161090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson */ 1620888a09821a98ac0680fad765217302858e70fa4Paul Duffin public static <E> ImmutableList<E> of( 1630888a09821a98ac0680fad765217302858e70fa4Paul Duffin E e1, E e2, E e3, E e4, E e5, E e6, E e7, E e8, E e9) { 1641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return construct(e1, e2, e3, e4, e5, e6, e7, e8, e9); 165090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 166090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 167090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson /** 1681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Returns an immutable list containing the given elements, in order. 169090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * 170090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * @throws NullPointerException if any element is null 171090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson */ 1720888a09821a98ac0680fad765217302858e70fa4Paul Duffin public static <E> ImmutableList<E> of( 1730888a09821a98ac0680fad765217302858e70fa4Paul Duffin E e1, E e2, E e3, E e4, E e5, E e6, E e7, E e8, E e9, E e10) { 1741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return construct(e1, e2, e3, e4, e5, e6, e7, e8, e9, e10); 175090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 176090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 177090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson /** 1781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Returns an immutable list containing the given elements, in order. 179090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * 180090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * @throws NullPointerException if any element is null 181090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson */ 1820888a09821a98ac0680fad765217302858e70fa4Paul Duffin public static <E> ImmutableList<E> of( 1830888a09821a98ac0680fad765217302858e70fa4Paul Duffin E e1, E e2, E e3, E e4, E e5, E e6, E e7, E e8, E e9, E e10, E e11) { 1841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return construct(e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11); 185090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 186090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 187090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson // These go up to eleven. After that, you just get the varargs form, and 188090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson // whatever warnings might come along with it. :( 189090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 190090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson /** 191090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * Returns an immutable list containing the given elements, in order. 192090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * 1931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @throws NullPointerException if any element is null 1941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @since 3.0 (source-compatible since 2.0) 195090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson */ 1960888a09821a98ac0680fad765217302858e70fa4Paul Duffin public static <E> ImmutableList<E> of( 1970888a09821a98ac0680fad765217302858e70fa4Paul Duffin E e1, E e2, E e3, E e4, E e5, E e6, E e7, E e8, E e9, E e10, E e11, E e12, 1980888a09821a98ac0680fad765217302858e70fa4Paul Duffin E... others) { 1991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Object[] array = new Object[12 + others.length]; 2001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert array[0] = e1; 2011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert array[1] = e2; 2021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert array[2] = e3; 2031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert array[3] = e4; 2041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert array[4] = e5; 2051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert array[5] = e6; 2061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert array[6] = e7; 2071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert array[7] = e8; 2081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert array[8] = e9; 2091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert array[9] = e10; 2101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert array[10] = e11; 2111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert array[11] = e12; 2121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert System.arraycopy(others, 0, array, 12, others.length); 2131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return construct(array); 214090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 215090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 216090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson /** 217bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * Returns an immutable list containing the given elements, in order. If 218bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * {@code elements} is a {@link Collection}, this method behaves exactly as 219bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * {@link #copyOf(Collection)}; otherwise, it behaves exactly as {@code 220bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * copyOf(elements.iterator()}. 221bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * 222bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @throws NullPointerException if any of {@code elements} is null 223bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor */ 224bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor public static <E> ImmutableList<E> copyOf(Iterable<? extends E> elements) { 2251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert checkNotNull(elements); // TODO(kevinb): is this here only for GWT? 2260888a09821a98ac0680fad765217302858e70fa4Paul Duffin return (elements instanceof Collection) 2273ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin ? copyOf((Collection<? extends E>) elements) 2280888a09821a98ac0680fad765217302858e70fa4Paul Duffin : copyOf(elements.iterator()); 229bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor } 230bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor 231bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor /** 232bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * Returns an immutable list containing the given elements, in order. 233090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * 2341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>Despite the method name, this method attempts to avoid actually copying 2351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * the data when it is safe to do so. The exact circumstances under which a 2361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * copy will or will not be performed are undocumented and subject to change. 237090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * 238bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * <p>Note that if {@code list} is a {@code List<String>}, then {@code 239bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * ImmutableList.copyOf(list)} returns an {@code ImmutableList<String>} 240bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * containing each of the strings in {@code list}, while 241bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * ImmutableList.of(list)} returns an {@code ImmutableList<List<String>>} 242bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * containing one element (the given list itself). 243bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * 244bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * <p>This method is safe to use even when {@code elements} is a synchronized 245bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * or concurrent collection that is currently being modified by another 246bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * thread. 247bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * 248090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * @throws NullPointerException if any of {@code elements} is null 249090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson */ 250bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor public static <E> ImmutableList<E> copyOf(Collection<? extends E> elements) { 2511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (elements instanceof ImmutableCollection) { 2520888a09821a98ac0680fad765217302858e70fa4Paul Duffin @SuppressWarnings("unchecked") // all supported methods are covariant 2531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ImmutableList<E> list = ((ImmutableCollection<E>) elements).asList(); 2540888a09821a98ac0680fad765217302858e70fa4Paul Duffin return list.isPartialView() 2550888a09821a98ac0680fad765217302858e70fa4Paul Duffin ? ImmutableList.<E>asImmutableList(list.toArray()) 2560888a09821a98ac0680fad765217302858e70fa4Paul Duffin : list; 257090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 2580888a09821a98ac0680fad765217302858e70fa4Paul Duffin return construct(elements.toArray()); 259090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 260090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 261090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson /** 262090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * Returns an immutable list containing the given elements, in order. 263090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * 264090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * @throws NullPointerException if any of {@code elements} is null 265090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson */ 266090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson public static <E> ImmutableList<E> copyOf(Iterator<? extends E> elements) { 2677dd252788645e940eada959bdde927426e2531c9Paul Duffin // We special-case for 0 or 1 elements, but going further is madness. 2687dd252788645e940eada959bdde927426e2531c9Paul Duffin if (!elements.hasNext()) { 2697dd252788645e940eada959bdde927426e2531c9Paul Duffin return of(); 2707dd252788645e940eada959bdde927426e2531c9Paul Duffin } 2717dd252788645e940eada959bdde927426e2531c9Paul Duffin E first = elements.next(); 2727dd252788645e940eada959bdde927426e2531c9Paul Duffin if (!elements.hasNext()) { 2737dd252788645e940eada959bdde927426e2531c9Paul Duffin return of(first); 2747dd252788645e940eada959bdde927426e2531c9Paul Duffin } else { 2750888a09821a98ac0680fad765217302858e70fa4Paul Duffin return new ImmutableList.Builder<E>() 2760888a09821a98ac0680fad765217302858e70fa4Paul Duffin .add(first) 2770888a09821a98ac0680fad765217302858e70fa4Paul Duffin .addAll(elements) 2780888a09821a98ac0680fad765217302858e70fa4Paul Duffin .build(); 2797dd252788645e940eada959bdde927426e2531c9Paul Duffin } 280090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 281090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 2821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 2831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Returns an immutable list containing the given elements, in order. 2841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 2851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @throws NullPointerException if any of {@code elements} is null 2861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @since 3.0 2871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 2881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public static <E> ImmutableList<E> copyOf(E[] elements) { 2891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert switch (elements.length) { 2901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert case 0: 2911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return ImmutableList.of(); 2921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert case 1: 2931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return new SingletonImmutableList<E>(elements[0]); 2941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert default: 2950888a09821a98ac0680fad765217302858e70fa4Paul Duffin return new RegularImmutableList<E>(checkElementsNotNull(elements.clone())); 2961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2997dd252788645e940eada959bdde927426e2531c9Paul Duffin /** 3000888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Views the array as an immutable list. Checks for nulls; does not copy. 3010888a09821a98ac0680fad765217302858e70fa4Paul Duffin */ 3020888a09821a98ac0680fad765217302858e70fa4Paul Duffin private static <E> ImmutableList<E> construct(Object... elements) { 3030888a09821a98ac0680fad765217302858e70fa4Paul Duffin return asImmutableList(checkElementsNotNull(elements)); 3040888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 3050888a09821a98ac0680fad765217302858e70fa4Paul Duffin 3060888a09821a98ac0680fad765217302858e70fa4Paul Duffin /** 3070888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Views the array as an immutable list. Does not check for nulls; does not copy. 3087dd252788645e940eada959bdde927426e2531c9Paul Duffin * 3097dd252788645e940eada959bdde927426e2531c9Paul Duffin * <p>The array must be internally created. 3107dd252788645e940eada959bdde927426e2531c9Paul Duffin */ 3117dd252788645e940eada959bdde927426e2531c9Paul Duffin static <E> ImmutableList<E> asImmutableList(Object[] elements) { 3120888a09821a98ac0680fad765217302858e70fa4Paul Duffin return asImmutableList(elements, elements.length); 3130888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 3140888a09821a98ac0680fad765217302858e70fa4Paul Duffin 3150888a09821a98ac0680fad765217302858e70fa4Paul Duffin /** 3160888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Views the array as an immutable list. Copies if the specified range does not cover the complete 3170888a09821a98ac0680fad765217302858e70fa4Paul Duffin * array. Does not check for nulls. 3180888a09821a98ac0680fad765217302858e70fa4Paul Duffin */ 3190888a09821a98ac0680fad765217302858e70fa4Paul Duffin static <E> ImmutableList<E> asImmutableList(Object[] elements, int length) { 3200888a09821a98ac0680fad765217302858e70fa4Paul Duffin switch (length) { 321090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson case 0: 322090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson return of(); 323090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson case 1: 3240888a09821a98ac0680fad765217302858e70fa4Paul Duffin @SuppressWarnings("unchecked") // collection had only Es in it 325bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor ImmutableList<E> list = new SingletonImmutableList<E>((E) elements[0]); 326bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor return list; 327090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson default: 3280888a09821a98ac0680fad765217302858e70fa4Paul Duffin if (length < elements.length) { 3290888a09821a98ac0680fad765217302858e70fa4Paul Duffin elements = arraysCopyOf(elements, length); 3300888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 3310888a09821a98ac0680fad765217302858e70fa4Paul Duffin return new RegularImmutableList<E>(elements); 332090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 3331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 335090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson ImmutableList() {} 336090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 337090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson // This declaration is needed to make List.iterator() and 338090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson // ImmutableCollection.iterator() consistent. 3390888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public UnmodifiableIterator<E> iterator() { 3401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return listIterator(); 3411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3430888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public UnmodifiableListIterator<E> listIterator() { 3441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return listIterator(0); 3451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3470888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public UnmodifiableListIterator<E> listIterator(int index) { 3487dd252788645e940eada959bdde927426e2531c9Paul Duffin return new AbstractIndexedListIterator<E>(size(), index) { 3497dd252788645e940eada959bdde927426e2531c9Paul Duffin @Override 3507dd252788645e940eada959bdde927426e2531c9Paul Duffin protected E get(int index) { 3517dd252788645e940eada959bdde927426e2531c9Paul Duffin return ImmutableList.this.get(index); 3527dd252788645e940eada959bdde927426e2531c9Paul Duffin } 3537dd252788645e940eada959bdde927426e2531c9Paul Duffin }; 3547dd252788645e940eada959bdde927426e2531c9Paul Duffin } 355090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 3560888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 3577dd252788645e940eada959bdde927426e2531c9Paul Duffin public int indexOf(@Nullable Object object) { 3587dd252788645e940eada959bdde927426e2531c9Paul Duffin return (object == null) ? -1 : Lists.indexOfImpl(this, object); 3597dd252788645e940eada959bdde927426e2531c9Paul Duffin } 3607dd252788645e940eada959bdde927426e2531c9Paul Duffin 3610888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 3627dd252788645e940eada959bdde927426e2531c9Paul Duffin public int lastIndexOf(@Nullable Object object) { 3637dd252788645e940eada959bdde927426e2531c9Paul Duffin return (object == null) ? -1 : Lists.lastIndexOfImpl(this, object); 3647dd252788645e940eada959bdde927426e2531c9Paul Duffin } 365090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 3661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override 3677dd252788645e940eada959bdde927426e2531c9Paul Duffin public boolean contains(@Nullable Object object) { 3687dd252788645e940eada959bdde927426e2531c9Paul Duffin return indexOf(object) >= 0; 3697dd252788645e940eada959bdde927426e2531c9Paul Duffin } 370090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 371090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson // constrain the return type to ImmutableList<E> 372090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 373090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson /** 374090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * Returns an immutable list of the elements between the specified {@code 375090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * fromIndex}, inclusive, and {@code toIndex}, exclusive. (If {@code 376090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * fromIndex} and {@code toIndex} are equal, the empty immutable list is 377090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * returned.) 378090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson */ 3790888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 3807dd252788645e940eada959bdde927426e2531c9Paul Duffin public ImmutableList<E> subList(int fromIndex, int toIndex) { 3817dd252788645e940eada959bdde927426e2531c9Paul Duffin checkPositionIndexes(fromIndex, toIndex, size()); 3827dd252788645e940eada959bdde927426e2531c9Paul Duffin int length = toIndex - fromIndex; 3837dd252788645e940eada959bdde927426e2531c9Paul Duffin switch (length) { 3847dd252788645e940eada959bdde927426e2531c9Paul Duffin case 0: 3857dd252788645e940eada959bdde927426e2531c9Paul Duffin return of(); 3867dd252788645e940eada959bdde927426e2531c9Paul Duffin case 1: 3877dd252788645e940eada959bdde927426e2531c9Paul Duffin return of(get(fromIndex)); 3887dd252788645e940eada959bdde927426e2531c9Paul Duffin default: 3897dd252788645e940eada959bdde927426e2531c9Paul Duffin return subListUnchecked(fromIndex, toIndex); 3907dd252788645e940eada959bdde927426e2531c9Paul Duffin } 3917dd252788645e940eada959bdde927426e2531c9Paul Duffin } 3927dd252788645e940eada959bdde927426e2531c9Paul Duffin 3937dd252788645e940eada959bdde927426e2531c9Paul Duffin /** 3947dd252788645e940eada959bdde927426e2531c9Paul Duffin * Called by the default implementation of {@link #subList} when {@code 3957dd252788645e940eada959bdde927426e2531c9Paul Duffin * toIndex - fromIndex > 1}, after index validation has already been 3967dd252788645e940eada959bdde927426e2531c9Paul Duffin * performed. 3977dd252788645e940eada959bdde927426e2531c9Paul Duffin */ 3987dd252788645e940eada959bdde927426e2531c9Paul Duffin ImmutableList<E> subListUnchecked(int fromIndex, int toIndex) { 3997dd252788645e940eada959bdde927426e2531c9Paul Duffin return new SubList(fromIndex, toIndex - fromIndex); 4007dd252788645e940eada959bdde927426e2531c9Paul Duffin } 4017dd252788645e940eada959bdde927426e2531c9Paul Duffin 4027dd252788645e940eada959bdde927426e2531c9Paul Duffin class SubList extends ImmutableList<E> { 4037dd252788645e940eada959bdde927426e2531c9Paul Duffin transient final int offset; 4047dd252788645e940eada959bdde927426e2531c9Paul Duffin transient final int length; 4057dd252788645e940eada959bdde927426e2531c9Paul Duffin 4067dd252788645e940eada959bdde927426e2531c9Paul Duffin SubList(int offset, int length) { 4077dd252788645e940eada959bdde927426e2531c9Paul Duffin this.offset = offset; 4087dd252788645e940eada959bdde927426e2531c9Paul Duffin this.length = length; 4097dd252788645e940eada959bdde927426e2531c9Paul Duffin } 4107dd252788645e940eada959bdde927426e2531c9Paul Duffin 4110888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 4127dd252788645e940eada959bdde927426e2531c9Paul Duffin public int size() { 4137dd252788645e940eada959bdde927426e2531c9Paul Duffin return length; 4147dd252788645e940eada959bdde927426e2531c9Paul Duffin } 4157dd252788645e940eada959bdde927426e2531c9Paul Duffin 4160888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 4177dd252788645e940eada959bdde927426e2531c9Paul Duffin public E get(int index) { 4187dd252788645e940eada959bdde927426e2531c9Paul Duffin checkElementIndex(index, length); 4197dd252788645e940eada959bdde927426e2531c9Paul Duffin return ImmutableList.this.get(index + offset); 4207dd252788645e940eada959bdde927426e2531c9Paul Duffin } 4217dd252788645e940eada959bdde927426e2531c9Paul Duffin 4227dd252788645e940eada959bdde927426e2531c9Paul Duffin @Override 4237dd252788645e940eada959bdde927426e2531c9Paul Duffin public ImmutableList<E> subList(int fromIndex, int toIndex) { 4247dd252788645e940eada959bdde927426e2531c9Paul Duffin checkPositionIndexes(fromIndex, toIndex, length); 4257dd252788645e940eada959bdde927426e2531c9Paul Duffin return ImmutableList.this.subList(fromIndex + offset, toIndex + offset); 4267dd252788645e940eada959bdde927426e2531c9Paul Duffin } 4277dd252788645e940eada959bdde927426e2531c9Paul Duffin 4287dd252788645e940eada959bdde927426e2531c9Paul Duffin @Override 4297dd252788645e940eada959bdde927426e2531c9Paul Duffin boolean isPartialView() { 4307dd252788645e940eada959bdde927426e2531c9Paul Duffin return true; 4317dd252788645e940eada959bdde927426e2531c9Paul Duffin } 4327dd252788645e940eada959bdde927426e2531c9Paul Duffin } 433090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 434090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson /** 435090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * Guaranteed to throw an exception and leave the list unmodified. 436090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * 437090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * @throws UnsupportedOperationException always 4387dd252788645e940eada959bdde927426e2531c9Paul Duffin * @deprecated Unsupported operation. 439090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson */ 4407dd252788645e940eada959bdde927426e2531c9Paul Duffin @Deprecated 4410888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 442090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson public final boolean addAll(int index, Collection<? extends E> newElements) { 443090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson throw new UnsupportedOperationException(); 444090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 445090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 446090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson /** 447090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * Guaranteed to throw an exception and leave the list unmodified. 448090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * 449090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * @throws UnsupportedOperationException always 4507dd252788645e940eada959bdde927426e2531c9Paul Duffin * @deprecated Unsupported operation. 451090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson */ 4527dd252788645e940eada959bdde927426e2531c9Paul Duffin @Deprecated 4530888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 454090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson public final E set(int index, E element) { 455090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson throw new UnsupportedOperationException(); 456090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 457090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 458090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson /** 459090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * Guaranteed to throw an exception and leave the list unmodified. 460090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * 461090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * @throws UnsupportedOperationException always 4627dd252788645e940eada959bdde927426e2531c9Paul Duffin * @deprecated Unsupported operation. 463090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson */ 4647dd252788645e940eada959bdde927426e2531c9Paul Duffin @Deprecated 4650888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 466090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson public final void add(int index, E element) { 467090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson throw new UnsupportedOperationException(); 468090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 469090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 470090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson /** 471090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * Guaranteed to throw an exception and leave the list unmodified. 472090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * 473090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * @throws UnsupportedOperationException always 4747dd252788645e940eada959bdde927426e2531c9Paul Duffin * @deprecated Unsupported operation. 475090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson */ 4767dd252788645e940eada959bdde927426e2531c9Paul Duffin @Deprecated 4770888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 478090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson public final E remove(int index) { 479090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson throw new UnsupportedOperationException(); 480090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 481090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 482bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor /** 483bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * Returns this list instance. 484bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * 4851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @since 2.0 486bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor */ 4870888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public final ImmutableList<E> asList() { 488bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor return this; 489090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 490090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 4910888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 4920888a09821a98ac0680fad765217302858e70fa4Paul Duffin int copyIntoArray(Object[] dst, int offset) { 4930888a09821a98ac0680fad765217302858e70fa4Paul Duffin // this loop is faster for RandomAccess instances, which ImmutableLists are 4940888a09821a98ac0680fad765217302858e70fa4Paul Duffin int size = size(); 4950888a09821a98ac0680fad765217302858e70fa4Paul Duffin for (int i = 0; i < size; i++) { 4960888a09821a98ac0680fad765217302858e70fa4Paul Duffin dst[offset + i] = get(i); 4970888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 4980888a09821a98ac0680fad765217302858e70fa4Paul Duffin return offset + size; 4990888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 5000888a09821a98ac0680fad765217302858e70fa4Paul Duffin 5011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 5021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Returns a view of this immutable list in reverse order. For example, {@code 5031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * ImmutableList.of(1, 2, 3).reverse()} is equivalent to {@code 5041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * ImmutableList.of(3, 2, 1)}. 5051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 5061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @return a view of this immutable list in reverse order 5071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @since 7.0 5081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 5091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public ImmutableList<E> reverse() { 5101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return new ReverseImmutableList<E>(this); 5111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static class ReverseImmutableList<E> extends ImmutableList<E> { 5147dd252788645e940eada959bdde927426e2531c9Paul Duffin private final transient ImmutableList<E> forwardList; 5151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ReverseImmutableList(ImmutableList<E> backingList) { 5171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert this.forwardList = backingList; 5181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private int reverseIndex(int index) { 5210888a09821a98ac0680fad765217302858e70fa4Paul Duffin return (size() - 1) - index; 5221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private int reversePosition(int index) { 5250888a09821a98ac0680fad765217302858e70fa4Paul Duffin return size() - index; 5261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5280888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public ImmutableList<E> reverse() { 5291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return forwardList; 5301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5320888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public boolean contains(@Nullable Object object) { 5331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return forwardList.contains(object); 5341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5360888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public int indexOf(@Nullable Object object) { 5371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int index = forwardList.lastIndexOf(object); 5381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return (index >= 0) ? reverseIndex(index) : -1; 5391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5410888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public int lastIndexOf(@Nullable Object object) { 5421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int index = forwardList.indexOf(object); 5431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return (index >= 0) ? reverseIndex(index) : -1; 5441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5460888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public ImmutableList<E> subList(int fromIndex, int toIndex) { 5470888a09821a98ac0680fad765217302858e70fa4Paul Duffin checkPositionIndexes(fromIndex, toIndex, size()); 5480888a09821a98ac0680fad765217302858e70fa4Paul Duffin return forwardList.subList( 5490888a09821a98ac0680fad765217302858e70fa4Paul Duffin reversePosition(toIndex), reversePosition(fromIndex)).reverse(); 5501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5520888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public E get(int index) { 5530888a09821a98ac0680fad765217302858e70fa4Paul Duffin checkElementIndex(index, size()); 5541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return forwardList.get(reverseIndex(index)); 5551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5570888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public int size() { 5580888a09821a98ac0680fad765217302858e70fa4Paul Duffin return forwardList.size(); 5591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5610888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override boolean isPartialView() { 5621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return forwardList.isPartialView(); 5631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5657dd252788645e940eada959bdde927426e2531c9Paul Duffin 5660888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public boolean equals(@Nullable Object obj) { 5671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return Lists.equalsImpl(this, obj); 5681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5700888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public int hashCode() { 5710888a09821a98ac0680fad765217302858e70fa4Paul Duffin int hashCode = 1; 5720888a09821a98ac0680fad765217302858e70fa4Paul Duffin int n = size(); 5730888a09821a98ac0680fad765217302858e70fa4Paul Duffin for (int i = 0; i < n; i++) { 5740888a09821a98ac0680fad765217302858e70fa4Paul Duffin hashCode = 31 * hashCode + get(i).hashCode(); 5750888a09821a98ac0680fad765217302858e70fa4Paul Duffin 5760888a09821a98ac0680fad765217302858e70fa4Paul Duffin hashCode = ~~hashCode; 5770888a09821a98ac0680fad765217302858e70fa4Paul Duffin // needed to deal with GWT integer overflow 5780888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 5790888a09821a98ac0680fad765217302858e70fa4Paul Duffin return hashCode; 5801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 582090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson /* 583090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * Serializes ImmutableLists as their logical contents. This ensures that 584090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * implementation types do not leak into the serialized representation. 585090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson */ 5860888a09821a98ac0680fad765217302858e70fa4Paul Duffin static class SerializedForm implements Serializable { 587090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson final Object[] elements; 588090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson SerializedForm(Object[] elements) { 589090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson this.elements = elements; 590090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 591090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson Object readResolve() { 5921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return copyOf(elements); 593090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 594090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson private static final long serialVersionUID = 0; 595090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 596090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 5970888a09821a98ac0680fad765217302858e70fa4Paul Duffin private void readObject(ObjectInputStream stream) 5980888a09821a98ac0680fad765217302858e70fa4Paul Duffin throws InvalidObjectException { 599090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson throw new InvalidObjectException("Use SerializedForm"); 600090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 601090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 6020888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override Object writeReplace() { 603090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson return new SerializedForm(toArray()); 604090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 605090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 606090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson /** 607090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * Returns a new builder. The generated builder is equivalent to the builder 608090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * created by the {@link Builder} constructor. 609090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson */ 610090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson public static <E> Builder<E> builder() { 611090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson return new Builder<E>(); 612090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 613090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 614090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson /** 6151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * A builder for creating immutable list instances, especially {@code public 6161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * static final} lists ("constant lists"). Example: <pre> {@code 617090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * 618090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * public static final ImmutableList<Color> GOOGLE_COLORS 619090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * = new ImmutableList.Builder<Color>() 620090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * .addAll(WEBSAFE_COLORS) 621090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * .add(new Color(0, 191, 255)) 622090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * .build();}</pre> 623090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * 6240888a09821a98ac0680fad765217302858e70fa4Paul Duffin * <p>Builder instances can be reused; it is safe to call {@link #build} multiple 6251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * times to build multiple lists in series. Each new list contains all the 6261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * elements of the ones created before it. 6271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 6281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @since 2.0 (imported from Google Collections Library) 629090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson */ 6300888a09821a98ac0680fad765217302858e70fa4Paul Duffin public static final class Builder<E> extends ImmutableCollection.ArrayBasedBuilder<E> { 631090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson /** 632090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * Creates a new builder. The returned builder is equivalent to the builder 633090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * generated by {@link ImmutableList#builder}. 634090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson */ 6357dd252788645e940eada959bdde927426e2531c9Paul Duffin public Builder() { 6367dd252788645e940eada959bdde927426e2531c9Paul Duffin this(DEFAULT_INITIAL_CAPACITY); 6377dd252788645e940eada959bdde927426e2531c9Paul Duffin } 6387dd252788645e940eada959bdde927426e2531c9Paul Duffin 6397dd252788645e940eada959bdde927426e2531c9Paul Duffin // TODO(user): consider exposing this 6407dd252788645e940eada959bdde927426e2531c9Paul Duffin Builder(int capacity) { 6410888a09821a98ac0680fad765217302858e70fa4Paul Duffin super(capacity); 6427dd252788645e940eada959bdde927426e2531c9Paul Duffin } 643090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 644090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson /** 645090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * Adds {@code element} to the {@code ImmutableList}. 646090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * 647090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * @param element the element to add 648090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * @return this {@code Builder} object 649090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * @throws NullPointerException if {@code element} is null 650090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson */ 6510888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public Builder<E> add(E element) { 6520888a09821a98ac0680fad765217302858e70fa4Paul Duffin super.add(element); 653090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson return this; 654090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 655090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 656090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson /** 657090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * Adds each element of {@code elements} to the {@code ImmutableList}. 658090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * 659090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * @param elements the {@code Iterable} to add to the {@code ImmutableList} 660090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * @return this {@code Builder} object 661090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * @throws NullPointerException if {@code elements} is null or contains a 662090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * null element 663090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson */ 6640888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public Builder<E> addAll(Iterable<? extends E> elements) { 665090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson super.addAll(elements); 666090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson return this; 667090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 668090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 669090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson /** 670090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * Adds each element of {@code elements} to the {@code ImmutableList}. 671090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * 672090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * @param elements the {@code Iterable} to add to the {@code ImmutableList} 673090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * @return this {@code Builder} object 674090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * @throws NullPointerException if {@code elements} is null or contains a 675090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * null element 676090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson */ 6770888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public Builder<E> add(E... elements) { 6780888a09821a98ac0680fad765217302858e70fa4Paul Duffin super.add(elements); 679090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson return this; 680090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 681090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 682090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson /** 683090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * Adds each element of {@code elements} to the {@code ImmutableList}. 684090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * 685090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * @param elements the {@code Iterable} to add to the {@code ImmutableList} 686090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * @return this {@code Builder} object 687090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * @throws NullPointerException if {@code elements} is null or contains a 688090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * null element 689090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson */ 6900888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public Builder<E> addAll(Iterator<? extends E> elements) { 691090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson super.addAll(elements); 692090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson return this; 693090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 694090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 695090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson /** 696090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * Returns a newly-created {@code ImmutableList} based on the contents of 697090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * the {@code Builder}. 698090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson */ 6990888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public ImmutableList<E> build() { 7000888a09821a98ac0680fad765217302858e70fa4Paul Duffin return asImmutableList(contents, size); 701090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 702090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 703090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson} 704