1 // Copyright 2003 Adam Megacz, see the COPYING file for licensing [GPL]
7 * A Hash table with a fixed size; drops extraneous elements. Uses
10 public class Cache extends Hash {
12 /** head of list is the mru; tail is the lru */
18 public Cache(int maxSize) {
19 super(maxSize * 2, 3);
20 this.maxSize = maxSize;
23 /** A doubly-linked list */
28 public Node(Object k1, Object k2, Object val) { this.k1 = k1; this.k2 = k2; this.val = val; }
32 if (this == lru) lru = prev;
33 if (this == mru) mru = next;
34 if (next != null) next.prev = prev;
35 if (prev != null) prev.next = next;
38 void placeAfter(Node n) {
40 if (n == null) return;
42 if (n.next != null) n.next.prev = this;
46 void placeBefore(Node n) {
48 if (n == null) return;
52 if (prev != null) prev.next = this;
61 public void remove(Object k1, Object k2) {
62 Object o = super.get(k1, k2);
63 if (o != null) ((Node)o).remove();
67 public Object get(Object k1, Object k2) {
68 Node n = (Node)super.get(k1, k2);
69 if (n == null) return null;
76 public void put(Object k1, Object k2, Object v) {
77 Node n = new Node(k1, k2, v);
84 if (super.get(k1, k2) != null) remove(k1, k2);
86 if (size > maxSize) remove(lru.k1, lru.k2);