blob: fc3914602df5c87fa2fe9e6dddfc89c3b79d7de0 [file] [log] [blame]
// Copyright (c) 2019, the R8 project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.utils;
import com.android.tools.r8.utils.StringUtils.BraceType;
import java.util.IdentityHashMap;
import java.util.Map;
import java.util.function.BiFunction;
import java.util.function.Function;
import java.util.function.IntFunction;
import java.util.function.Supplier;
public class MapUtils {
public static <K, V> Map<K, V> clone(
Map<K, V> mapToClone, Map<K, V> newMap, Function<V, V> valueCloner) {
mapToClone.forEach((key, value) -> newMap.put(key, valueCloner.apply(value)));
return newMap;
}
public static <K, V> K firstKey(Map<K, V> map) {
return map.keySet().iterator().next();
}
public static <K, V> V firstValue(Map<K, V> map) {
return map.values().iterator().next();
}
public static <T, R> Function<T, R> ignoreKey(Supplier<R> supplier) {
return ignore -> supplier.get();
}
public static <K, V> Map<K, V> map(
Map<K, V> map,
IntFunction<Map<K, V>> factory,
Function<K, K> keyMapping,
Function<V, V> valueMapping,
BiFunction<V, V, V> valueMerger) {
Map<K, V> result = factory.apply(map.size());
map.forEach(
(key, value) -> {
K newKey = keyMapping.apply(key);
V newValue = valueMapping.apply(value);
V existingValue = result.put(newKey, newValue);
if (existingValue != null) {
result.put(newKey, valueMerger.apply(existingValue, newValue));
}
});
return result;
}
public static <K, V> IdentityHashMap<K, V> newIdentityHashMap(BiForEachable<K, V> forEachable) {
IdentityHashMap<K, V> map = new IdentityHashMap<>();
forEachable.forEach(map::put);
return map;
}
public static <T> void removeIdentityMappings(Map<T, T> map) {
map.entrySet().removeIf(entry -> entry.getKey() == entry.getValue());
}
public static String toString(Map<?, ?> map) {
return StringUtils.join(
",", map.entrySet(), entry -> entry.getKey() + ":" + entry.getValue(), BraceType.TUBORG);
}
}