Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 600d2fcb authored by Hai Zhang's avatar Hai Zhang
Browse files

Improve collection code.

Use forEach(Reversed)Indexed everywhere since it's inlined.

Also added some missing methods.

Bug: 182523293
Test: presubmit
Change-Id: Ie13baa3325a7a72ddd0ebbae0c3266afb20f50c8
parent 8ec0b69d
Loading
Loading
Loading
Loading
+16 −10
Original line number Diff line number Diff line
@@ -19,8 +19,8 @@ package com.android.server.permission.access.collection
typealias IndexedList<T> = ArrayList<T>

inline fun <T> IndexedList<T>.allIndexed(predicate: (Int, T) -> Boolean): Boolean {
    for (index in 0 until size) {
        if (!predicate(index, this[index])) {
    forEachIndexed { index, element ->
        if (!predicate(index, element)) {
            return false
        }
    }
@@ -28,8 +28,8 @@ inline fun <T> IndexedList<T>.allIndexed(predicate: (Int, T) -> Boolean): Boolea
}

inline fun <T> IndexedList<T>.anyIndexed(predicate: (Int, T) -> Boolean): Boolean {
    for (index in 0 until size) {
        if (predicate(index, this[index])) {
    forEachIndexed { index, element ->
        if (predicate(index, element)) {
            return true
        }
    }
@@ -45,6 +45,12 @@ inline fun <T> IndexedList<T>.forEachIndexed(action: (Int, T) -> Unit) {
    }
}

inline fun <T> IndexedList<T>.forEachReversedIndexed(action: (Int, T) -> Unit) {
    for (index in lastIndex downTo 0) {
        action(index, this[index])
    }
}

@Suppress("NOTHING_TO_INLINE")
inline operator fun <T> IndexedList<T>.minus(element: T): IndexedList<T> =
    copy().apply { this -= element }
@@ -55,8 +61,8 @@ inline operator fun <T> IndexedList<T>.minusAssign(element: T) {
}

inline fun <T> IndexedList<T>.noneIndexed(predicate: (Int, T) -> Boolean): Boolean {
    for (index in 0 until size) {
        if (predicate(index, this[index])) {
    forEachIndexed { index, element ->
        if (predicate(index, element)) {
            return false
        }
    }
@@ -74,8 +80,8 @@ inline operator fun <T> IndexedList<T>.plusAssign(element: T) {

inline fun <T> IndexedList<T>.removeAllIndexed(predicate: (Int, T) -> Boolean): Boolean {
    var isChanged = false
    for (index in lastIndex downTo 0) {
        if (predicate(index, this[index])) {
    forEachReversedIndexed { index, element ->
        if (predicate(index, element)) {
            removeAt(index)
            isChanged = true
        }
@@ -85,8 +91,8 @@ inline fun <T> IndexedList<T>.removeAllIndexed(predicate: (Int, T) -> Boolean):

inline fun <T> IndexedList<T>.retainAllIndexed(predicate: (Int, T) -> Boolean): Boolean {
    var isChanged = false
    for (index in lastIndex downTo 0) {
        if (!predicate(index, this[index])) {
    forEachReversedIndexed { index, element ->
        if (!predicate(index, element)) {
            removeAt(index)
            isChanged = true
        }
+16 −10
Original line number Diff line number Diff line
@@ -70,8 +70,8 @@ class IndexedListSet<T> private constructor(
}

inline fun <T> IndexedListSet<T>.allIndexed(predicate: (Int, T) -> Boolean): Boolean {
    for (index in 0 until size) {
        if (!predicate(index, elementAt(index))) {
    forEachIndexed { index, element ->
        if (!predicate(index, element)) {
            return false
        }
    }
@@ -79,8 +79,8 @@ inline fun <T> IndexedListSet<T>.allIndexed(predicate: (Int, T) -> Boolean): Boo
}

inline fun <T> IndexedListSet<T>.anyIndexed(predicate: (Int, T) -> Boolean): Boolean {
    for (index in 0 until size) {
        if (predicate(index, elementAt(index))) {
    forEachIndexed { index, element ->
        if (predicate(index, element)) {
            return true
        }
    }
@@ -93,6 +93,12 @@ inline fun <T> IndexedListSet<T>.forEachIndexed(action: (Int, T) -> Unit) {
    }
}

inline fun <T> IndexedListSet<T>.forEachReversedIndexed(action: (Int, T) -> Unit) {
    for (index in lastIndex downTo 0) {
        action(index, elementAt(index))
    }
}

inline val <T> IndexedListSet<T>.lastIndex: Int
    get() = size - 1

@@ -106,8 +112,8 @@ inline operator fun <T> IndexedListSet<T>.minusAssign(element: T) {
}

inline fun <T> IndexedListSet<T>.noneIndexed(predicate: (Int, T) -> Boolean): Boolean {
    for (index in 0 until size) {
        if (predicate(index, elementAt(index))) {
    forEachIndexed { index, element ->
        if (predicate(index, element)) {
            return false
        }
    }
@@ -125,8 +131,8 @@ inline operator fun <T> IndexedListSet<T>.plusAssign(element: T) {

inline fun <T> IndexedListSet<T>.removeAllIndexed(predicate: (Int, T) -> Boolean): Boolean {
    var isChanged = false
    for (index in lastIndex downTo 0) {
        if (predicate(index, elementAt(index))) {
    forEachReversedIndexed { index, element ->
        if (predicate(index, element)) {
            removeAt(index)
            isChanged = true
        }
@@ -136,8 +142,8 @@ inline fun <T> IndexedListSet<T>.removeAllIndexed(predicate: (Int, T) -> Boolean

inline fun <T> IndexedListSet<T>.retainAllIndexed(predicate: (Int, T) -> Boolean): Boolean {
    var isChanged = false
    for (index in lastIndex downTo 0) {
        if (!predicate(index, elementAt(index))) {
    forEachReversedIndexed { index, element ->
        if (!predicate(index, element)) {
            removeAt(index)
            isChanged = true
        }
+25 −10
Original line number Diff line number Diff line
@@ -21,8 +21,8 @@ import android.util.ArrayMap
typealias IndexedMap<K, V> = ArrayMap<K, V>

inline fun <K, V> IndexedMap<K, V>.allIndexed(predicate: (Int, K, V) -> Boolean): Boolean {
    for (index in 0 until size) {
        if (!predicate(index, keyAt(index), valueAt(index))) {
    forEachIndexed { index, key, value ->
        if (!predicate(index, key, value)) {
            return false
        }
    }
@@ -30,8 +30,8 @@ inline fun <K, V> IndexedMap<K, V>.allIndexed(predicate: (Int, K, V) -> Boolean)
}

inline fun <K, V> IndexedMap<K, V>.anyIndexed(predicate: (Int, K, V) -> Boolean): Boolean {
    for (index in 0 until size) {
        if (predicate(index, keyAt(index), valueAt(index))) {
    forEachIndexed { index, key, value ->
        if (predicate(index, key, value)) {
            return true
        }
    }
@@ -46,8 +46,8 @@ inline fun <K, V> IndexedMap<K, V>.copy(copyValue: (V) -> V): IndexedMap<K, V> =
    }

inline fun <K, V, R> IndexedMap<K, V>.firstNotNullOfOrNullIndexed(transform: (Int, K, V) -> R): R? {
    for (index in 0 until size) {
        transform(index, keyAt(index), valueAt(index))?.let { return it }
    forEachIndexed { index, key, value ->
        transform(index, key, value)?.let { return it }
    }
    return null
}
@@ -64,6 +64,12 @@ inline fun <K, V> IndexedMap<K, V>.forEachKeyIndexed(action: (Int, K) -> Unit) {
    }
}

inline fun <K, V> IndexedMap<K, V>.forEachReversedIndexed(action: (Int, K, V) -> Unit) {
    for (index in lastIndex downTo 0) {
        action(index, keyAt(index), valueAt(index))
    }
}

inline fun <K, V> IndexedMap<K, V>.forEachValueIndexed(action: (Int, V) -> Unit) {
    for (index in 0 until size) {
        action(index, valueAt(index))
@@ -90,6 +96,15 @@ inline operator fun <K, V> IndexedMap<K, V>.minusAssign(key: K) {
    remove(key)
}

inline fun <K, V> IndexedMap<K, V>.noneIndexed(predicate: (Int, K, V) -> Boolean): Boolean {
    forEachIndexed { index, key, value ->
        if (predicate(index, key, value)) {
            return false
        }
    }
    return true
}

@Suppress("NOTHING_TO_INLINE")
inline fun <K, V> IndexedMap<K, V>.putWithDefault(key: K, value: V, defaultValue: V): V {
    val index = indexOfKey(key)
@@ -113,8 +128,8 @@ inline fun <K, V> IndexedMap<K, V>.putWithDefault(key: K, value: V, defaultValue

inline fun <K, V> IndexedMap<K, V>.removeAllIndexed(predicate: (Int, K, V) -> Boolean): Boolean {
    var isChanged = false
    for (index in lastIndex downTo 0) {
        if (predicate(index, keyAt(index), valueAt(index))) {
    forEachReversedIndexed { index, key, value ->
        if (predicate(index, key, value)) {
            removeAt(index)
            isChanged = true
        }
@@ -124,8 +139,8 @@ inline fun <K, V> IndexedMap<K, V>.removeAllIndexed(predicate: (Int, K, V) -> Bo

inline fun <K, V> IndexedMap<K, V>.retainAllIndexed(predicate: (Int, K, V) -> Boolean): Boolean {
    var isChanged = false
    for (index in lastIndex downTo 0) {
        if (!predicate(index, keyAt(index), valueAt(index))) {
    forEachReversedIndexed { index, key, value ->
        if (!predicate(index, key, value)) {
            removeAt(index)
            isChanged = true
        }
+16 −10
Original line number Diff line number Diff line
@@ -21,8 +21,8 @@ import android.util.ArraySet
typealias IndexedSet<T> = ArraySet<T>

inline fun <T> IndexedSet<T>.allIndexed(predicate: (Int, T) -> Boolean): Boolean {
    for (index in 0 until size) {
        if (!predicate(index, elementAt(index))) {
    forEachIndexed { index, element ->
        if (!predicate(index, element)) {
            return false
        }
    }
@@ -30,8 +30,8 @@ inline fun <T> IndexedSet<T>.allIndexed(predicate: (Int, T) -> Boolean): Boolean
}

inline fun <T> IndexedSet<T>.anyIndexed(predicate: (Int, T) -> Boolean): Boolean {
    for (index in 0 until size) {
        if (predicate(index, elementAt(index))) {
    forEachIndexed { index, element ->
        if (predicate(index, element)) {
            return true
        }
    }
@@ -50,6 +50,12 @@ inline fun <T> IndexedSet<T>.forEachIndexed(action: (Int, T) -> Unit) {
    }
}

inline fun <T> IndexedSet<T>.forEachReversedIndexed(action: (Int, T) -> Unit) {
    for (index in lastIndex downTo 0) {
        action(index, elementAt(index))
    }
}

inline val <T> IndexedSet<T>.lastIndex: Int
    get() = size - 1

@@ -63,8 +69,8 @@ inline operator fun <T> IndexedSet<T>.minusAssign(element: T) {
}

inline fun <T> IndexedSet<T>.noneIndexed(predicate: (Int, T) -> Boolean): Boolean {
    for (index in 0 until size) {
        if (predicate(index, elementAt(index))) {
    forEachIndexed { index, element ->
        if (predicate(index, element)) {
            return false
        }
    }
@@ -82,8 +88,8 @@ inline operator fun <T> IndexedSet<T>.plusAssign(element: T) {

inline fun <T> IndexedSet<T>.removeAllIndexed(predicate: (Int, T) -> Boolean): Boolean {
    var isChanged = false
    for (index in lastIndex downTo 0) {
        if (predicate(index, elementAt(index))) {
    forEachReversedIndexed { index, element ->
        if (predicate(index, element)) {
            removeAt(index)
            isChanged = true
        }
@@ -93,8 +99,8 @@ inline fun <T> IndexedSet<T>.removeAllIndexed(predicate: (Int, T) -> Boolean): B

inline fun <T> IndexedSet<T>.retainAllIndexed(predicate: (Int, T) -> Boolean): Boolean {
    var isChanged = false
    for (index in lastIndex downTo 0) {
        if (!predicate(index, elementAt(index))) {
    forEachReversedIndexed { index, element ->
        if (!predicate(index, element)) {
            removeAt(index)
            isChanged = true
        }
+18 −12
Original line number Diff line number Diff line
@@ -21,8 +21,8 @@ import android.util.SparseArray
typealias IntMap<T> = SparseArray<T>

inline fun <T> IntMap<T>.allIndexed(predicate: (Int, Int, T) -> Boolean): Boolean {
    for (index in 0 until size) {
        if (!predicate(index, keyAt(index), valueAt(index))) {
    forEachIndexed { index, key, value ->
        if (!predicate(index, key, value)) {
            return false
        }
    }
@@ -30,8 +30,8 @@ inline fun <T> IntMap<T>.allIndexed(predicate: (Int, Int, T) -> Boolean): Boolea
}

inline fun <T> IntMap<T>.anyIndexed(predicate: (Int, Int, T) -> Boolean): Boolean {
    for (index in 0 until size) {
        if (predicate(index, keyAt(index), valueAt(index))) {
    forEachIndexed { index, key, value ->
        if (predicate(index, key, value)) {
            return true
        }
    }
@@ -46,8 +46,8 @@ inline fun <T> IntMap<T>.copy(copyValue: (T) -> T): IntMap<T> =
    }

inline fun <T, R> IntMap<T>.firstNotNullOfOrNullIndexed(transform: (Int, Int, T) -> R): R? {
    for (index in 0 until size) {
        transform(index, keyAt(index), valueAt(index))?.let { return it }
    forEachIndexed { index, key, value ->
        transform(index, key, value)?.let { return it }
    }
    return null
}
@@ -64,6 +64,12 @@ inline fun <T> IntMap<T>.forEachKeyIndexed(action: (Int, Int) -> Unit) {
    }
}

inline fun <T> IntMap<T>.forEachReversedIndexed(action: (Int, Int, T) -> Unit) {
    for (index in lastIndex downTo 0) {
        action(index, keyAt(index), valueAt(index))
    }
}

inline fun <T> IntMap<T>.forEachValueIndexed(action: (Int, T) -> Unit) {
    for (index in 0 until size) {
        action(index, valueAt(index))
@@ -91,8 +97,8 @@ inline operator fun <T> IntMap<T>.minusAssign(key: Int) {
}

inline fun <T> IntMap<T>.noneIndexed(predicate: (Int, Int, T) -> Boolean): Boolean {
    for (index in 0 until size) {
        if (predicate(index, keyAt(index), valueAt(index))) {
    forEachIndexed { index, key, value ->
        if (predicate(index, key, value)) {
            return false
        }
    }
@@ -122,8 +128,8 @@ inline fun <T> IntMap<T>.putWithDefault(key: Int, value: T, defaultValue: T): T

inline fun <T> IntMap<T>.removeAllIndexed(predicate: (Int, Int, T) -> Boolean): Boolean {
    var isChanged = false
    for (index in lastIndex downTo 0) {
        if (predicate(index, keyAt(index), valueAt(index))) {
    forEachReversedIndexed { index, key, value ->
        if (predicate(index, key, value)) {
            removeAt(index)
            isChanged = true
        }
@@ -133,8 +139,8 @@ inline fun <T> IntMap<T>.removeAllIndexed(predicate: (Int, Int, T) -> Boolean):

inline fun <T> IntMap<T>.retainAllIndexed(predicate: (Int, Int, T) -> Boolean): Boolean {
    var isChanged = false
    for (index in lastIndex downTo 0) {
        if (!predicate(index, keyAt(index), valueAt(index))) {
    forEachReversedIndexed { index, key, value ->
        if (!predicate(index, key, value)) {
            removeAt(index)
            isChanged = true
        }
Loading