package org.inferred.freebuilder.processor.util.feature;
import com.google.common.base.Joiner;
import com.google.common.collect.ImmutableMap;
/**
* Stores a set of {@link Feature} instances, defaulting to {@link FeatureType#testDefault} when
* asked for a type that was not explicitly registered.
*/
public class StaticFeatureSet implements FeatureSet {
@SuppressWarnings("rawtypes")
private final ImmutableMap<Class<? extends Feature>, Feature<?>> featuresByType;
/**
* Creates a feature set which will return {@code features} when {@link #get} is called for the
* appropriate type.
*/
public StaticFeatureSet(Feature<?>... features) {
@SuppressWarnings("rawtypes")
ImmutableMap.Builder<Class<? extends Feature>, Feature<?>> featuresBuilder =
ImmutableMap.builder();
for (Feature<?> feature : features) {
featuresBuilder.put(feature.getClass(), feature);
}
this.featuresByType = featuresBuilder.build();
}
/**
* Returns the registered instance of {@code featureType}, or the value of
* {@link FeatureType#testDefault} if no explicit instance was registered with this set.
*/
@Override
public <T extends Feature<T>> T get(FeatureType<T> featureType) {
@SuppressWarnings("unchecked")
T feature = (T) featuresByType.get(featureType.type());
if (feature != null) {
return feature;
}
return featureType.testDefault(this);
}
@Override
public String toString() {
return Joiner.on(", ").join(featuresByType.values());
}
}