rm LRUCache
Summary: Appears to be unused. Reviewed By: danielbuechele Differential Revision: D16710463 fbshipit-source-id: 00ba195689ffc96700ae623fd02fb806b9730272
This commit is contained in:
committed by
Facebook Github Bot
parent
7bb241bf63
commit
fd9b83eac3
@@ -1,172 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright 2018-present Facebook.
|
|
||||||
* This source code is licensed under the MIT license found in the
|
|
||||||
* LICENSE file in the root directory of this source tree.
|
|
||||||
* @format
|
|
||||||
*/
|
|
||||||
|
|
||||||
class ListElement<K, V> {
|
|
||||||
constructor(cache: LRUCache<K, V>, key: K, value: V) {
|
|
||||||
this.cache = cache;
|
|
||||||
this.before = undefined;
|
|
||||||
this.next = undefined;
|
|
||||||
this.set(key, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
creationTime: number;
|
|
||||||
cache: LRUCache<K, V>;
|
|
||||||
before: ?ListElement<K, V>;
|
|
||||||
next: ?ListElement<K, V>;
|
|
||||||
key: K;
|
|
||||||
value: V;
|
|
||||||
|
|
||||||
set(key: K, value: V) {
|
|
||||||
this.key = key;
|
|
||||||
this.value = value;
|
|
||||||
this.creationTime = Date.now();
|
|
||||||
}
|
|
||||||
|
|
||||||
hit() {
|
|
||||||
this.detach();
|
|
||||||
this.attach();
|
|
||||||
}
|
|
||||||
|
|
||||||
attach() {
|
|
||||||
this.before = undefined;
|
|
||||||
this.next = this.cache.head;
|
|
||||||
this.cache.head = this;
|
|
||||||
|
|
||||||
const {next} = this;
|
|
||||||
if (next) {
|
|
||||||
next.before = this;
|
|
||||||
} else {
|
|
||||||
this.cache.tail = this;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.cache.size++;
|
|
||||||
}
|
|
||||||
|
|
||||||
detach() {
|
|
||||||
const {before, next} = this;
|
|
||||||
|
|
||||||
if (before) {
|
|
||||||
before.next = next;
|
|
||||||
} else {
|
|
||||||
this.cache.head = next;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (next) {
|
|
||||||
next.before = before;
|
|
||||||
} else {
|
|
||||||
this.cache.tail = before;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.cache.size--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
type LRUCacheOptions = {|
|
|
||||||
maxSize: number,
|
|
||||||
maxAge?: number,
|
|
||||||
|};
|
|
||||||
|
|
||||||
export default class LRUCache<K, V> {
|
|
||||||
constructor(options: LRUCacheOptions) {
|
|
||||||
this.maxSize = options.maxSize;
|
|
||||||
this.maxAge = options.maxAge;
|
|
||||||
this.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
maxSize: number;
|
|
||||||
maxAge: ?number;
|
|
||||||
size: number;
|
|
||||||
data: Map<K, ListElement<K, V>>;
|
|
||||||
tail: ?ListElement<K, V>;
|
|
||||||
head: ?ListElement<K, V>;
|
|
||||||
|
|
||||||
clear() {
|
|
||||||
this.size = 0;
|
|
||||||
this.data = new Map();
|
|
||||||
this.tail = undefined;
|
|
||||||
this.head = undefined;
|
|
||||||
}
|
|
||||||
|
|
||||||
has(key: K): boolean {
|
|
||||||
return this.data.has(key);
|
|
||||||
}
|
|
||||||
|
|
||||||
get(key: K, hit?: boolean = true): ?V {
|
|
||||||
const cacheVal = this.data.get(key);
|
|
||||||
if (!cacheVal) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const {maxAge} = this;
|
|
||||||
if (maxAge != null) {
|
|
||||||
const timeNow = Date.now();
|
|
||||||
const timeSinceCreation = timeNow - cacheVal.creationTime;
|
|
||||||
if (timeSinceCreation > maxAge) {
|
|
||||||
this.delete(key);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (hit) {
|
|
||||||
cacheVal.hit();
|
|
||||||
}
|
|
||||||
|
|
||||||
return cacheVal.value;
|
|
||||||
}
|
|
||||||
|
|
||||||
pop(): ?ListElement<K, V> {
|
|
||||||
const {tail} = this;
|
|
||||||
if (!tail) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.delete(tail.key);
|
|
||||||
|
|
||||||
tail.next = undefined;
|
|
||||||
tail.before = undefined;
|
|
||||||
|
|
||||||
return tail;
|
|
||||||
}
|
|
||||||
|
|
||||||
set(key: K, val: V, hit?: boolean = true) {
|
|
||||||
const actual = this.data.get(key);
|
|
||||||
|
|
||||||
if (actual) {
|
|
||||||
actual.value = val;
|
|
||||||
if (hit) {
|
|
||||||
actual.hit();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
let cacheVal: ?ListElement<K, V>;
|
|
||||||
|
|
||||||
if (this.size >= this.maxSize) {
|
|
||||||
cacheVal = this.pop();
|
|
||||||
|
|
||||||
if (cacheVal) {
|
|
||||||
cacheVal.set(key, val);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!cacheVal) {
|
|
||||||
cacheVal = new ListElement(this, key, val);
|
|
||||||
}
|
|
||||||
|
|
||||||
this.data.set(key, cacheVal);
|
|
||||||
cacheVal.attach();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
delete(key: K) {
|
|
||||||
const val = this.data.get(key);
|
|
||||||
if (!val) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
val.detach();
|
|
||||||
this.data.delete(key);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user