package openmods.utils.bitmap;
import com.google.common.collect.AbstractIterator;
import com.google.common.collect.Maps;
import com.google.common.collect.UnmodifiableIterator;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import net.minecraftforge.common.util.ForgeDirection;
import openmods.api.IValueProvider;
import openmods.api.IValueReceiver;
public class BitMapUtils {
public static <T> Iterator<Map.Entry<T, Boolean>> createFlagIterator(final IReadableBitMap<T> map, final Iterable<T> values) {
return createFlagIterator(map, values.iterator());
}
public static <T> Iterator<Map.Entry<T, Boolean>> createFlagIterator(final IReadableBitMap<T> map, final Iterator<T> values) {
return new UnmodifiableIterator<Map.Entry<T, Boolean>>() {
@Override
public boolean hasNext() {
return values.hasNext();
}
@Override
public Entry<T, Boolean> next() {
final T key = values.next();
final boolean value = map.get(key);
return Maps.immutableEntry(key, value);
}
};
}
public static <T> Iterator<T> createTrueValuesIterator(final IReadableBitMap<T> map, final Iterable<T> values) {
return createTrueValuesIterator(map, values.iterator());
}
public static <T> Iterator<T> createTrueValuesIterator(final IReadableBitMap<T> map, final Iterator<T> values) {
return new AbstractIterator<T>() {
@Override
protected T computeNext() {
while (values.hasNext()) {
final T key = values.next();
if (map.get(key)) return key;
}
return endOfData();
}
};
}
public static <T> IValueProvider<Boolean> singleBitProvider(final IReadableBitMap<T> map, final T key) {
return new IValueProvider<Boolean>() {
@Override
public Boolean getValue() {
return map.get(key);
}
};
}
public static <T> IValueReceiver<Boolean> singleBitReceiver(final IWriteableBitMap<T> map, final T key) {
return new IValueReceiver<Boolean>() {
@Override
public void setValue(Boolean value) {
map.set(key, value);
}
};
}
public static IValueReceiver<Boolean> singleBitReceiver(final IRpcIntBitMap map, final int key) {
return new IValueReceiver<Boolean>() {
@Override
public void setValue(Boolean value) {
map.set(key, value);
}
};
}
public static IWriteableBitMap<ForgeDirection> createRpcAdapter(final IRpcDirectionBitMap map) {
return new IWriteableBitMap<ForgeDirection>() {
@Override
public void toggle(ForgeDirection value) {
map.toggle(value);
}
@Override
public void set(ForgeDirection key, boolean value) {
map.set(key, value);
}
@Override
public void mark(ForgeDirection value) {
map.mark(value);
}
@Override
public void clearAll() {
map.clearAll();
}
@Override
public void clear(ForgeDirection value) {
map.clear(value);
}
};
}
public static IWriteableBitMap<Integer> createRpcAdapter(final IRpcIntBitMap map) {
return new IWriteableBitMap<Integer>() {
@Override
public void toggle(Integer value) {
map.toggle(value);
}
@Override
public void set(Integer key, boolean value) {
map.set(key, value);
}
@Override
public void mark(Integer value) {
map.mark(value);
}
@Override
public void clearAll() {
map.clearAll();
}
@Override
public void clear(Integer value) {
map.clear(value);
}
};
}
}