/* * Copyright (c) 2014-present, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. */ package com.facebook.stetho.inspector.helper; import android.util.SparseArray; import java.util.IdentityHashMap; import java.util.Map; import javax.annotation.Nullable; import javax.annotation.concurrent.GuardedBy; public class ObjectIdMapper { protected final Object mSync = new Object(); @GuardedBy("mSync") private int mNextId = 1; @GuardedBy("mSync") private final Map<Object, Integer> mObjectToIdMap = new IdentityHashMap<Object, Integer>(); @GuardedBy("mSync") private SparseArray<Object> mIdToObjectMap = new SparseArray<Object>(); public void clear() { SparseArray<Object> idToObjectMap; synchronized (mSync) { idToObjectMap = mIdToObjectMap; mObjectToIdMap.clear(); mIdToObjectMap = new SparseArray<Object>(); } int size = idToObjectMap.size(); for (int i = 0; i < size; ++i) { int id = idToObjectMap.keyAt(i); Object object = idToObjectMap.valueAt(i); onUnmapped(object, id); } } public boolean containsId(int id) { synchronized (mSync) { return mIdToObjectMap.get(id) != null; } } public boolean containsObject(Object object) { synchronized (mSync) { return mObjectToIdMap.containsKey(object); } } @Nullable public Object getObjectForId(int id) { synchronized (mSync) { return mIdToObjectMap.get(id); } } @Nullable public Integer getIdForObject(Object object) { synchronized (mSync) { return mObjectToIdMap.get(object); } } public int putObject(Object object) { Integer id; synchronized (mSync) { id = mObjectToIdMap.get(object); if (id != null) { return id; } id = mNextId++; mObjectToIdMap.put(object, id); mIdToObjectMap.put(id, object); } onMapped(object, id); return id; } @Nullable public Object removeObjectById(int id) { Object object; synchronized (mSync) { object = mIdToObjectMap.get(id); if (object == null) { return null; } mIdToObjectMap.remove(id); mObjectToIdMap.remove(object); } onUnmapped(object, id); return object; } @Nullable public Integer removeObject(Object object) { Integer id; synchronized (mSync) { id = mObjectToIdMap.remove(object); if (id == null) { return null; } mIdToObjectMap.remove(id); } onUnmapped(object, id); return id; } public int size() { synchronized (mSync) { return mObjectToIdMap.size(); } } protected void onMapped(Object object, int id) { } protected void onUnmapped(Object object, int id) { } }