package com.bumptech.glide.provider; import android.support.annotation.Nullable; import android.support.v4.util.ArrayMap; import com.bumptech.glide.load.engine.LoadPath; import com.bumptech.glide.util.MultiClassKey; import java.util.concurrent.atomic.AtomicReference; /** * Maintains a cache of data, resource, and transcode classes to available * {@link com.bumptech.glide.load.engine.LoadPath}s capable of decoding with the requested types. */ public class LoadPathCache { private final ArrayMap<MultiClassKey, LoadPath<?, ?, ?>> cache = new ArrayMap<>(); private final AtomicReference<MultiClassKey> keyRef = new AtomicReference<>(); public boolean contains(Class<?> dataClass, Class<?> resourceClass, Class<?> transcodeClass) { MultiClassKey key = getKey(dataClass, resourceClass, transcodeClass); boolean result; synchronized (cache) { result = cache.containsKey(key); } keyRef.set(key); return result; } @SuppressWarnings("unchecked") @Nullable public <Data, TResource, Transcode> LoadPath<Data, TResource, Transcode> get( Class<Data> dataClass, Class<TResource> resourceClass, Class<Transcode> transcodeClass) { MultiClassKey key = getKey(dataClass, resourceClass, transcodeClass); LoadPath<?, ?, ?> result; synchronized (cache) { result = cache.get(key); } keyRef.set(key); return (LoadPath<Data, TResource, Transcode>) result; } public void put(Class<?> dataClass, Class<?> resourceClass, Class<?> transcodeClass, LoadPath<?, ?, ?> loadPath) { synchronized (cache) { cache.put(new MultiClassKey(dataClass, resourceClass, transcodeClass), loadPath); } } private MultiClassKey getKey(Class<?> dataClass, Class<?> resourceClass, Class<?> transcodeClass) { MultiClassKey key = keyRef.getAndSet(null); if (key == null) { key = new MultiClassKey(); } key.set(dataClass, resourceClass, transcodeClass); return key; } }