| // Copyright (c) 2018, 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.google.common.collect.ImmutableMap; | |
| import java.util.LinkedHashMap; | |
| import java.util.Map; | |
| public class LRUCacheTable<R, C, V> extends LinkedHashMap<R, Map<C, V>> { | |
| private static final float LOAD_FACTOR = 0.75f; | |
| static class LRUCacheRow<C, V> extends LinkedHashMap<C, V> { | |
| private final int columnCapacity; | |
| public LRUCacheRow(int columnCapacity, float loadFactor) { | |
| super(columnCapacity, loadFactor); | |
| this.columnCapacity = columnCapacity; | |
| } | |
| @Override | |
| protected boolean removeEldestEntry(Map.Entry<C, V> eldest){ | |
| return size() > this.columnCapacity; | |
| } | |
| } | |
| private final int rowCapacity; | |
| private final int columnCapacity; | |
| private LRUCacheTable(int rowCapacity, int columnCapacity, float loadFactor) { | |
| super(rowCapacity, loadFactor); | |
| this.rowCapacity = rowCapacity; | |
| this.columnCapacity = columnCapacity; | |
| } | |
| public static <R, C, V> LRUCacheTable<R, C, V> create(int rowCapacity, int columnCapacity) { | |
| return new LRUCacheTable<>(rowCapacity, columnCapacity, LOAD_FACTOR); | |
| } | |
| @Override | |
| protected boolean removeEldestEntry(Map.Entry<R, Map<C, V>> eldest){ | |
| return size() > this.rowCapacity; | |
| } | |
| public V put(R rowKey, C columnKey, V value) { | |
| Map<C, V> row = computeIfAbsent(rowKey, k -> new LRUCacheRow<>(columnCapacity, LOAD_FACTOR)); | |
| return row.putIfAbsent(columnKey, value); | |
| } | |
| public boolean contains(R rowKey, C columnKey) { | |
| return getOrDefault(rowKey, ImmutableMap.of()).containsKey(columnKey); | |
| } | |
| public V get(R rowKey, C columnKey) { | |
| return getOrDefault(rowKey, ImmutableMap.of()).get(columnKey); | |
| } | |
| public V getOrDefault(R rowKey, C columnKey, V defaultValue) { | |
| return getOrDefault(rowKey, ImmutableMap.of()).getOrDefault(columnKey, defaultValue); | |
| } | |
| } |