更新
This commit is contained in:
+63
@@ -0,0 +1,63 @@
|
||||
var LinkedList = require('./LinkedList');
|
||||
var PseudoMap = require('./PseudoMap');
|
||||
var Class = require('./Class');
|
||||
exports = Class({
|
||||
initialize: function Lru(max) {
|
||||
this._max = max;
|
||||
this._list = new LinkedList();
|
||||
this._map = new PseudoMap();
|
||||
},
|
||||
has: function(key) {
|
||||
return this._map.has(key);
|
||||
},
|
||||
remove: function(key) {
|
||||
var map = this._map;
|
||||
if (this.has(key)) {
|
||||
var node = map.get(key);
|
||||
this._list.rmNode(node);
|
||||
map.delete(key);
|
||||
}
|
||||
},
|
||||
get: function(key) {
|
||||
var list = this._list;
|
||||
var map = this._map;
|
||||
var ret;
|
||||
if (this.has(key)) {
|
||||
var node = map.get(key);
|
||||
ret = node.value.val;
|
||||
list.rmNode(node);
|
||||
list.unshift(node.value);
|
||||
map.set(key, list.head);
|
||||
}
|
||||
return ret;
|
||||
},
|
||||
set: function(key, val) {
|
||||
var list = this._list;
|
||||
var map = this._map;
|
||||
if (this.has(key)) {
|
||||
var node = map.get(key);
|
||||
list.rmNode(node);
|
||||
list.unshift({
|
||||
key: key,
|
||||
val: val
|
||||
});
|
||||
map.set(key, list.head);
|
||||
} else {
|
||||
list.unshift({
|
||||
key: key,
|
||||
val: val
|
||||
});
|
||||
map.set(key, list.head);
|
||||
if (list.size > this._max) {
|
||||
var item = list.pop();
|
||||
map.delete(item.key);
|
||||
}
|
||||
}
|
||||
},
|
||||
clear: function() {
|
||||
this._map = new PseudoMap();
|
||||
this._list = new LinkedList();
|
||||
}
|
||||
});
|
||||
|
||||
module.exports = exports;
|
||||
Reference in New Issue
Block a user