package com.bumptech.glide.provider; import android.support.annotation.Nullable; import android.support.v4.util.ArrayMap; import com.bumptech.glide.util.MultiClassKey; import java.util.List; import java.util.concurrent.atomic.AtomicReference; /** * Maintains a cache of Model + Resource class to a set of registered resource classes that are * subclasses of the resource class that can be decoded from the model class. */ public class ModelToResourceClassCache { private final AtomicReference<MultiClassKey> resourceClassKeyRef = new AtomicReference<>(); private final ArrayMap<MultiClassKey, List<Class<?>>> registeredResourceClassCache = new ArrayMap<>(); @Nullable public List<Class<?>> get(Class<?> modelClass, Class<?> resourceClass) { MultiClassKey key = resourceClassKeyRef.getAndSet(null); if (key == null) { key = new MultiClassKey(modelClass, resourceClass); } else { key.set(modelClass, resourceClass); } final List<Class<?>> result; synchronized (registeredResourceClassCache) { result = registeredResourceClassCache.get(key); } resourceClassKeyRef.set(key); return result; } public void put(Class<?> modelClass, Class<?> resourceClass, List<Class<?>> resourceClasses) { synchronized (registeredResourceClassCache) { registeredResourceClassCache .put(new MultiClassKey(modelClass, resourceClass), resourceClasses); } } public void clear() { synchronized (registeredResourceClassCache) { registeredResourceClassCache.clear(); } } }