blob: f708d3772ba26be37661490d14e231bb0ab4caf1 [file] [log] [blame]
/*
* Copyright (C) 2022 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.server.am;
import android.util.ArrayMap;
import android.util.SparseArray;
/**
* Utility class to track mappings between (UID, name) and E.
*
* @param <E> The type of the values in this map.
*/
public class UidProcessMap<E> {
final SparseArray<ArrayMap<String, E>> mMap = new SparseArray<>();
/**
* Retrieve a value from the map.
*/
public E get(int uid, String name) {
final ArrayMap<String, E> names = mMap.get(uid);
if (names == null) {
return null;
}
return names.get(name);
}
/**
* Add a new value to the array map.
*/
public E put(int uid, String name, E value) {
ArrayMap<String, E> names = mMap.get(uid);
if (names == null) {
names = new ArrayMap<String, E>(2);
mMap.put(uid, names);
}
names.put(name, value);
return value;
}
/**
* Remove an existing key (uid, name) from the array map.
*/
public E remove(int uid, String name) {
final int index = mMap.indexOfKey(uid);
if (index < 0) {
return null;
}
final ArrayMap<String, E> names = mMap.valueAt(index);
if (names != null) {
final E old = names.remove(name);
if (names.isEmpty()) {
mMap.removeAt(index);
}
return old;
}
return null;
}
/**
* Return the underneath map.
*/
public SparseArray<ArrayMap<String, E>> getMap() {
return mMap;
}
/**
* Return the number of items in this map.
*/
public int size() {
return mMap.size();
}
/**
* Make the map empty. All storage is released.
*/
public void clear() {
mMap.clear();
}
/**
* Perform a {@link #put} of all key/value pairs in other.
*/
public void putAll(UidProcessMap<E> other) {
for (int i = other.mMap.size() - 1; i >= 0; i--) {
final int uid = other.mMap.keyAt(i);
final ArrayMap<String, E> names = mMap.get(uid);
if (names != null) {
names.putAll(other.mMap.valueAt(i));
} else {
mMap.put(uid, new ArrayMap<String, E>(other.mMap.valueAt(i)));
}
}
}
}