• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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