package com.fasterxml.jackson.datatype.eclipsecollections.deser.map;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JavaType;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.collections.api.block.function.Function;
import org.eclipse.collections.api.map.ImmutableMap;
import org.eclipse.collections.api.map.ImmutableMapIterable;
import org.eclipse.collections.api.map.MapIterable;
import org.eclipse.collections.api.map.MutableMap;
import org.eclipse.collections.api.map.MutableMapIterable;
import org.eclipse.collections.api.map.UnsortedMapIterable;
import org.eclipse.collections.api.map.primitive.ByteBooleanMap;
import org.eclipse.collections.api.map.primitive.ByteByteMap;
import org.eclipse.collections.api.map.primitive.ByteCharMap;
import org.eclipse.collections.api.map.primitive.ByteDoubleMap;
import org.eclipse.collections.api.map.primitive.ByteFloatMap;
import org.eclipse.collections.api.map.primitive.ByteIntMap;
import org.eclipse.collections.api.map.primitive.ByteLongMap;
import org.eclipse.collections.api.map.primitive.ByteObjectMap;
import org.eclipse.collections.api.map.primitive.ByteShortMap;
import org.eclipse.collections.api.map.primitive.CharBooleanMap;
import org.eclipse.collections.api.map.primitive.CharByteMap;
import org.eclipse.collections.api.map.primitive.CharCharMap;
import org.eclipse.collections.api.map.primitive.CharDoubleMap;
import org.eclipse.collections.api.map.primitive.CharFloatMap;
import org.eclipse.collections.api.map.primitive.CharIntMap;
import org.eclipse.collections.api.map.primitive.CharLongMap;
import org.eclipse.collections.api.map.primitive.CharObjectMap;
import org.eclipse.collections.api.map.primitive.CharShortMap;
import org.eclipse.collections.api.map.primitive.DoubleBooleanMap;
import org.eclipse.collections.api.map.primitive.DoubleByteMap;
import org.eclipse.collections.api.map.primitive.DoubleCharMap;
import org.eclipse.collections.api.map.primitive.DoubleDoubleMap;
import org.eclipse.collections.api.map.primitive.DoubleFloatMap;
import org.eclipse.collections.api.map.primitive.DoubleIntMap;
import org.eclipse.collections.api.map.primitive.DoubleLongMap;
import org.eclipse.collections.api.map.primitive.DoubleObjectMap;
import org.eclipse.collections.api.map.primitive.DoubleShortMap;
import org.eclipse.collections.api.map.primitive.FloatBooleanMap;
import org.eclipse.collections.api.map.primitive.FloatByteMap;
import org.eclipse.collections.api.map.primitive.FloatCharMap;
import org.eclipse.collections.api.map.primitive.FloatDoubleMap;
import org.eclipse.collections.api.map.primitive.FloatFloatMap;
import org.eclipse.collections.api.map.primitive.FloatIntMap;
import org.eclipse.collections.api.map.primitive.FloatLongMap;
import org.eclipse.collections.api.map.primitive.FloatObjectMap;
import org.eclipse.collections.api.map.primitive.FloatShortMap;
import org.eclipse.collections.api.map.primitive.ImmutableByteBooleanMap;
import org.eclipse.collections.api.map.primitive.ImmutableByteByteMap;
import org.eclipse.collections.api.map.primitive.ImmutableByteCharMap;
import org.eclipse.collections.api.map.primitive.ImmutableByteDoubleMap;
import org.eclipse.collections.api.map.primitive.ImmutableByteFloatMap;
import org.eclipse.collections.api.map.primitive.ImmutableByteIntMap;
import org.eclipse.collections.api.map.primitive.ImmutableByteLongMap;
import org.eclipse.collections.api.map.primitive.ImmutableByteObjectMap;
import org.eclipse.collections.api.map.primitive.ImmutableByteShortMap;
import org.eclipse.collections.api.map.primitive.ImmutableCharBooleanMap;
import org.eclipse.collections.api.map.primitive.ImmutableCharByteMap;
import org.eclipse.collections.api.map.primitive.ImmutableCharCharMap;
import org.eclipse.collections.api.map.primitive.ImmutableCharDoubleMap;
import org.eclipse.collections.api.map.primitive.ImmutableCharFloatMap;
import org.eclipse.collections.api.map.primitive.ImmutableCharIntMap;
import org.eclipse.collections.api.map.primitive.ImmutableCharLongMap;
import org.eclipse.collections.api.map.primitive.ImmutableCharObjectMap;
import org.eclipse.collections.api.map.primitive.ImmutableCharShortMap;
import org.eclipse.collections.api.map.primitive.ImmutableDoubleBooleanMap;
import org.eclipse.collections.api.map.primitive.ImmutableDoubleByteMap;
import org.eclipse.collections.api.map.primitive.ImmutableDoubleCharMap;
import org.eclipse.collections.api.map.primitive.ImmutableDoubleDoubleMap;
import org.eclipse.collections.api.map.primitive.ImmutableDoubleFloatMap;
import org.eclipse.collections.api.map.primitive.ImmutableDoubleIntMap;
import org.eclipse.collections.api.map.primitive.ImmutableDoubleLongMap;
import org.eclipse.collections.api.map.primitive.ImmutableDoubleObjectMap;
import org.eclipse.collections.api.map.primitive.ImmutableDoubleShortMap;
import org.eclipse.collections.api.map.primitive.ImmutableFloatBooleanMap;
import org.eclipse.collections.api.map.primitive.ImmutableFloatByteMap;
import org.eclipse.collections.api.map.primitive.ImmutableFloatCharMap;
import org.eclipse.collections.api.map.primitive.ImmutableFloatDoubleMap;
import org.eclipse.collections.api.map.primitive.ImmutableFloatFloatMap;
import org.eclipse.collections.api.map.primitive.ImmutableFloatIntMap;
import org.eclipse.collections.api.map.primitive.ImmutableFloatLongMap;
import org.eclipse.collections.api.map.primitive.ImmutableFloatObjectMap;
import org.eclipse.collections.api.map.primitive.ImmutableFloatShortMap;
import org.eclipse.collections.api.map.primitive.ImmutableIntBooleanMap;
import org.eclipse.collections.api.map.primitive.ImmutableIntByteMap;
import org.eclipse.collections.api.map.primitive.ImmutableIntCharMap;
import org.eclipse.collections.api.map.primitive.ImmutableIntDoubleMap;
import org.eclipse.collections.api.map.primitive.ImmutableIntFloatMap;
import org.eclipse.collections.api.map.primitive.ImmutableIntIntMap;
import org.eclipse.collections.api.map.primitive.ImmutableIntLongMap;
import org.eclipse.collections.api.map.primitive.ImmutableIntObjectMap;
import org.eclipse.collections.api.map.primitive.ImmutableIntShortMap;
import org.eclipse.collections.api.map.primitive.ImmutableLongBooleanMap;
import org.eclipse.collections.api.map.primitive.ImmutableLongByteMap;
import org.eclipse.collections.api.map.primitive.ImmutableLongCharMap;
import org.eclipse.collections.api.map.primitive.ImmutableLongDoubleMap;
import org.eclipse.collections.api.map.primitive.ImmutableLongFloatMap;
import org.eclipse.collections.api.map.primitive.ImmutableLongIntMap;
import org.eclipse.collections.api.map.primitive.ImmutableLongLongMap;
import org.eclipse.collections.api.map.primitive.ImmutableLongObjectMap;
import org.eclipse.collections.api.map.primitive.ImmutableLongShortMap;
import org.eclipse.collections.api.map.primitive.ImmutableObjectBooleanMap;
import org.eclipse.collections.api.map.primitive.ImmutableObjectByteMap;
import org.eclipse.collections.api.map.primitive.ImmutableObjectCharMap;
import org.eclipse.collections.api.map.primitive.ImmutableObjectDoubleMap;
import org.eclipse.collections.api.map.primitive.ImmutableObjectFloatMap;
import org.eclipse.collections.api.map.primitive.ImmutableObjectIntMap;
import org.eclipse.collections.api.map.primitive.ImmutableObjectLongMap;
import org.eclipse.collections.api.map.primitive.ImmutableObjectShortMap;
import org.eclipse.collections.api.map.primitive.ImmutableShortBooleanMap;
import org.eclipse.collections.api.map.primitive.ImmutableShortByteMap;
import org.eclipse.collections.api.map.primitive.ImmutableShortCharMap;
import org.eclipse.collections.api.map.primitive.ImmutableShortDoubleMap;
import org.eclipse.collections.api.map.primitive.ImmutableShortFloatMap;
import org.eclipse.collections.api.map.primitive.ImmutableShortIntMap;
import org.eclipse.collections.api.map.primitive.ImmutableShortLongMap;
import org.eclipse.collections.api.map.primitive.ImmutableShortObjectMap;
import org.eclipse.collections.api.map.primitive.ImmutableShortShortMap;
import org.eclipse.collections.api.map.primitive.IntBooleanMap;
import org.eclipse.collections.api.map.primitive.IntByteMap;
import org.eclipse.collections.api.map.primitive.IntCharMap;
import org.eclipse.collections.api.map.primitive.IntDoubleMap;
import org.eclipse.collections.api.map.primitive.IntFloatMap;
import org.eclipse.collections.api.map.primitive.IntIntMap;
import org.eclipse.collections.api.map.primitive.IntLongMap;
import org.eclipse.collections.api.map.primitive.IntObjectMap;
import org.eclipse.collections.api.map.primitive.IntShortMap;
import org.eclipse.collections.api.map.primitive.LongBooleanMap;
import org.eclipse.collections.api.map.primitive.LongByteMap;
import org.eclipse.collections.api.map.primitive.LongCharMap;
import org.eclipse.collections.api.map.primitive.LongDoubleMap;
import org.eclipse.collections.api.map.primitive.LongFloatMap;
import org.eclipse.collections.api.map.primitive.LongIntMap;
import org.eclipse.collections.api.map.primitive.LongLongMap;
import org.eclipse.collections.api.map.primitive.LongObjectMap;
import org.eclipse.collections.api.map.primitive.LongShortMap;
import org.eclipse.collections.api.map.primitive.MutableByteBooleanMap;
import org.eclipse.collections.api.map.primitive.MutableByteByteMap;
import org.eclipse.collections.api.map.primitive.MutableByteCharMap;
import org.eclipse.collections.api.map.primitive.MutableByteDoubleMap;
import org.eclipse.collections.api.map.primitive.MutableByteFloatMap;
import org.eclipse.collections.api.map.primitive.MutableByteIntMap;
import org.eclipse.collections.api.map.primitive.MutableByteLongMap;
import org.eclipse.collections.api.map.primitive.MutableByteObjectMap;
import org.eclipse.collections.api.map.primitive.MutableByteShortMap;
import org.eclipse.collections.api.map.primitive.MutableCharBooleanMap;
import org.eclipse.collections.api.map.primitive.MutableCharByteMap;
import org.eclipse.collections.api.map.primitive.MutableCharCharMap;
import org.eclipse.collections.api.map.primitive.MutableCharDoubleMap;
import org.eclipse.collections.api.map.primitive.MutableCharFloatMap;
import org.eclipse.collections.api.map.primitive.MutableCharIntMap;
import org.eclipse.collections.api.map.primitive.MutableCharLongMap;
import org.eclipse.collections.api.map.primitive.MutableCharObjectMap;
import org.eclipse.collections.api.map.primitive.MutableCharShortMap;
import org.eclipse.collections.api.map.primitive.MutableDoubleBooleanMap;
import org.eclipse.collections.api.map.primitive.MutableDoubleByteMap;
import org.eclipse.collections.api.map.primitive.MutableDoubleCharMap;
import org.eclipse.collections.api.map.primitive.MutableDoubleDoubleMap;
import org.eclipse.collections.api.map.primitive.MutableDoubleFloatMap;
import org.eclipse.collections.api.map.primitive.MutableDoubleIntMap;
import org.eclipse.collections.api.map.primitive.MutableDoubleLongMap;
import org.eclipse.collections.api.map.primitive.MutableDoubleObjectMap;
import org.eclipse.collections.api.map.primitive.MutableDoubleShortMap;
import org.eclipse.collections.api.map.primitive.MutableFloatBooleanMap;
import org.eclipse.collections.api.map.primitive.MutableFloatByteMap;
import org.eclipse.collections.api.map.primitive.MutableFloatCharMap;
import org.eclipse.collections.api.map.primitive.MutableFloatDoubleMap;
import org.eclipse.collections.api.map.primitive.MutableFloatFloatMap;
import org.eclipse.collections.api.map.primitive.MutableFloatIntMap;
import org.eclipse.collections.api.map.primitive.MutableFloatLongMap;
import org.eclipse.collections.api.map.primitive.MutableFloatObjectMap;
import org.eclipse.collections.api.map.primitive.MutableFloatShortMap;
import org.eclipse.collections.api.map.primitive.MutableIntBooleanMap;
import org.eclipse.collections.api.map.primitive.MutableIntByteMap;
import org.eclipse.collections.api.map.primitive.MutableIntCharMap;
import org.eclipse.collections.api.map.primitive.MutableIntDoubleMap;
import org.eclipse.collections.api.map.primitive.MutableIntFloatMap;
import org.eclipse.collections.api.map.primitive.MutableIntIntMap;
import org.eclipse.collections.api.map.primitive.MutableIntLongMap;
import org.eclipse.collections.api.map.primitive.MutableIntObjectMap;
import org.eclipse.collections.api.map.primitive.MutableIntShortMap;
import org.eclipse.collections.api.map.primitive.MutableLongBooleanMap;
import org.eclipse.collections.api.map.primitive.MutableLongByteMap;
import org.eclipse.collections.api.map.primitive.MutableLongCharMap;
import org.eclipse.collections.api.map.primitive.MutableLongDoubleMap;
import org.eclipse.collections.api.map.primitive.MutableLongFloatMap;
import org.eclipse.collections.api.map.primitive.MutableLongIntMap;
import org.eclipse.collections.api.map.primitive.MutableLongLongMap;
import org.eclipse.collections.api.map.primitive.MutableLongObjectMap;
import org.eclipse.collections.api.map.primitive.MutableLongShortMap;
import org.eclipse.collections.api.map.primitive.MutableObjectBooleanMap;
import org.eclipse.collections.api.map.primitive.MutableObjectByteMap;
import org.eclipse.collections.api.map.primitive.MutableObjectCharMap;
import org.eclipse.collections.api.map.primitive.MutableObjectDoubleMap;
import org.eclipse.collections.api.map.primitive.MutableObjectFloatMap;
import org.eclipse.collections.api.map.primitive.MutableObjectIntMap;
import org.eclipse.collections.api.map.primitive.MutableObjectLongMap;
import org.eclipse.collections.api.map.primitive.MutableObjectShortMap;
import org.eclipse.collections.api.map.primitive.MutableShortBooleanMap;
import org.eclipse.collections.api.map.primitive.MutableShortByteMap;
import org.eclipse.collections.api.map.primitive.MutableShortCharMap;
import org.eclipse.collections.api.map.primitive.MutableShortDoubleMap;
import org.eclipse.collections.api.map.primitive.MutableShortFloatMap;
import org.eclipse.collections.api.map.primitive.MutableShortIntMap;
import org.eclipse.collections.api.map.primitive.MutableShortLongMap;
import org.eclipse.collections.api.map.primitive.MutableShortObjectMap;
import org.eclipse.collections.api.map.primitive.MutableShortShortMap;
import org.eclipse.collections.api.map.primitive.ObjectBooleanMap;
import org.eclipse.collections.api.map.primitive.ObjectByteMap;
import org.eclipse.collections.api.map.primitive.ObjectCharMap;
import org.eclipse.collections.api.map.primitive.ObjectDoubleMap;
import org.eclipse.collections.api.map.primitive.ObjectFloatMap;
import org.eclipse.collections.api.map.primitive.ObjectIntMap;
import org.eclipse.collections.api.map.primitive.ObjectLongMap;
import org.eclipse.collections.api.map.primitive.ObjectShortMap;
import org.eclipse.collections.api.map.primitive.PrimitiveObjectMap;
import org.eclipse.collections.api.map.primitive.ShortBooleanMap;
import org.eclipse.collections.api.map.primitive.ShortByteMap;
import org.eclipse.collections.api.map.primitive.ShortCharMap;
import org.eclipse.collections.api.map.primitive.ShortDoubleMap;
import org.eclipse.collections.api.map.primitive.ShortFloatMap;
import org.eclipse.collections.api.map.primitive.ShortIntMap;
import org.eclipse.collections.api.map.primitive.ShortLongMap;
import org.eclipse.collections.api.map.primitive.ShortObjectMap;
import org.eclipse.collections.api.map.primitive.ShortShortMap;
public final class EclipseMapDeserializers {
private static final Map<Class<?>, Entry<?, ?, ?, ?>> ENTRIES = new HashMap<>();
private EclipseMapDeserializers() {
}
public static EclipseMapDeserializer<?, ?, ?, ?> createDeserializer(JavaType type) {
Class<?> rawClass = type.getRawClass();
Entry<?, ?, ?, ?> entry = ENTRIES.get(rawClass);
if (entry == null) { return null; }
return entry.createDeserializer(type);
}
private static <T, K extends KeyHandler<K>, V extends ValueHandler<V>> void add(
Class<T> type,
TypeHandlerPair<? extends T, K, V> handlerPair
) {
ENTRIES.put(type, new Entry<>(handlerPair, null));
}
private static <T, I> void add(
Class<T> type,
TypeHandlerPair<I, ?, ?> handlerPair,
Function<I, T> finish
) {
ENTRIES.put(type, new Entry<>(handlerPair, finish));
}
private static final class Entry<T, I, K extends KeyHandler<K>, V extends ValueHandler<V>> {
final TypeHandlerPair<I, K, V> typeHandlerPair;
final Function<I, T> finish;
Entry(TypeHandlerPair<I, K, V> typeHandlerPair, Function<I, T> finish) {
this.typeHandlerPair = typeHandlerPair;
this.finish = finish;
}
EclipseMapDeserializer<T, I, K, V> createDeserializer(JavaType type) {
Class<?> rawClass = type.getRawClass();
List<JavaType> typeParameters = type.getBindings().getTypeParameters();
boolean refValue = PrimitiveObjectMap.class.isAssignableFrom(rawClass) ||
MapIterable.class.isAssignableFrom(rawClass);
boolean refKey = refValue ? (typeParameters.size() == 2) : (typeParameters.size() == 1);
K keyHandler = typeHandlerPair.keyHandler(refKey ? typeParameters.get(0) : null);
V valueHandler = typeHandlerPair.valueHandler(refValue ? typeParameters.get(typeParameters.size() - 1) : null);
return new DeserializerImpl(keyHandler, valueHandler);
}
class DeserializerImpl extends EclipseMapDeserializer<T, I, K, V> {
DeserializerImpl(K keyHandler, V valueHandler) {
super(keyHandler, valueHandler);
}
@Override
protected EclipseMapDeserializer<T, ?, ?, ?> withResolved(K keyHandler, V valueHandler) {
return new DeserializerImpl(keyHandler, valueHandler);
}
@Override
protected I createIntermediate() {
return typeHandlerPair.createEmpty();
}
@Override
protected void deserializeEntry(
I target,
K keyHandler,
V valueHandler,
DeserializationContext ctx,
String key,
JsonParser valueParser
) throws IOException {
typeHandlerPair.add(target, keyHandler, valueHandler, ctx, key, valueParser);
}
@Override
protected T finish(I intermediate) {
return finish == null ? (T) intermediate : finish.apply(intermediate);
}
}
}
static {
add(MutableMap.class, TypeHandlerPair.OBJECT_OBJECT);
add(MutableMapIterable.class, TypeHandlerPair.OBJECT_OBJECT);
add(MapIterable.class, TypeHandlerPair.OBJECT_OBJECT);
add(UnsortedMapIterable.class, TypeHandlerPair.OBJECT_OBJECT);
add(ImmutableMap.class, TypeHandlerPair.OBJECT_OBJECT, MutableMap::toImmutable);
add(ImmutableMapIterable.class, TypeHandlerPair.OBJECT_OBJECT, MutableMap::toImmutable);
add(ObjectBooleanMap.class, TypeHandlerPair.OBJECT_BOOLEAN);
add(MutableObjectBooleanMap.class, TypeHandlerPair.OBJECT_BOOLEAN);
add(ImmutableObjectBooleanMap.class, TypeHandlerPair.OBJECT_BOOLEAN, ObjectBooleanMap::toImmutable);
add(ObjectByteMap.class, TypeHandlerPair.OBJECT_BYTE);
add(MutableObjectByteMap.class, TypeHandlerPair.OBJECT_BYTE);
add(ImmutableObjectByteMap.class, TypeHandlerPair.OBJECT_BYTE, ObjectByteMap::toImmutable);
add(ObjectShortMap.class, TypeHandlerPair.OBJECT_SHORT);
add(MutableObjectShortMap.class, TypeHandlerPair.OBJECT_SHORT);
add(ImmutableObjectShortMap.class, TypeHandlerPair.OBJECT_SHORT, ObjectShortMap::toImmutable);
add(ObjectCharMap.class, TypeHandlerPair.OBJECT_CHAR);
add(MutableObjectCharMap.class, TypeHandlerPair.OBJECT_CHAR);
add(ImmutableObjectCharMap.class, TypeHandlerPair.OBJECT_CHAR, ObjectCharMap::toImmutable);
add(ObjectIntMap.class, TypeHandlerPair.OBJECT_INT);
add(MutableObjectIntMap.class, TypeHandlerPair.OBJECT_INT);
add(ImmutableObjectIntMap.class, TypeHandlerPair.OBJECT_INT, ObjectIntMap::toImmutable);
add(ObjectFloatMap.class, TypeHandlerPair.OBJECT_FLOAT);
add(MutableObjectFloatMap.class, TypeHandlerPair.OBJECT_FLOAT);
add(ImmutableObjectFloatMap.class, TypeHandlerPair.OBJECT_FLOAT, ObjectFloatMap::toImmutable);
add(ObjectLongMap.class, TypeHandlerPair.OBJECT_LONG);
add(MutableObjectLongMap.class, TypeHandlerPair.OBJECT_LONG);
add(ImmutableObjectLongMap.class, TypeHandlerPair.OBJECT_LONG, ObjectLongMap::toImmutable);
add(ObjectDoubleMap.class, TypeHandlerPair.OBJECT_DOUBLE);
add(MutableObjectDoubleMap.class, TypeHandlerPair.OBJECT_DOUBLE);
add(ImmutableObjectDoubleMap.class, TypeHandlerPair.OBJECT_DOUBLE, ObjectDoubleMap::toImmutable);
add(ByteObjectMap.class, TypeHandlerPair.BYTE_OBJECT);
add(MutableByteObjectMap.class, TypeHandlerPair.BYTE_OBJECT);
add(ImmutableByteObjectMap.class, TypeHandlerPair.BYTE_OBJECT, ByteObjectMap::toImmutable);
add(ShortObjectMap.class, TypeHandlerPair.SHORT_OBJECT);
add(MutableShortObjectMap.class, TypeHandlerPair.SHORT_OBJECT);
add(ImmutableShortObjectMap.class, TypeHandlerPair.SHORT_OBJECT, ShortObjectMap::toImmutable);
add(CharObjectMap.class, TypeHandlerPair.CHAR_OBJECT);
add(MutableCharObjectMap.class, TypeHandlerPair.CHAR_OBJECT);
add(ImmutableCharObjectMap.class, TypeHandlerPair.CHAR_OBJECT, CharObjectMap::toImmutable);
add(IntObjectMap.class, TypeHandlerPair.INT_OBJECT);
add(MutableIntObjectMap.class, TypeHandlerPair.INT_OBJECT);
add(ImmutableIntObjectMap.class, TypeHandlerPair.INT_OBJECT, IntObjectMap::toImmutable);
add(FloatObjectMap.class, TypeHandlerPair.FLOAT_OBJECT);
add(MutableFloatObjectMap.class, TypeHandlerPair.FLOAT_OBJECT);
add(ImmutableFloatObjectMap.class, TypeHandlerPair.FLOAT_OBJECT, FloatObjectMap::toImmutable);
add(LongObjectMap.class, TypeHandlerPair.LONG_OBJECT);
add(MutableLongObjectMap.class, TypeHandlerPair.LONG_OBJECT);
add(ImmutableLongObjectMap.class, TypeHandlerPair.LONG_OBJECT, LongObjectMap::toImmutable);
add(DoubleObjectMap.class, TypeHandlerPair.DOUBLE_OBJECT);
add(MutableDoubleObjectMap.class, TypeHandlerPair.DOUBLE_OBJECT);
add(ImmutableDoubleObjectMap.class, TypeHandlerPair.DOUBLE_OBJECT, DoubleObjectMap::toImmutable);
add(ByteBooleanMap.class, TypeHandlerPair.BYTE_BOOLEAN);
add(MutableByteBooleanMap.class, TypeHandlerPair.BYTE_BOOLEAN);
add(ImmutableByteBooleanMap.class, TypeHandlerPair.BYTE_BOOLEAN, ByteBooleanMap::toImmutable);
add(ByteByteMap.class, TypeHandlerPair.BYTE_BYTE);
add(MutableByteByteMap.class, TypeHandlerPair.BYTE_BYTE);
add(ImmutableByteByteMap.class, TypeHandlerPair.BYTE_BYTE, ByteByteMap::toImmutable);
add(ByteShortMap.class, TypeHandlerPair.BYTE_SHORT);
add(MutableByteShortMap.class, TypeHandlerPair.BYTE_SHORT);
add(ImmutableByteShortMap.class, TypeHandlerPair.BYTE_SHORT, ByteShortMap::toImmutable);
add(ByteCharMap.class, TypeHandlerPair.BYTE_CHAR);
add(MutableByteCharMap.class, TypeHandlerPair.BYTE_CHAR);
add(ImmutableByteCharMap.class, TypeHandlerPair.BYTE_CHAR, ByteCharMap::toImmutable);
add(ByteIntMap.class, TypeHandlerPair.BYTE_INT);
add(MutableByteIntMap.class, TypeHandlerPair.BYTE_INT);
add(ImmutableByteIntMap.class, TypeHandlerPair.BYTE_INT, ByteIntMap::toImmutable);
add(ByteFloatMap.class, TypeHandlerPair.BYTE_FLOAT);
add(MutableByteFloatMap.class, TypeHandlerPair.BYTE_FLOAT);
add(ImmutableByteFloatMap.class, TypeHandlerPair.BYTE_FLOAT, ByteFloatMap::toImmutable);
add(ByteLongMap.class, TypeHandlerPair.BYTE_LONG);
add(MutableByteLongMap.class, TypeHandlerPair.BYTE_LONG);
add(ImmutableByteLongMap.class, TypeHandlerPair.BYTE_LONG, ByteLongMap::toImmutable);
add(ByteDoubleMap.class, TypeHandlerPair.BYTE_DOUBLE);
add(MutableByteDoubleMap.class, TypeHandlerPair.BYTE_DOUBLE);
add(ImmutableByteDoubleMap.class, TypeHandlerPair.BYTE_DOUBLE, ByteDoubleMap::toImmutable);
add(ShortBooleanMap.class, TypeHandlerPair.SHORT_BOOLEAN);
add(MutableShortBooleanMap.class, TypeHandlerPair.SHORT_BOOLEAN);
add(ImmutableShortBooleanMap.class, TypeHandlerPair.SHORT_BOOLEAN, ShortBooleanMap::toImmutable);
add(ShortByteMap.class, TypeHandlerPair.SHORT_BYTE);
add(MutableShortByteMap.class, TypeHandlerPair.SHORT_BYTE);
add(ImmutableShortByteMap.class, TypeHandlerPair.SHORT_BYTE, ShortByteMap::toImmutable);
add(ShortShortMap.class, TypeHandlerPair.SHORT_SHORT);
add(MutableShortShortMap.class, TypeHandlerPair.SHORT_SHORT);
add(ImmutableShortShortMap.class, TypeHandlerPair.SHORT_SHORT, ShortShortMap::toImmutable);
add(ShortCharMap.class, TypeHandlerPair.SHORT_CHAR);
add(MutableShortCharMap.class, TypeHandlerPair.SHORT_CHAR);
add(ImmutableShortCharMap.class, TypeHandlerPair.SHORT_CHAR, ShortCharMap::toImmutable);
add(ShortIntMap.class, TypeHandlerPair.SHORT_INT);
add(MutableShortIntMap.class, TypeHandlerPair.SHORT_INT);
add(ImmutableShortIntMap.class, TypeHandlerPair.SHORT_INT, ShortIntMap::toImmutable);
add(ShortFloatMap.class, TypeHandlerPair.SHORT_FLOAT);
add(MutableShortFloatMap.class, TypeHandlerPair.SHORT_FLOAT);
add(ImmutableShortFloatMap.class, TypeHandlerPair.SHORT_FLOAT, ShortFloatMap::toImmutable);
add(ShortLongMap.class, TypeHandlerPair.SHORT_LONG);
add(MutableShortLongMap.class, TypeHandlerPair.SHORT_LONG);
add(ImmutableShortLongMap.class, TypeHandlerPair.SHORT_LONG, ShortLongMap::toImmutable);
add(ShortDoubleMap.class, TypeHandlerPair.SHORT_DOUBLE);
add(MutableShortDoubleMap.class, TypeHandlerPair.SHORT_DOUBLE);
add(ImmutableShortDoubleMap.class, TypeHandlerPair.SHORT_DOUBLE, ShortDoubleMap::toImmutable);
add(CharBooleanMap.class, TypeHandlerPair.CHAR_BOOLEAN);
add(MutableCharBooleanMap.class, TypeHandlerPair.CHAR_BOOLEAN);
add(ImmutableCharBooleanMap.class, TypeHandlerPair.CHAR_BOOLEAN, CharBooleanMap::toImmutable);
add(CharByteMap.class, TypeHandlerPair.CHAR_BYTE);
add(MutableCharByteMap.class, TypeHandlerPair.CHAR_BYTE);
add(ImmutableCharByteMap.class, TypeHandlerPair.CHAR_BYTE, CharByteMap::toImmutable);
add(CharShortMap.class, TypeHandlerPair.CHAR_SHORT);
add(MutableCharShortMap.class, TypeHandlerPair.CHAR_SHORT);
add(ImmutableCharShortMap.class, TypeHandlerPair.CHAR_SHORT, CharShortMap::toImmutable);
add(CharCharMap.class, TypeHandlerPair.CHAR_CHAR);
add(MutableCharCharMap.class, TypeHandlerPair.CHAR_CHAR);
add(ImmutableCharCharMap.class, TypeHandlerPair.CHAR_CHAR, CharCharMap::toImmutable);
add(CharIntMap.class, TypeHandlerPair.CHAR_INT);
add(MutableCharIntMap.class, TypeHandlerPair.CHAR_INT);
add(ImmutableCharIntMap.class, TypeHandlerPair.CHAR_INT, CharIntMap::toImmutable);
add(CharFloatMap.class, TypeHandlerPair.CHAR_FLOAT);
add(MutableCharFloatMap.class, TypeHandlerPair.CHAR_FLOAT);
add(ImmutableCharFloatMap.class, TypeHandlerPair.CHAR_FLOAT, CharFloatMap::toImmutable);
add(CharLongMap.class, TypeHandlerPair.CHAR_LONG);
add(MutableCharLongMap.class, TypeHandlerPair.CHAR_LONG);
add(ImmutableCharLongMap.class, TypeHandlerPair.CHAR_LONG, CharLongMap::toImmutable);
add(CharDoubleMap.class, TypeHandlerPair.CHAR_DOUBLE);
add(MutableCharDoubleMap.class, TypeHandlerPair.CHAR_DOUBLE);
add(ImmutableCharDoubleMap.class, TypeHandlerPair.CHAR_DOUBLE, CharDoubleMap::toImmutable);
add(IntBooleanMap.class, TypeHandlerPair.INT_BOOLEAN);
add(MutableIntBooleanMap.class, TypeHandlerPair.INT_BOOLEAN);
add(ImmutableIntBooleanMap.class, TypeHandlerPair.INT_BOOLEAN, IntBooleanMap::toImmutable);
add(IntByteMap.class, TypeHandlerPair.INT_BYTE);
add(MutableIntByteMap.class, TypeHandlerPair.INT_BYTE);
add(ImmutableIntByteMap.class, TypeHandlerPair.INT_BYTE, IntByteMap::toImmutable);
add(IntShortMap.class, TypeHandlerPair.INT_SHORT);
add(MutableIntShortMap.class, TypeHandlerPair.INT_SHORT);
add(ImmutableIntShortMap.class, TypeHandlerPair.INT_SHORT, IntShortMap::toImmutable);
add(IntCharMap.class, TypeHandlerPair.INT_CHAR);
add(MutableIntCharMap.class, TypeHandlerPair.INT_CHAR);
add(ImmutableIntCharMap.class, TypeHandlerPair.INT_CHAR, IntCharMap::toImmutable);
add(IntIntMap.class, TypeHandlerPair.INT_INT);
add(MutableIntIntMap.class, TypeHandlerPair.INT_INT);
add(ImmutableIntIntMap.class, TypeHandlerPair.INT_INT, IntIntMap::toImmutable);
add(IntFloatMap.class, TypeHandlerPair.INT_FLOAT);
add(MutableIntFloatMap.class, TypeHandlerPair.INT_FLOAT);
add(ImmutableIntFloatMap.class, TypeHandlerPair.INT_FLOAT, IntFloatMap::toImmutable);
add(IntLongMap.class, TypeHandlerPair.INT_LONG);
add(MutableIntLongMap.class, TypeHandlerPair.INT_LONG);
add(ImmutableIntLongMap.class, TypeHandlerPair.INT_LONG, IntLongMap::toImmutable);
add(IntDoubleMap.class, TypeHandlerPair.INT_DOUBLE);
add(MutableIntDoubleMap.class, TypeHandlerPair.INT_DOUBLE);
add(ImmutableIntDoubleMap.class, TypeHandlerPair.INT_DOUBLE, IntDoubleMap::toImmutable);
add(FloatBooleanMap.class, TypeHandlerPair.FLOAT_BOOLEAN);
add(MutableFloatBooleanMap.class, TypeHandlerPair.FLOAT_BOOLEAN);
add(ImmutableFloatBooleanMap.class, TypeHandlerPair.FLOAT_BOOLEAN, FloatBooleanMap::toImmutable);
add(FloatByteMap.class, TypeHandlerPair.FLOAT_BYTE);
add(MutableFloatByteMap.class, TypeHandlerPair.FLOAT_BYTE);
add(ImmutableFloatByteMap.class, TypeHandlerPair.FLOAT_BYTE, FloatByteMap::toImmutable);
add(FloatShortMap.class, TypeHandlerPair.FLOAT_SHORT);
add(MutableFloatShortMap.class, TypeHandlerPair.FLOAT_SHORT);
add(ImmutableFloatShortMap.class, TypeHandlerPair.FLOAT_SHORT, FloatShortMap::toImmutable);
add(FloatCharMap.class, TypeHandlerPair.FLOAT_CHAR);
add(MutableFloatCharMap.class, TypeHandlerPair.FLOAT_CHAR);
add(ImmutableFloatCharMap.class, TypeHandlerPair.FLOAT_CHAR, FloatCharMap::toImmutable);
add(FloatIntMap.class, TypeHandlerPair.FLOAT_INT);
add(MutableFloatIntMap.class, TypeHandlerPair.FLOAT_INT);
add(ImmutableFloatIntMap.class, TypeHandlerPair.FLOAT_INT, FloatIntMap::toImmutable);
add(FloatFloatMap.class, TypeHandlerPair.FLOAT_FLOAT);
add(MutableFloatFloatMap.class, TypeHandlerPair.FLOAT_FLOAT);
add(ImmutableFloatFloatMap.class, TypeHandlerPair.FLOAT_FLOAT, FloatFloatMap::toImmutable);
add(FloatLongMap.class, TypeHandlerPair.FLOAT_LONG);
add(MutableFloatLongMap.class, TypeHandlerPair.FLOAT_LONG);
add(ImmutableFloatLongMap.class, TypeHandlerPair.FLOAT_LONG, FloatLongMap::toImmutable);
add(FloatDoubleMap.class, TypeHandlerPair.FLOAT_DOUBLE);
add(MutableFloatDoubleMap.class, TypeHandlerPair.FLOAT_DOUBLE);
add(ImmutableFloatDoubleMap.class, TypeHandlerPair.FLOAT_DOUBLE, FloatDoubleMap::toImmutable);
add(LongBooleanMap.class, TypeHandlerPair.LONG_BOOLEAN);
add(MutableLongBooleanMap.class, TypeHandlerPair.LONG_BOOLEAN);
add(ImmutableLongBooleanMap.class, TypeHandlerPair.LONG_BOOLEAN, LongBooleanMap::toImmutable);
add(LongByteMap.class, TypeHandlerPair.LONG_BYTE);
add(MutableLongByteMap.class, TypeHandlerPair.LONG_BYTE);
add(ImmutableLongByteMap.class, TypeHandlerPair.LONG_BYTE, LongByteMap::toImmutable);
add(LongShortMap.class, TypeHandlerPair.LONG_SHORT);
add(MutableLongShortMap.class, TypeHandlerPair.LONG_SHORT);
add(ImmutableLongShortMap.class, TypeHandlerPair.LONG_SHORT, LongShortMap::toImmutable);
add(LongCharMap.class, TypeHandlerPair.LONG_CHAR);
add(MutableLongCharMap.class, TypeHandlerPair.LONG_CHAR);
add(ImmutableLongCharMap.class, TypeHandlerPair.LONG_CHAR, LongCharMap::toImmutable);
add(LongIntMap.class, TypeHandlerPair.LONG_INT);
add(MutableLongIntMap.class, TypeHandlerPair.LONG_INT);
add(ImmutableLongIntMap.class, TypeHandlerPair.LONG_INT, LongIntMap::toImmutable);
add(LongFloatMap.class, TypeHandlerPair.LONG_FLOAT);
add(MutableLongFloatMap.class, TypeHandlerPair.LONG_FLOAT);
add(ImmutableLongFloatMap.class, TypeHandlerPair.LONG_FLOAT, LongFloatMap::toImmutable);
add(LongLongMap.class, TypeHandlerPair.LONG_LONG);
add(MutableLongLongMap.class, TypeHandlerPair.LONG_LONG);
add(ImmutableLongLongMap.class, TypeHandlerPair.LONG_LONG, LongLongMap::toImmutable);
add(LongDoubleMap.class, TypeHandlerPair.LONG_DOUBLE);
add(MutableLongDoubleMap.class, TypeHandlerPair.LONG_DOUBLE);
add(ImmutableLongDoubleMap.class, TypeHandlerPair.LONG_DOUBLE, LongDoubleMap::toImmutable);
add(DoubleBooleanMap.class, TypeHandlerPair.DOUBLE_BOOLEAN);
add(MutableDoubleBooleanMap.class, TypeHandlerPair.DOUBLE_BOOLEAN);
add(ImmutableDoubleBooleanMap.class, TypeHandlerPair.DOUBLE_BOOLEAN, DoubleBooleanMap::toImmutable);
add(DoubleByteMap.class, TypeHandlerPair.DOUBLE_BYTE);
add(MutableDoubleByteMap.class, TypeHandlerPair.DOUBLE_BYTE);
add(ImmutableDoubleByteMap.class, TypeHandlerPair.DOUBLE_BYTE, DoubleByteMap::toImmutable);
add(DoubleShortMap.class, TypeHandlerPair.DOUBLE_SHORT);
add(MutableDoubleShortMap.class, TypeHandlerPair.DOUBLE_SHORT);
add(ImmutableDoubleShortMap.class, TypeHandlerPair.DOUBLE_SHORT, DoubleShortMap::toImmutable);
add(DoubleCharMap.class, TypeHandlerPair.DOUBLE_CHAR);
add(MutableDoubleCharMap.class, TypeHandlerPair.DOUBLE_CHAR);
add(ImmutableDoubleCharMap.class, TypeHandlerPair.DOUBLE_CHAR, DoubleCharMap::toImmutable);
add(DoubleIntMap.class, TypeHandlerPair.DOUBLE_INT);
add(MutableDoubleIntMap.class, TypeHandlerPair.DOUBLE_INT);
add(ImmutableDoubleIntMap.class, TypeHandlerPair.DOUBLE_INT, DoubleIntMap::toImmutable);
add(DoubleFloatMap.class, TypeHandlerPair.DOUBLE_FLOAT);
add(MutableDoubleFloatMap.class, TypeHandlerPair.DOUBLE_FLOAT);
add(ImmutableDoubleFloatMap.class, TypeHandlerPair.DOUBLE_FLOAT, DoubleFloatMap::toImmutable);
add(DoubleLongMap.class, TypeHandlerPair.DOUBLE_LONG);
add(MutableDoubleLongMap.class, TypeHandlerPair.DOUBLE_LONG);
add(ImmutableDoubleLongMap.class, TypeHandlerPair.DOUBLE_LONG, DoubleLongMap::toImmutable);
add(DoubleDoubleMap.class, TypeHandlerPair.DOUBLE_DOUBLE);
add(MutableDoubleDoubleMap.class, TypeHandlerPair.DOUBLE_DOUBLE);
add(ImmutableDoubleDoubleMap.class, TypeHandlerPair.DOUBLE_DOUBLE, DoubleDoubleMap::toImmutable);
}
}