blob: 35174160e16c2cbf1a1afbd862d0cce92b6cfb58 [file] [log] [blame] [raw]
package protocolsupport.utils;
import java.text.MessageFormat;
import java.util.Arrays;
import java.util.Collection;
import java.util.Comparator;
import java.util.EnumMap;
import java.util.HashMap;
import java.util.Map;
import java.util.function.Function;
import java.util.function.ToIntFunction;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class CollectionsUtils {
public static <K, V extends Enum<V>> Map<K, V> makeEnumMappingMap(Class<V> e, Function<V, K> mapping) {
HashMap<K, V> map = new HashMap<>();
for (V v : e.getEnumConstants()) {
map.put(mapping.apply(v), v);
}
return map;
}
public static <K extends Enum<K>, V extends Enum<V>> EnumMap<K, V> makeEnumMappingEnumMap(Class<V> e, Class<K> k, Function<V, K> mapping) {
EnumMap<K, V> map = new EnumMap<>(k);
for (V v : e.getEnumConstants()) {
map.put(mapping.apply(v), v);
}
return map;
}
public static <V extends Enum<V>> ArrayMap<V> makeEnumMappingArrayMap(Class<V> e, ToIntFunction<V> mapping) {
return new ArrayMap<V>(Arrays.stream(e.getEnumConstants()).map(c -> new ArrayMap.Entry<>(mapping.applyAsInt(c), c)).collect(Collectors.toList()));
}
public static <V extends Enum<V>> ArrayMap<V> makeEnumMappingArrayMap(Stream<V> stream, ToIntFunction<V> mapping) {
return new ArrayMap<V>(stream.map(c -> new ArrayMap.Entry<>(mapping.applyAsInt(c), c)).collect(Collectors.toList()));
}
public static class ArrayMap<T> {
private final int offset;
private final Object[] array;
public ArrayMap(int size) {
this.array = new Object[size];
this.offset = 0;
}
public ArrayMap(Collection<Entry<T>> entries) {
int minKey = entries.stream().min(Comparator.comparingInt(e -> e.key)).get().key;
int maxKey = entries.stream().max(Comparator.comparingInt(e -> e.key)).get().key;
this.offset = -minKey;
this.array = new Object[(maxKey - minKey) + 1];
entries.stream().forEach(entry -> put(entry.key, entry.value));
}
@SafeVarargs
public ArrayMap(Entry<T>... entries) {
this(Arrays.asList(entries));
}
public int getMinKey() {
return -offset;
}
public int getMaxKey() {
return array.length + offset;
}
@SuppressWarnings("unchecked")
public T get(int key) {
return (T) Utils.getFromArrayOrNull(array, key + offset);
}
public void put(int key, T value) {
int aindex = key + offset;
if ((aindex >= array.length) || (aindex < 0)) {
throw new IllegalArgumentException(MessageFormat.format("Cant fit key {0} in size {1} and offset {2}", key, array.length, offset));
}
array[aindex] = value;
}
public void clear() {
Arrays.fill(array, null);
}
public static class Entry<T> {
private final int key;
private final T value;
public Entry(int key, T value) {
this.key = key;
this.value = value;
}
}
}
}