Checkng upper bound in *Array classes.
*Array classes will now throw an IndexOutOfBoundsException if a caller tries to get or set a value for an index that's invalid based on the current size. Bug: 118339123 Test: atest CtsUtilTestCases Change-Id: Iddc9a0c7c89e0ac743b0380049527a1b2dfb434f
This commit is contained in:
@@ -16,12 +16,12 @@
|
||||
|
||||
package android.util;
|
||||
|
||||
import libcore.util.EmptyArray;
|
||||
|
||||
import android.annotation.UnsupportedAppUsage;
|
||||
|
||||
import com.android.internal.util.ArrayUtils;
|
||||
|
||||
import libcore.util.EmptyArray;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.ConcurrentModificationException;
|
||||
import java.util.Map;
|
||||
@@ -453,6 +453,10 @@ public final class ArrayMap<K, V> implements Map<K, V> {
|
||||
* @return Returns the key stored at the given index.
|
||||
*/
|
||||
public K keyAt(int index) {
|
||||
if (index >= mSize) {
|
||||
// The array might be slightly bigger than mSize, in which case, indexing won't fail.
|
||||
throw new ArrayIndexOutOfBoundsException(index);
|
||||
}
|
||||
return (K)mArray[index << 1];
|
||||
}
|
||||
|
||||
@@ -462,6 +466,10 @@ public final class ArrayMap<K, V> implements Map<K, V> {
|
||||
* @return Returns the value stored at the given index.
|
||||
*/
|
||||
public V valueAt(int index) {
|
||||
if (index >= mSize) {
|
||||
// The array might be slightly bigger than mSize, in which case, indexing won't fail.
|
||||
throw new ArrayIndexOutOfBoundsException(index);
|
||||
}
|
||||
return (V)mArray[(index << 1) + 1];
|
||||
}
|
||||
|
||||
@@ -472,6 +480,10 @@ public final class ArrayMap<K, V> implements Map<K, V> {
|
||||
* @return Returns the previous value at the given index.
|
||||
*/
|
||||
public V setValueAt(int index, V value) {
|
||||
if (index >= mSize) {
|
||||
// The array might be slightly bigger than mSize, in which case, indexing won't fail.
|
||||
throw new ArrayIndexOutOfBoundsException(index);
|
||||
}
|
||||
index = (index << 1) + 1;
|
||||
V old = (V)mArray[index];
|
||||
mArray[index] = value;
|
||||
@@ -665,6 +677,11 @@ public final class ArrayMap<K, V> implements Map<K, V> {
|
||||
* @return Returns the value that was stored at this index.
|
||||
*/
|
||||
public V removeAt(int index) {
|
||||
if (index >= mSize) {
|
||||
// The array might be slightly bigger than mSize, in which case, indexing won't fail.
|
||||
throw new ArrayIndexOutOfBoundsException(index);
|
||||
}
|
||||
|
||||
final Object old = mArray[(index << 1) + 1];
|
||||
final int osize = mSize;
|
||||
final int nsize;
|
||||
|
||||
@@ -21,9 +21,6 @@ import com.android.internal.util.GrowingArrayUtils;
|
||||
|
||||
import libcore.util.EmptyArray;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
* SparseArray mapping longs to Objects. Unlike a normal array of Objects,
|
||||
* there can be gaps in the indices. It is intended to be more memory efficient
|
||||
@@ -147,6 +144,10 @@ public class LongSparseArray<E> implements Cloneable {
|
||||
* Removes the mapping at the specified index.
|
||||
*/
|
||||
public void removeAt(int index) {
|
||||
if (index >= mSize) {
|
||||
// The array might be slightly bigger than mSize, in which case, indexing won't fail.
|
||||
throw new ArrayIndexOutOfBoundsException(index);
|
||||
}
|
||||
if (mValues[index] != DELETED) {
|
||||
mValues[index] = DELETED;
|
||||
mGarbage = true;
|
||||
@@ -236,6 +237,10 @@ public class LongSparseArray<E> implements Cloneable {
|
||||
* key.</p>
|
||||
*/
|
||||
public long keyAt(int index) {
|
||||
if (index >= mSize) {
|
||||
// The array might be slightly bigger than mSize, in which case, indexing won't fail.
|
||||
throw new ArrayIndexOutOfBoundsException(index);
|
||||
}
|
||||
if (mGarbage) {
|
||||
gc();
|
||||
}
|
||||
@@ -256,6 +261,10 @@ public class LongSparseArray<E> implements Cloneable {
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public E valueAt(int index) {
|
||||
if (index >= mSize) {
|
||||
// The array might be slightly bigger than mSize, in which case, indexing won't fail.
|
||||
throw new ArrayIndexOutOfBoundsException(index);
|
||||
}
|
||||
if (mGarbage) {
|
||||
gc();
|
||||
}
|
||||
@@ -269,6 +278,10 @@ public class LongSparseArray<E> implements Cloneable {
|
||||
* LongSparseArray stores.
|
||||
*/
|
||||
public void setValueAt(int index, E value) {
|
||||
if (index >= mSize) {
|
||||
// The array might be slightly bigger than mSize, in which case, indexing won't fail.
|
||||
throw new ArrayIndexOutOfBoundsException(index);
|
||||
}
|
||||
if (mGarbage) {
|
||||
gc();
|
||||
}
|
||||
|
||||
@@ -16,14 +16,13 @@
|
||||
|
||||
package android.util;
|
||||
|
||||
import android.annotation.UnsupportedAppUsage;
|
||||
|
||||
import com.android.internal.util.ArrayUtils;
|
||||
import com.android.internal.util.GrowingArrayUtils;
|
||||
|
||||
import android.annotation.UnsupportedAppUsage;
|
||||
import libcore.util.EmptyArray;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
/**
|
||||
* Map of {@code long} to {@code long}. Unlike a normal array of longs, there
|
||||
* can be gaps in the indices. It is intended to be more memory efficient than using a
|
||||
@@ -173,6 +172,10 @@ public class LongSparseLongArray implements Cloneable {
|
||||
* key.</p>
|
||||
*/
|
||||
public long keyAt(int index) {
|
||||
if (index >= mSize) {
|
||||
// The array might be slightly bigger than mSize, in which case, indexing won't fail.
|
||||
throw new ArrayIndexOutOfBoundsException(index);
|
||||
}
|
||||
return mKeys[index];
|
||||
}
|
||||
|
||||
@@ -188,6 +191,10 @@ public class LongSparseLongArray implements Cloneable {
|
||||
* associated with the largest key.</p>
|
||||
*/
|
||||
public long valueAt(int index) {
|
||||
if (index >= mSize) {
|
||||
// The array might be slightly bigger than mSize, in which case, indexing won't fail.
|
||||
throw new ArrayIndexOutOfBoundsException(index);
|
||||
}
|
||||
return mValues[index];
|
||||
}
|
||||
|
||||
|
||||
@@ -16,10 +16,11 @@
|
||||
|
||||
package android.util;
|
||||
|
||||
import android.annotation.UnsupportedAppUsage;
|
||||
|
||||
import com.android.internal.util.ArrayUtils;
|
||||
import com.android.internal.util.GrowingArrayUtils;
|
||||
|
||||
import android.annotation.UnsupportedAppUsage;
|
||||
import libcore.util.EmptyArray;
|
||||
|
||||
/**
|
||||
@@ -171,6 +172,10 @@ public class SparseArray<E> implements Cloneable {
|
||||
* the behavior is undefined.</p>
|
||||
*/
|
||||
public void removeAt(int index) {
|
||||
if (index >= mSize) {
|
||||
// The array might be slightly bigger than mSize, in which case, indexing won't fail.
|
||||
throw new ArrayIndexOutOfBoundsException(index);
|
||||
}
|
||||
if (mValues[index] != DELETED) {
|
||||
mValues[index] = DELETED;
|
||||
mGarbage = true;
|
||||
@@ -279,6 +284,10 @@ public class SparseArray<E> implements Cloneable {
|
||||
* the behavior is undefined.</p>
|
||||
*/
|
||||
public int keyAt(int index) {
|
||||
if (index >= mSize) {
|
||||
// The array might be slightly bigger than mSize, in which case, indexing won't fail.
|
||||
throw new ArrayIndexOutOfBoundsException(index);
|
||||
}
|
||||
if (mGarbage) {
|
||||
gc();
|
||||
}
|
||||
@@ -302,6 +311,10 @@ public class SparseArray<E> implements Cloneable {
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public E valueAt(int index) {
|
||||
if (index >= mSize) {
|
||||
// The array might be slightly bigger than mSize, in which case, indexing won't fail.
|
||||
throw new ArrayIndexOutOfBoundsException(index);
|
||||
}
|
||||
if (mGarbage) {
|
||||
gc();
|
||||
}
|
||||
@@ -317,6 +330,10 @@ public class SparseArray<E> implements Cloneable {
|
||||
* <p>For indices outside of the range <code>0...size()-1</code>, the behavior is undefined.</p>
|
||||
*/
|
||||
public void setValueAt(int index, E value) {
|
||||
if (index >= mSize) {
|
||||
// The array might be slightly bigger than mSize, in which case, indexing won't fail.
|
||||
throw new ArrayIndexOutOfBoundsException(index);
|
||||
}
|
||||
if (mGarbage) {
|
||||
gc();
|
||||
}
|
||||
|
||||
@@ -16,10 +16,11 @@
|
||||
|
||||
package android.util;
|
||||
|
||||
import android.annotation.UnsupportedAppUsage;
|
||||
|
||||
import com.android.internal.util.ArrayUtils;
|
||||
import com.android.internal.util.GrowingArrayUtils;
|
||||
|
||||
import android.annotation.UnsupportedAppUsage;
|
||||
import libcore.util.EmptyArray;
|
||||
|
||||
/**
|
||||
@@ -167,6 +168,10 @@ public class SparseBooleanArray implements Cloneable {
|
||||
* key.</p>
|
||||
*/
|
||||
public int keyAt(int index) {
|
||||
if (index >= mSize) {
|
||||
// The array might be slightly bigger than mSize, in which case, indexing won't fail.
|
||||
throw new ArrayIndexOutOfBoundsException(index);
|
||||
}
|
||||
return mKeys[index];
|
||||
}
|
||||
|
||||
@@ -182,6 +187,10 @@ public class SparseBooleanArray implements Cloneable {
|
||||
* associated with the largest key.</p>
|
||||
*/
|
||||
public boolean valueAt(int index) {
|
||||
if (index >= mSize) {
|
||||
// The array might be slightly bigger than mSize, in which case, indexing won't fail.
|
||||
throw new ArrayIndexOutOfBoundsException(index);
|
||||
}
|
||||
return mValues[index];
|
||||
}
|
||||
|
||||
@@ -189,11 +198,19 @@ public class SparseBooleanArray implements Cloneable {
|
||||
* Directly set the value at a particular index.
|
||||
*/
|
||||
public void setValueAt(int index, boolean value) {
|
||||
if (index >= mSize) {
|
||||
// The array might be slightly bigger than mSize, in which case, indexing won't fail.
|
||||
throw new ArrayIndexOutOfBoundsException(index);
|
||||
}
|
||||
mValues[index] = value;
|
||||
}
|
||||
|
||||
/** @hide */
|
||||
public void setKeyAt(int index, int key) {
|
||||
if (index >= mSize) {
|
||||
// The array might be slightly bigger than mSize, in which case, indexing won't fail.
|
||||
throw new ArrayIndexOutOfBoundsException(index);
|
||||
}
|
||||
mKeys[index] = key;
|
||||
}
|
||||
|
||||
|
||||
@@ -16,14 +16,15 @@
|
||||
|
||||
package android.util;
|
||||
|
||||
import android.annotation.UnsupportedAppUsage;
|
||||
|
||||
import com.android.internal.util.ArrayUtils;
|
||||
import com.android.internal.util.GrowingArrayUtils;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
import android.annotation.UnsupportedAppUsage;
|
||||
import libcore.util.EmptyArray;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
/**
|
||||
* SparseIntArrays map integers to integers. Unlike a normal array of integers,
|
||||
* there can be gaps in the indices. It is intended to be more memory efficient
|
||||
@@ -171,6 +172,10 @@ public class SparseIntArray implements Cloneable {
|
||||
* key.</p>
|
||||
*/
|
||||
public int keyAt(int index) {
|
||||
if (index >= mSize) {
|
||||
// The array might be slightly bigger than mSize, in which case, indexing won't fail.
|
||||
throw new ArrayIndexOutOfBoundsException(index);
|
||||
}
|
||||
return mKeys[index];
|
||||
}
|
||||
|
||||
@@ -186,6 +191,10 @@ public class SparseIntArray implements Cloneable {
|
||||
* associated with the largest key.</p>
|
||||
*/
|
||||
public int valueAt(int index) {
|
||||
if (index >= mSize) {
|
||||
// The array might be slightly bigger than mSize, in which case, indexing won't fail.
|
||||
throw new ArrayIndexOutOfBoundsException(index);
|
||||
}
|
||||
return mValues[index];
|
||||
}
|
||||
|
||||
@@ -193,6 +202,10 @@ public class SparseIntArray implements Cloneable {
|
||||
* Directly set the value at a particular index.
|
||||
*/
|
||||
public void setValueAt(int index, int value) {
|
||||
if (index >= mSize) {
|
||||
// The array might be slightly bigger than mSize, in which case, indexing won't fail.
|
||||
throw new ArrayIndexOutOfBoundsException(index);
|
||||
}
|
||||
mValues[index] = value;
|
||||
}
|
||||
|
||||
|
||||
@@ -182,6 +182,10 @@ public class SparseLongArray implements Cloneable {
|
||||
* key.</p>
|
||||
*/
|
||||
public int keyAt(int index) {
|
||||
if (index >= mSize) {
|
||||
// The array might be slightly bigger than mSize, in which case, indexing won't fail.
|
||||
throw new ArrayIndexOutOfBoundsException(index);
|
||||
}
|
||||
return mKeys[index];
|
||||
}
|
||||
|
||||
@@ -197,6 +201,10 @@ public class SparseLongArray implements Cloneable {
|
||||
* associated with the largest key.</p>
|
||||
*/
|
||||
public long valueAt(int index) {
|
||||
if (index >= mSize) {
|
||||
// The array might be slightly bigger than mSize, in which case, indexing won't fail.
|
||||
throw new ArrayIndexOutOfBoundsException(index);
|
||||
}
|
||||
return mValues[index];
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user