package de.take_weiland.mods.commons.meta;
import com.google.common.collect.ImmutableMap;
import java.util.Set;
import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull;
/**
* @author diesieben07
*/
final class RegularArrayProperty<T> extends GenericProperty<T> {
private final ImmutableMap<T, Integer> lookup;
private final int shift;
private final int mask;
RegularArrayProperty(int shift, T[] values) {
int bitCount = Integer.numberOfTrailingZeros(Integer.highestOneBit(values.length - 1)) + 1;
checkArgument(shift >= bitCount + 1, "Too many values for given shift (need at least %s)", bitCount - 1);
this.shift = shift;
this.mask = (1 << bitCount) - 1;
ImmutableMap.Builder<T, Integer> b = ImmutableMap.builder();
for (int i = 0; i < values.length; ++i) {
b.put(checkNotNull(values[i], "Cannot have null properties!"), i);
}
lookup = b.build();
}
int toMeta0(T value) {
Integer i = lookup.get(checkNotNull(value, "value"));
checkArgument(i != null, "Unknown property %s", value);
return i;
}
@Override
public final Set<T> values() {
return lookup.keySet();
}
@Override
public final boolean hasDistinctValues() {
return true;
}
@Override
public final T value(int metadata) {
return lookup.keySet().asList().get((metadata >> shift) & mask);
}
@Override
public final int toMeta(T value, int previousMeta) {
return previousMeta | (toMeta0(value) << shift);
}
}