1 /* 2 * Copyright (C) 2018 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 package android.util; 17 18 /** 19 * A sparse array of ArraySets, which is suitable to hold userid->packages association. 20 * 21 * @hide 22 */ 23 public class SparseSetArray<T> { 24 private final SparseArray<ArraySet<T>> mData = new SparseArray<>(); 25 SparseSetArray()26 public SparseSetArray() { 27 } 28 29 /** 30 * Add a value at index n. 31 * @return FALSE when the value already existed at the given index, TRUE otherwise. 32 */ add(int n, T value)33 public boolean add(int n, T value) { 34 ArraySet<T> set = mData.get(n); 35 if (set == null) { 36 set = new ArraySet<>(); 37 mData.put(n, set); 38 } 39 if (set.contains(value)) { 40 return true; 41 } 42 set.add(value); 43 return false; 44 } 45 46 /** 47 * @return whether a value exists at index n. 48 */ contains(int n, T value)49 public boolean contains(int n, T value) { 50 final ArraySet<T> set = mData.get(n); 51 if (set == null) { 52 return false; 53 } 54 return set.contains(value); 55 } 56 57 /** 58 * Remove a value from index n. 59 * @return TRUE when the value existed at the given index and removed, FALSE otherwise. 60 */ remove(int n, T value)61 public boolean remove(int n, T value) { 62 final ArraySet<T> set = mData.get(n); 63 if (set == null) { 64 return false; 65 } 66 final boolean ret = set.remove(value); 67 if (set.size() == 0) { 68 mData.remove(n); 69 } 70 return ret; 71 } 72 73 /** 74 * Remove all values from index n. 75 */ remove(int n)76 public void remove(int n) { 77 mData.remove(n); 78 } size()79 public int size() { 80 return mData.size(); 81 } 82 keyAt(int index)83 public int keyAt(int index) { 84 return mData.keyAt(index); 85 } 86 sizeAt(int index)87 public int sizeAt(int index) { 88 final ArraySet<T> set = mData.valueAt(index); 89 if (set == null) { 90 return 0; 91 } 92 return set.size(); 93 } 94 valueAt(int intIndex, int valueIndex)95 public T valueAt(int intIndex, int valueIndex) { 96 return mData.valueAt(intIndex).valueAt(valueIndex); 97 } 98 } 99