UNPKG

int-cli

Version:

INT is the new generation of bottom-up created system of IoT and blockchain

153 lines (152 loc) 3.62 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); class LRUNode { constructor(value) { this.m_next = null; this.m_prev = null; this.m_v = value; } set next(node) { this.m_next = node; } get next() { return this.m_next; } set prev(node) { this.m_prev = node; } get prev() { return this.m_prev; } get value() { return this.m_v; } } class DLink { constructor() { this.m_head = null; this.m_tail = null; this.m_count = 0; } get length() { return this.m_count; } get head() { return this.m_head; } get tail() { return this.m_tail; } remove(node) { if (this.length === 0) { return; } let prev = node.prev; let next = node.next; if (prev) { prev.next = next; } if (this.m_head === node) { this.m_head = prev; } if (next) { next.prev = prev; } if (this.m_tail === node) { this.m_tail = next; } node.next = node.prev = null; this.m_count--; } addToHead(node) { node.next = node.prev = null; node.prev = this.m_head; if (this.m_head) { this.m_head.next = node; } this.m_head = node; if (this.m_count === 0) { this.m_tail = node; } this.m_count++; } removeTail() { if (this.length === 0) { return; } this.remove(this.m_tail); } clear() { this.m_head = null; this.m_tail = null; this.m_count = 0; } } class LRUCache { constructor(maxCount) { this.m_maxCount = maxCount; this.m_memValue = new Map(); this.m_link = new DLink(); } set(key, value) { if (this.m_memValue.has(key)) { let [_, node] = this.m_memValue.get(key); this.m_link.remove(node); this.m_link.addToHead(node); this.m_memValue.set(key, [value, node]); } else { if (this.m_link.length >= this.m_maxCount && this.m_link.tail) { this.m_memValue.delete(this.m_link.tail.value); this.m_link.removeTail(); } let node = new LRUNode(key); this.m_link.addToHead(node); this.m_memValue.set(key, [value, node]); } } get(key) { if (!this.m_memValue.has(key)) { return null; } let [value, _] = this.m_memValue.get(key); this.set(key, value); return value; } remove(key) { if (!this.m_memValue.has(key)) { return; } let [_, node] = this.m_memValue.get(key); this.m_link.remove(node); this.m_memValue.delete(key); } clear() { this.m_memValue.clear(); this.m_link.clear(); } print() { let begin = this.m_link.head; while (begin) { let key = begin.value; let [value, _] = this.m_memValue.get(key); begin = begin.next; } } } exports.LRUCache = LRUCache; // let lru: LRUCache<number,string> = new LRUCache<number,string>(5); // lru.set(1,'a'); // lru.print(); // lru.remove(1); // lru.print(); // lru.set(1,'a'); // lru.set(2,'b'); // lru.set(3,'c'); // lru.set(4,'d'); // lru.set(5,'e'); // lru.print(); // let s:string|null = lru.get(3); // lru.print(); // lru.set(6,'f'); // lru.print();