2q-cache
Version:
Imlementation of 2Q Cache Algorithm
115 lines (96 loc) • 2.71 kB
text/typescript
import { CacheQueueHead, CacheQueueElem } from "./cache_objects";
export class CacheQueue {
private head : CacheQueueHead;
private last : CacheQueueElem;
private count : number;
private maxCount : number;
constructor(max_count) {
this.maxCount = max_count;
this.count = 0;
this.head = new CacheQueueHead();
this.last = null;
}
isFull() : boolean {
return this.count >= this.maxCount;
}
setSize(size : number) {
this.maxCount = size;
}
unshift(elem : CacheQueueElem) : CacheQueueElem {
let oldHead = this.head.next;
if (oldHead) {
oldHead.prev = elem;
}
elem.next = oldHead;
this.head.next = elem;
this.count++;
if (this.count > this.maxCount) {
if (this.last !== null) {
this.last = this.last.prev;
this.count--;
return this.unlink(this.last.next);
}
}
return null;
}
push(elem : CacheQueueElem) : CacheQueueElem {
if (this.head.next === null) {
this.head.next = elem;
this.last = elem;
} else {
this.last.next = elem;
elem.prev = this.last;
this.last = elem;
}
this.count++;
if (this.count > this.maxCount) {
this.count--;
let elemToPop = this.head.next;
this.head.next = this.head.next.next;
if (this.count > 0) {
this.head.next.prev = null;
}
return elemToPop;
}
return null;
}
unlink(elem : CacheQueueElem) : CacheQueueElem {
this.count--;
if (elem.prev != null) {
elem.prev.next = elem.next;
}
if (elem.next != null) {
elem.next.prev = elem.prev;
}
elem.prev = null;
elem.next = null;
return elem;
}
pop() {
return this.unlink(this.head.next);
}
clear() {
this.head.next = null;
this.last = null;
this.count = 0;
}
getSize() {
return this.count;
}
getMaxSize() {
return this.maxCount;
}
getData() {
let dataArray : Array<any> = [];
let cursor = this.head.next;
while (cursor != null) {
dataArray.push(cursor.key);
cursor = cursor.next;
}
return {
data : dataArray,
count : this.count,
maxCount : this.maxCount
}
}
}