Index: mojo/public/dart/third_party/analyzer/lib/src/util/lru_map.dart |
diff --git a/mojo/public/dart/third_party/analyzer/lib/src/util/lru_map.dart b/mojo/public/dart/third_party/analyzer/lib/src/util/lru_map.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..38ef8ff9d051929fe1e802013d939c36380bd834 |
--- /dev/null |
+++ b/mojo/public/dart/third_party/analyzer/lib/src/util/lru_map.dart |
@@ -0,0 +1,63 @@ |
+// 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 engine.utilities.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); |
+ } |
+} |