| // Copyright (c) 2015, the Dart 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. |
| |
| library analyzer.src.util.lru_cache; |
| |
| import 'dart:collection'; |
| |
| /** |
| * This handler is notified when an item is evicted from the cache. |
| */ |
| typedef EvictionHandler<K, V>(K key, V value); |
| |
| /** |
| * A hash-table based cache implementation. |
| * |
| * When it reaches the specified number of items, the item that has not been |
| * accessed (both get and put) recently is evicted. |
| */ |
| class LRUMap<K, V> { |
| final LinkedHashMap<K, V> _map = new LinkedHashMap<K, V>(); |
| final int _maxSize; |
| final EvictionHandler _handler; |
| |
| LRUMap(this._maxSize, [this._handler]); |
| |
| /** |
| * Returns the value for the given [key] or null if [key] is not |
| * in the cache. |
| */ |
| V get(K key) { |
| V value = _map.remove(key); |
| if (value != null) { |
| _map[key] = value; |
| } |
| return value; |
| } |
| |
| /** |
| * Associates the [key] with the given [value]. |
| * |
| * If the cache is full, an item that has not been accessed recently is |
| * evicted. |
| */ |
| void put(K key, V value) { |
| _map.remove(key); |
| _map[key] = value; |
| if (_map.length > _maxSize) { |
| K evictedKey = _map.keys.first; |
| V evictedValue = _map.remove(evictedKey); |
| if (_handler != null) { |
| _handler(evictedKey, evictedValue); |
| } |
| } |
| } |
| |
| /** |
| * Removes the association for the given [key]. |
| */ |
| void remove(K key) { |
| _map.remove(key); |
| } |
| } |