1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * you may not use this file except in compliance with the License. 6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * You may obtain a copy of the License at 7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and 14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License. 15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage com.android.dx.util; 18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.Arrays; 20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/** 22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Simple (mostly) fixed-size list of objects, which may be made immutable. 23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic class FixedSizeList 25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project extends MutabilityControl implements ToHuman { 2699409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project /** {@code non-null;} array of elements */ 27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private Object[] arr; 28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 3099409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * Constructs an instance. All indices initially contain {@code null}. 31de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param size the size of the list 33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public FixedSizeList(int size) { 35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project super(size != 0); 36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project try { 38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project arr = new Object[size]; 39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } catch (NegativeArraySizeException ex) { 40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // Translate the exception. 41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new IllegalArgumentException("size < 0"); 42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** {@inheritDoc} */ 46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @Override 47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public boolean equals(Object other) { 48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (this == other) { 49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // Easy out. 50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return true; 51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if ((other == null) || (getClass() != other.getClass())) { 54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // Another easy out. 55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return false; 56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FixedSizeList list = (FixedSizeList) other; 59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return Arrays.equals(arr, list.arr); 60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** {@inheritDoc} */ 63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @Override 64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public int hashCode() { 65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return Arrays.hashCode(arr); 66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** {@inheritDoc} */ 69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @Override 70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public String toString() { 71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project String name = getClass().getName(); 72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return toString0(name.substring(name.lastIndexOf('.') + 1) + '{', 74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ", ", 75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project "}", 76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project false); 77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * {@inheritDoc} 81de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This method will only work if every element of the list 83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * implements {@link ToHuman}. 84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public String toHuman() { 86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project String name = getClass().getName(); 87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return toString0(name.substring(name.lastIndexOf('.') + 1) + '{', 89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ", ", 90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project "}", 91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project true); 92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Gets a customized string form for this instance. 96de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 9799409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param prefix {@code null-ok;} prefix for the start of the result 9899409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param separator {@code null-ok;} separator to insert between each item 9999409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param suffix {@code null-ok;} suffix for the end of the result 10099409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code non-null;} the custom string 101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public String toString(String prefix, String separator, String suffix) { 103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return toString0(prefix, separator, suffix, false); 104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Gets a customized human string for this instance. This method will 108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * only work if every element of the list implements {@link 109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * ToHuman}. 110de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 11199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param prefix {@code null-ok;} prefix for the start of the result 11299409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param separator {@code null-ok;} separator to insert between each item 11399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param suffix {@code null-ok;} suffix for the end of the result 11499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code non-null;} the custom string 115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public String toHuman(String prefix, String separator, String suffix) { 117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return toString0(prefix, separator, suffix, true); 118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Gets the number of elements in this list. 122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public final int size() { 124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return arr.length; 125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Shrinks this instance to fit, by removing any unset 12999409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * ({@code null}) elements, leaving the remaining elements in 130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * their original order. 131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public void shrinkToFit() { 133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int sz = arr.length; 134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int newSz = 0; 135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project for (int i = 0; i < sz; i++) { 137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (arr[i] != null) { 138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project newSz++; 139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (sz == newSz) { 143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return; 144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throwIfImmutable(); 147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Object[] newa = new Object[newSz]; 149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int at = 0; 150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project for (int i = 0; i < sz; i++) { 152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Object one = arr[i]; 153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (one != null) { 154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project newa[at] = one; 155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project at++; 156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project arr = newa; 160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (newSz == 0) { 161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project setImmutable(); 162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Gets the indicated element. It is an error to call this with the 167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * index for an element which was never set; if you do that, this 16899409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * will throw {@code NullPointerException}. This method is 169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * protected so that subclasses may offer a safe type-checked 170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * public interface to their clients. 171de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 17299409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param n {@code >= 0, < size();} which element 17399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code non-null;} the indicated element 174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project protected final Object get0(int n) { 176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project try { 177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Object result = arr[n]; 178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (result == null) { 180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new NullPointerException("unset: " + n); 181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } catch (ArrayIndexOutOfBoundsException ex) { 185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // Translate the exception. 186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return throwIndex(n); 187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 19199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * Gets the indicated element, allowing {@code null}s to be 192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * returned. This method is protected so that subclasses may 193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * (optionally) offer a safe type-checked public interface to 194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * their clients. 195de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 19699409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param n {@code >= 0, < size();} which element 19799409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code null-ok;} the indicated element 198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project protected final Object getOrNull0(int n) { 200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return arr[n]; 201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Sets the element at the given index, but without doing any type 205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * checks on the element. This method is protected so that 206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * subclasses may offer a safe type-checked public interface to 207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * their clients. 208de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 20999409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param n {@code >= 0, < size();} which element 21099409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param obj {@code null-ok;} the value to store 211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project protected final void set0(int n, Object obj) { 213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throwIfImmutable(); 214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project try { 216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project arr[n] = obj; 217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } catch (ArrayIndexOutOfBoundsException ex) { 218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // Translate the exception. 219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throwIndex(n); 220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Throws the appropriate exception for the given index value. 225de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param n the index value 227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @return never 228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @throws IndexOutOfBoundsException always thrown 229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private Object throwIndex(int n) { 231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (n < 0) { 232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new IndexOutOfBoundsException("n < 0"); 233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new IndexOutOfBoundsException("n >= size()"); 236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Helper for {@link #toString} and {@link #toHuman}, which both of 240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * those call to pretty much do everything. 241de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 24299409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param prefix {@code null-ok;} prefix for the start of the result 24399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param separator {@code null-ok;} separator to insert between each item 24499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param suffix {@code null-ok;} suffix for the end of the result 245de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * @param human whether the output is to be human 24699409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code non-null;} the custom string 247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private String toString0(String prefix, String separator, String suffix, 249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project boolean human) { 250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int len = arr.length; 251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project StringBuffer sb = new StringBuffer(len * 10 + 10); 252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (prefix != null) { 254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sb.append(prefix); 255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project for (int i = 0; i < len; i++) { 258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if ((i != 0) && (separator != null)) { 259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sb.append(separator); 260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (human) { 263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sb.append(((ToHuman) arr[i]).toHuman()); 264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else { 265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sb.append(arr[i]); 266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (suffix != null) { 270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sb.append(suffix); 271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return sb.toString(); 274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 277