package com.bumptech.glide.provider;
import android.support.annotation.Nullable;
import com.bumptech.glide.load.ResourceEncoder;
import com.bumptech.glide.util.Synthetic;
import java.util.ArrayList;
import java.util.List;
/**
* Contains an unordered list of {@link ResourceEncoder}s capable of encoding arbitrary resource
* types.
*/
public class ResourceEncoderRegistry {
// TODO: this should probably be a put.
final List<Entry<?>> encoders = new ArrayList<>();
public synchronized <Z> void add(Class<Z> resourceClass, ResourceEncoder<Z> encoder) {
encoders.add(new Entry<>(resourceClass, encoder));
}
@SuppressWarnings("unchecked")
@Nullable
public synchronized <Z> ResourceEncoder<Z> get(Class<Z> resourceClass) {
int size = encoders.size();
for (int i = 0; i < size; i++) {
Entry<?> entry = encoders.get(i);
if (entry.handles(resourceClass)) {
return (ResourceEncoder<Z>) entry.encoder;
}
}
// TODO: throw an exception here?
return null;
}
private static final class Entry<T> {
private final Class<T> resourceClass;
@Synthetic final ResourceEncoder<T> encoder;
Entry(Class<T> resourceClass, ResourceEncoder<T> encoder) {
this.resourceClass = resourceClass;
this.encoder = encoder;
}
@Synthetic
boolean handles(Class<?> resourceClass) {
return this.resourceClass.isAssignableFrom(resourceClass);
}
}
}