1 /*
<lambda>null2 * Copyright (C) 2021 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 package com.android.server.permission.access.collection
18
19 import android.util.ArraySet
20
21 typealias IndexedSet<T> = ArraySet<T>
22
23 inline fun <T> IndexedSet<T>.allIndexed(predicate: (Int, T) -> Boolean): Boolean {
24 forEachIndexed { index, element ->
25 if (!predicate(index, element)) {
26 return false
27 }
28 }
29 return true
30 }
31
anyIndexednull32 inline fun <T> IndexedSet<T>.anyIndexed(predicate: (Int, T) -> Boolean): Boolean {
33 forEachIndexed { index, element ->
34 if (predicate(index, element)) {
35 return true
36 }
37 }
38 return false
39 }
40
41 @Suppress("NOTHING_TO_INLINE")
copynull42 inline fun <T> IndexedSet<T>.copy(): IndexedSet<T> = IndexedSet(this)
43
44 @Suppress("NOTHING_TO_INLINE")
45 inline fun <T> IndexedSet<T>.elementAt(index: Int): T = valueAt(index)
46
47 inline fun <T> IndexedSet<T>.forEachIndexed(action: (Int, T) -> Unit) {
48 for (index in indices) {
49 action(index, elementAt(index))
50 }
51 }
52
forEachReversedIndexednull53 inline fun <T> IndexedSet<T>.forEachReversedIndexed(action: (Int, T) -> Unit) {
54 for (index in lastIndex downTo 0) {
55 action(index, elementAt(index))
56 }
57 }
58
59 inline val <T> IndexedSet<T>.lastIndex: Int
60 get() = size - 1
61
62 @Suppress("NOTHING_TO_INLINE")
minusnull63 inline operator fun <T> IndexedSet<T>.minus(element: T): IndexedSet<T> =
64 copy().apply { this -= element }
65
66 @Suppress("NOTHING_TO_INLINE")
minusAssignnull67 inline operator fun <T> IndexedSet<T>.minusAssign(element: T) {
68 remove(element)
69 }
70
noneIndexednull71 inline fun <T> IndexedSet<T>.noneIndexed(predicate: (Int, T) -> Boolean): Boolean {
72 forEachIndexed { index, element ->
73 if (predicate(index, element)) {
74 return false
75 }
76 }
77 return true
78 }
79
80 @Suppress("NOTHING_TO_INLINE")
plusnull81 inline operator fun <T> IndexedSet<T>.plus(element: T): IndexedSet<T> =
82 copy().apply { this += element }
83
84 @Suppress("NOTHING_TO_INLINE")
plusAssignnull85 inline operator fun <T> IndexedSet<T>.plusAssign(element: T) {
86 add(element)
87 }
88
removeAllIndexednull89 inline fun <T> IndexedSet<T>.removeAllIndexed(predicate: (Int, T) -> Boolean): Boolean {
90 var isChanged = false
91 forEachReversedIndexed { index, element ->
92 if (predicate(index, element)) {
93 removeAt(index)
94 isChanged = true
95 }
96 }
97 return isChanged
98 }
99
retainAllIndexednull100 inline fun <T> IndexedSet<T>.retainAllIndexed(predicate: (Int, T) -> Boolean): Boolean {
101 var isChanged = false
102 forEachReversedIndexed { index, element ->
103 if (!predicate(index, element)) {
104 removeAt(index)
105 isChanged = true
106 }
107 }
108 return isChanged
109 }
110
111 @Suppress("NOTHING_TO_INLINE")
indexedSetOfnull112 inline fun <T> indexedSetOf(vararg elements: T): IndexedSet<T> = IndexedSet(elements.asList())
113