1ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette/*
2ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette * Copyright (C) 2014 The Android Open Source Project
3ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette *
4ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette * Licensed under the Apache License, Version 2.0 (the "License");
5ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette * you may not use this file except in compliance with the License.
6ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette * You may obtain a copy of the License at
7ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette *
8ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette *      http://www.apache.org/licenses/LICENSE-2.0
9ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette *
10ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette * Unless required by applicable law or agreed to in writing, software
11ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette * distributed under the License is distributed on an "AS IS" BASIS,
12ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette * See the License for the specific language governing permissions and
14ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette * limitations under the License.
15ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette */
16ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette
17ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverettepackage android.util;
18ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette
19ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viveretteimport com.android.internal.util.ArrayUtils;
20112962a6b09310c58093b9a8af341cbeaa612a48Hugo Benichiimport com.android.internal.util.Preconditions;
219c5dfa5c79fff17f96bf977b86c0c9ceb8c3cf9bZoltan Szatmary-Banimport java.util.Arrays;
22ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viveretteimport libcore.util.EmptyArray;
23ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette
24ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette/**
25ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette * Implements a growing array of int primitives.
26ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette *
27ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette * @hide
28ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette */
29ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverettepublic class IntArray implements Cloneable {
30ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette    private static final int MIN_CAPACITY_INCREMENT = 12;
31ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette
32ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette    private int[] mValues;
33ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette    private int mSize;
34ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette
35112962a6b09310c58093b9a8af341cbeaa612a48Hugo Benichi    private  IntArray(int[] array, int size) {
36112962a6b09310c58093b9a8af341cbeaa612a48Hugo Benichi        mValues = array;
37112962a6b09310c58093b9a8af341cbeaa612a48Hugo Benichi        mSize = Preconditions.checkArgumentInRange(size, 0, array.length, "size");
38112962a6b09310c58093b9a8af341cbeaa612a48Hugo Benichi    }
39112962a6b09310c58093b9a8af341cbeaa612a48Hugo Benichi
40ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette    /**
41ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette     * Creates an empty IntArray with the default initial capacity.
42ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette     */
43ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette    public IntArray() {
44ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette        this(10);
45ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette    }
46ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette
47ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette    /**
48ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette     * Creates an empty IntArray with the specified initial capacity.
49ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette     */
50ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette    public IntArray(int initialCapacity) {
51ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette        if (initialCapacity == 0) {
52ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette            mValues = EmptyArray.INT;
53ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette        } else {
54ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette            mValues = ArrayUtils.newUnpaddedIntArray(initialCapacity);
55ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette        }
56ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette        mSize = 0;
57ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette    }
58ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette
59ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette    /**
60112962a6b09310c58093b9a8af341cbeaa612a48Hugo Benichi     * Creates an IntArray wrapping the given primitive int array.
61112962a6b09310c58093b9a8af341cbeaa612a48Hugo Benichi     */
62112962a6b09310c58093b9a8af341cbeaa612a48Hugo Benichi    public static IntArray wrap(int[] array) {
63112962a6b09310c58093b9a8af341cbeaa612a48Hugo Benichi        return new IntArray(array, array.length);
64112962a6b09310c58093b9a8af341cbeaa612a48Hugo Benichi    }
65112962a6b09310c58093b9a8af341cbeaa612a48Hugo Benichi
66112962a6b09310c58093b9a8af341cbeaa612a48Hugo Benichi    /**
67112962a6b09310c58093b9a8af341cbeaa612a48Hugo Benichi     * Creates an IntArray from the given primitive int array, copying it.
68112962a6b09310c58093b9a8af341cbeaa612a48Hugo Benichi     */
69112962a6b09310c58093b9a8af341cbeaa612a48Hugo Benichi    public static IntArray fromArray(int[] array, int size) {
70112962a6b09310c58093b9a8af341cbeaa612a48Hugo Benichi        return wrap(Arrays.copyOf(array, size));
71112962a6b09310c58093b9a8af341cbeaa612a48Hugo Benichi    }
72112962a6b09310c58093b9a8af341cbeaa612a48Hugo Benichi
73112962a6b09310c58093b9a8af341cbeaa612a48Hugo Benichi    /**
74112962a6b09310c58093b9a8af341cbeaa612a48Hugo Benichi     * Changes the size of this IntArray. If this IntArray is shrinked, the backing array capacity
75112962a6b09310c58093b9a8af341cbeaa612a48Hugo Benichi     * is unchanged. If the new size is larger than backing array capacity, a new backing array is
76112962a6b09310c58093b9a8af341cbeaa612a48Hugo Benichi     * created from the current content of this IntArray padded with 0s.
77112962a6b09310c58093b9a8af341cbeaa612a48Hugo Benichi     */
78112962a6b09310c58093b9a8af341cbeaa612a48Hugo Benichi    public void resize(int newSize) {
79112962a6b09310c58093b9a8af341cbeaa612a48Hugo Benichi        Preconditions.checkArgumentNonnegative(newSize);
80112962a6b09310c58093b9a8af341cbeaa612a48Hugo Benichi        if (newSize <= mValues.length) {
81112962a6b09310c58093b9a8af341cbeaa612a48Hugo Benichi            Arrays.fill(mValues, newSize, mValues.length, 0);
82112962a6b09310c58093b9a8af341cbeaa612a48Hugo Benichi        } else {
83112962a6b09310c58093b9a8af341cbeaa612a48Hugo Benichi            ensureCapacity(newSize - mSize);
84112962a6b09310c58093b9a8af341cbeaa612a48Hugo Benichi        }
85112962a6b09310c58093b9a8af341cbeaa612a48Hugo Benichi        mSize = newSize;
86112962a6b09310c58093b9a8af341cbeaa612a48Hugo Benichi    }
87112962a6b09310c58093b9a8af341cbeaa612a48Hugo Benichi
88112962a6b09310c58093b9a8af341cbeaa612a48Hugo Benichi    /**
89ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette     * Appends the specified value to the end of this array.
90ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette     */
91ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette    public void add(int value) {
92ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette        add(mSize, value);
93ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette    }
94ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette
95ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette    /**
96112962a6b09310c58093b9a8af341cbeaa612a48Hugo Benichi     * Inserts a value at the specified position in this array. If the specified index is equal to
97112962a6b09310c58093b9a8af341cbeaa612a48Hugo Benichi     * the length of the array, the value is added at the end.
98ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette     *
99ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette     * @throws IndexOutOfBoundsException when index &lt; 0 || index &gt; size()
100ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette     */
101ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette    public void add(int index, int value) {
102ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette        ensureCapacity(1);
103112962a6b09310c58093b9a8af341cbeaa612a48Hugo Benichi        int rightSegment = mSize - index;
104112962a6b09310c58093b9a8af341cbeaa612a48Hugo Benichi        mSize++;
105112962a6b09310c58093b9a8af341cbeaa612a48Hugo Benichi        checkBounds(index);
106ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette
107112962a6b09310c58093b9a8af341cbeaa612a48Hugo Benichi        if (rightSegment != 0) {
108112962a6b09310c58093b9a8af341cbeaa612a48Hugo Benichi            // Move by 1 all values from the right of 'index'
109112962a6b09310c58093b9a8af341cbeaa612a48Hugo Benichi            System.arraycopy(mValues, index, mValues, index + 1, rightSegment);
110ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette        }
111ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette
112ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette        mValues[index] = value;
113ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette    }
114ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette
115ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette    /**
1169c5dfa5c79fff17f96bf977b86c0c9ceb8c3cf9bZoltan Szatmary-Ban     * Searches the array for the specified value using the binary search algorithm. The array must
1179c5dfa5c79fff17f96bf977b86c0c9ceb8c3cf9bZoltan Szatmary-Ban     * be sorted (as by the {@link Arrays#sort(int[], int, int)} method) prior to making this call.
1189c5dfa5c79fff17f96bf977b86c0c9ceb8c3cf9bZoltan Szatmary-Ban     * If it is not sorted, the results are undefined. If the range contains multiple elements with
1199c5dfa5c79fff17f96bf977b86c0c9ceb8c3cf9bZoltan Szatmary-Ban     * the specified value, there is no guarantee which one will be found.
1209c5dfa5c79fff17f96bf977b86c0c9ceb8c3cf9bZoltan Szatmary-Ban     *
1219c5dfa5c79fff17f96bf977b86c0c9ceb8c3cf9bZoltan Szatmary-Ban     * @param value The value to search for.
1229c5dfa5c79fff17f96bf977b86c0c9ceb8c3cf9bZoltan Szatmary-Ban     * @return index of the search key, if it is contained in the array; otherwise, <i>(-(insertion
1239c5dfa5c79fff17f96bf977b86c0c9ceb8c3cf9bZoltan Szatmary-Ban     *         point) - 1)</i>. The insertion point is defined as the point at which the key would
1249c5dfa5c79fff17f96bf977b86c0c9ceb8c3cf9bZoltan Szatmary-Ban     *         be inserted into the array: the index of the first element greater than the key, or
1259c5dfa5c79fff17f96bf977b86c0c9ceb8c3cf9bZoltan Szatmary-Ban     *         {@link #size()} if all elements in the array are less than the specified key.
1269c5dfa5c79fff17f96bf977b86c0c9ceb8c3cf9bZoltan Szatmary-Ban     *         Note that this guarantees that the return value will be >= 0 if and only if the key
1279c5dfa5c79fff17f96bf977b86c0c9ceb8c3cf9bZoltan Szatmary-Ban     *         is found.
1289c5dfa5c79fff17f96bf977b86c0c9ceb8c3cf9bZoltan Szatmary-Ban     */
1299c5dfa5c79fff17f96bf977b86c0c9ceb8c3cf9bZoltan Szatmary-Ban    public int binarySearch(int value) {
1309c5dfa5c79fff17f96bf977b86c0c9ceb8c3cf9bZoltan Szatmary-Ban        return ContainerHelpers.binarySearch(mValues, mSize, value);
1319c5dfa5c79fff17f96bf977b86c0c9ceb8c3cf9bZoltan Szatmary-Ban    }
1329c5dfa5c79fff17f96bf977b86c0c9ceb8c3cf9bZoltan Szatmary-Ban
1339c5dfa5c79fff17f96bf977b86c0c9ceb8c3cf9bZoltan Szatmary-Ban    /**
134ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette     * Adds the values in the specified array to this array.
135ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette     */
136ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette    public void addAll(IntArray values) {
137ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette        final int count = values.mSize;
138ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette        ensureCapacity(count);
139ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette
140ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette        System.arraycopy(values.mValues, 0, mValues, mSize, count);
141ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette        mSize += count;
142ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette    }
143ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette
144ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette    /**
145ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette     * Ensures capacity to append at least <code>count</code> values.
146ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette     */
147ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette    private void ensureCapacity(int count) {
148ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette        final int currentSize = mSize;
149ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette        final int minCapacity = currentSize + count;
150ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette        if (minCapacity >= mValues.length) {
151ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette            final int targetCap = currentSize + (currentSize < (MIN_CAPACITY_INCREMENT / 2) ?
152ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette                    MIN_CAPACITY_INCREMENT : currentSize >> 1);
153ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette            final int newCapacity = targetCap > minCapacity ? targetCap : minCapacity;
154ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette            final int[] newValues = ArrayUtils.newUnpaddedIntArray(newCapacity);
155ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette            System.arraycopy(mValues, 0, newValues, 0, currentSize);
156ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette            mValues = newValues;
157ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette        }
158ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette    }
159ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette
160ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette    /**
161ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette     * Removes all values from this array.
162ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette     */
163ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette    public void clear() {
164ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette        mSize = 0;
165ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette    }
166ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette
167ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette    @Override
168ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette    public IntArray clone() throws CloneNotSupportedException {
169ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette        final IntArray clone = (IntArray) super.clone();
170ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette        clone.mValues = mValues.clone();
171ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette        return clone;
172ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette    }
173ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette
174ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette    /**
175ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette     * Returns the value at the specified position in this array.
176ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette     */
177ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette    public int get(int index) {
178112962a6b09310c58093b9a8af341cbeaa612a48Hugo Benichi        checkBounds(index);
179ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette        return mValues[index];
180ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette    }
181ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette
182ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette    /**
183112962a6b09310c58093b9a8af341cbeaa612a48Hugo Benichi     * Sets the value at the specified position in this array.
184112962a6b09310c58093b9a8af341cbeaa612a48Hugo Benichi     */
185112962a6b09310c58093b9a8af341cbeaa612a48Hugo Benichi    public void set(int index, int value) {
186112962a6b09310c58093b9a8af341cbeaa612a48Hugo Benichi        checkBounds(index);
187112962a6b09310c58093b9a8af341cbeaa612a48Hugo Benichi        mValues[index] = value;
188112962a6b09310c58093b9a8af341cbeaa612a48Hugo Benichi    }
189112962a6b09310c58093b9a8af341cbeaa612a48Hugo Benichi
190112962a6b09310c58093b9a8af341cbeaa612a48Hugo Benichi    /**
191ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette     * Returns the index of the first occurrence of the specified value in this
192ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette     * array, or -1 if this array does not contain the value.
193ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette     */
194ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette    public int indexOf(int value) {
195ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette        final int n = mSize;
196ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette        for (int i = 0; i < n; i++) {
197ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette            if (mValues[i] == value) {
198ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette                return i;
199ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette            }
200ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette        }
201ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette        return -1;
202ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette    }
203ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette
204ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette    /**
205ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette     * Removes the value at the specified index from this array.
206ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette     */
207ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette    public void remove(int index) {
208112962a6b09310c58093b9a8af341cbeaa612a48Hugo Benichi        checkBounds(index);
209ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette        System.arraycopy(mValues, index + 1, mValues, index, mSize - index - 1);
210ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette        mSize--;
211ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette    }
212ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette
213ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette    /**
214ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette     * Returns the number of values in this array.
215ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette     */
216ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette    public int size() {
217ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette        return mSize;
218ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette    }
2199c5dfa5c79fff17f96bf977b86c0c9ceb8c3cf9bZoltan Szatmary-Ban
2209c5dfa5c79fff17f96bf977b86c0c9ceb8c3cf9bZoltan Szatmary-Ban    /**
2219c5dfa5c79fff17f96bf977b86c0c9ceb8c3cf9bZoltan Szatmary-Ban     * Returns a new array with the contents of this IntArray.
2229c5dfa5c79fff17f96bf977b86c0c9ceb8c3cf9bZoltan Szatmary-Ban     */
2239c5dfa5c79fff17f96bf977b86c0c9ceb8c3cf9bZoltan Szatmary-Ban    public int[] toArray() {
2249c5dfa5c79fff17f96bf977b86c0c9ceb8c3cf9bZoltan Szatmary-Ban        return Arrays.copyOf(mValues, mSize);
2259c5dfa5c79fff17f96bf977b86c0c9ceb8c3cf9bZoltan Szatmary-Ban    }
226112962a6b09310c58093b9a8af341cbeaa612a48Hugo Benichi
227112962a6b09310c58093b9a8af341cbeaa612a48Hugo Benichi    private void checkBounds(int index) {
228112962a6b09310c58093b9a8af341cbeaa612a48Hugo Benichi        if (index < 0 || mSize <= index) {
229112962a6b09310c58093b9a8af341cbeaa612a48Hugo Benichi            throw new ArrayIndexOutOfBoundsException(mSize, index);
230112962a6b09310c58093b9a8af341cbeaa612a48Hugo Benichi        }
231112962a6b09310c58093b9a8af341cbeaa612a48Hugo Benichi    }
232ffb46bf2956d89e3190007ccf2ef3ce3eed005feAlan Viverette}
233