summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJay Hutchinson <jlhutch@gmail.com>2010-09-04 12:26:23 -0500
committerJay Hutchinson <jlhutch@gmail.com>2010-09-04 12:26:23 -0500
commit66a4373dec1ed3e2f5c903d26a180b0ba8cc058a (patch)
tree8534e29d25634354492851926bd167df096d4335
parent0a454f67a904ce49c9adf1bb6dfb8b3d25b73b5b (diff)
downloadpylru-66a4373dec1ed3e2f5c903d26a180b0ba8cc058a.tar.gz
Refactored size(), addTailNode(), removeTailNode().
-rw-r--r--lru.py71
1 files changed, 36 insertions, 35 deletions
diff --git a/lru.py b/lru.py
index a9d5dfa..b55d75d 100644
--- a/lru.py
+++ b/lru.py
@@ -60,9 +60,10 @@ class lrucache(object):
self.head.prev = self.head
self.listSize = 1
+
+ # Adjust the size
+ self.size(size)
- for i in range(1, size):
- self.addTailNode()
def __len__(self):
return len(self.table)
@@ -185,46 +186,46 @@ class lrucache(object):
assert size > 0
if size > self.listSize:
- for i in range(size - self.listSize):
- self.addTailNode()
+ self.addTailNode(size - self.listSize)
elif size < self.listSize:
- for i in range(self.listSize - size):
- self.removeTailNode()
+ self.removeTailNode(self.listSize - size)
return self.listSize
- def addTailNode(self):
- node = _dlnode()
- node.next = self.head
- node.prev = self.head.prev
-
- self.head.prev.next = node
- self.head.prev = node
+ def addTailNode(self, n):
+ for i in range(n):
+ node = _dlnode()
+ node.next = self.head
+ node.prev = self.head.prev
+
+ self.head.prev.next = node
+ self.head.prev = node
- self.listSize += 1
+ self.listSize += n
- def removeTailNode(self):
-
- assert self.listSize > 1 # Invarient
- node = self.head.prev
- if node.key is not None:
- if self.callback:
- self.callback(node.key, node.obj)
- del self.table[node.key]
-
- # Splice the tail node out of the list
- self.head.prev = node.prev
- node.prev.next = self.head
-
- self.listSize -= 1
-
- node.prev = None
- node.next = None
-
- node.key = None
- node.obj = None
-
+
+ def removeTailNode(self, n):
+ assert self.listSize > 1 # Invarient. XXX REMOVE this line XXX
+ for i in range(n):
+ node = self.head.prev
+ if node.key is not None:
+ if self.callback:
+ self.callback(node.key, node.obj)
+ del self.table[node.key]
+
+ # Splice the tail node out of the list
+ self.head.prev = node.prev
+ node.prev.next = self.head
+
+ # The next four lines are not strictly necessary.
+ node.prev = None
+ node.next = None
+
+ node.key = None
+ node.obj = None
+
+ self.listSize -= n
def __del__(self):
# When we are finished with the cache, special care is taken to break the