summaryrefslogtreecommitdiff
path: root/core/java/android/util/LongSparseArray.java
diff options
context:
space:
mode:
Diffstat (limited to 'core/java/android/util/LongSparseArray.java')
-rw-r--r--core/java/android/util/LongSparseArray.java67
1 files changed, 67 insertions, 0 deletions
diff --git a/core/java/android/util/LongSparseArray.java b/core/java/android/util/LongSparseArray.java
index d3b2c46ff1c3..55542d898784 100644
--- a/core/java/android/util/LongSparseArray.java
+++ b/core/java/android/util/LongSparseArray.java
@@ -16,11 +16,19 @@
package android.util;
+import android.annotation.NonNull;
+import android.os.Parcel;
+
import com.android.internal.util.ArrayUtils;
import com.android.internal.util.GrowingArrayUtils;
+import com.android.internal.util.Preconditions;
+import com.android.internal.util.function.LongObjPredicate;
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
@@ -140,6 +148,18 @@ public class LongSparseArray<E> implements Cloneable {
delete(key);
}
+ /** @hide */
+ @SuppressWarnings("unchecked")
+ public void removeIf(@NonNull LongObjPredicate<? super E> filter) {
+ Objects.requireNonNull(filter);
+ for (int i = 0; i < mSize; ++i) {
+ if (mValues[i] != DELETED && filter.test(mKeys[i], (E) mValues[i])) {
+ mValues[i] = DELETED;
+ mGarbage = true;
+ }
+ }
+ }
+
/**
* Removes the mapping at the specified index.
*
@@ -442,4 +462,51 @@ public class LongSparseArray<E> implements Cloneable {
buffer.append('}');
return buffer.toString();
}
+
+ /**
+ * @hide
+ */
+ public static class StringParcelling implements
+ com.android.internal.util.Parcelling<LongSparseArray<String>> {
+ @Override
+ public void parcel(LongSparseArray<String> array, Parcel dest, int parcelFlags) {
+ if (array == null) {
+ dest.writeInt(-1);
+ return;
+ }
+
+ int size = array.mSize;
+
+ dest.writeInt(size);
+ dest.writeLongArray(array.mKeys);
+
+ dest.writeStringArray(Arrays.copyOfRange(array.mValues, 0, size, String[].class));
+ }
+
+ @Override
+ public LongSparseArray<String> unparcel(Parcel source) {
+ int size = source.readInt();
+ if (size == -1) {
+ return null;
+ }
+
+ LongSparseArray<String> array = new LongSparseArray<>(0);
+ array.mSize = size;
+ array.mKeys = source.createLongArray();
+ array.mValues = source.createStringArray();
+
+ // Make sure array is sane
+ Preconditions.checkArgument(array.mKeys.length >= size);
+ Preconditions.checkArgument(array.mValues.length >= size);
+
+ if (size > 0) {
+ long last = array.mKeys[0];
+ for (int i = 1; i < size; i++) {
+ Preconditions.checkArgument(last < array.mKeys[i]);
+ }
+ }
+
+ return array;
+ }
+ }
}