| // Copyright (c) 2020, 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.collections; |
| |
| import com.android.tools.r8.graph.ProgramMember; |
| import com.google.common.base.Equivalence.Wrapper; |
| import java.util.Map; |
| import java.util.function.BiConsumer; |
| import java.util.function.BiFunction; |
| import java.util.function.BiPredicate; |
| import java.util.function.Function; |
| import java.util.function.Supplier; |
| |
| public abstract class ProgramMemberMap<K extends ProgramMember<?, ?>, V> { |
| |
| private final Map<Wrapper<K>, V> backing; |
| |
| ProgramMemberMap(Supplier<Map<Wrapper<K>, V>> backingFactory) { |
| backing = backingFactory.get(); |
| } |
| |
| public void clear() { |
| backing.clear(); |
| } |
| |
| public V compute(K member, BiFunction<K, V, V> fn) { |
| return backing.compute(wrap(member), (key, value) -> fn.apply(member, value)); |
| } |
| |
| public V computeIfAbsent(K member, Function<K, V> fn) { |
| return backing.computeIfAbsent(wrap(member), key -> fn.apply(key.get())); |
| } |
| |
| public void forEach(BiConsumer<K, V> consumer) { |
| backing.forEach((wrapper, value) -> consumer.accept(wrapper.get(), value)); |
| } |
| |
| public V get(K member) { |
| return backing.get(wrap(member)); |
| } |
| |
| public V getOrDefault(K member, V defaultValue) { |
| return backing.getOrDefault(wrap(member), defaultValue); |
| } |
| |
| public boolean isEmpty() { |
| return backing.isEmpty(); |
| } |
| |
| public V put(K member, V value) { |
| Wrapper<K> wrapper = wrap(member); |
| return backing.put(wrapper, value); |
| } |
| |
| public V remove(K member) { |
| return backing.remove(wrap(member)); |
| } |
| |
| public void removeIf(BiPredicate<K, V> predicate) { |
| backing.entrySet().removeIf(entry -> predicate.test(entry.getKey().get(), entry.getValue())); |
| } |
| |
| abstract Wrapper<K> wrap(K member); |
| } |