sentinal = object()
class LRU(object):
"""
Implementation of a length-limited O(1) LRU queue.
Built for and used by PyPE:
http://pype.sourceforge.net
Copyright 2003 Josiah Carlson.
"""
def __init__(self, count, pairs=()):
self.count = max(count, 2)
self.d = {}
self.first = None
self.last = None
for key, value in pairs:
self[key] = value
def __contains__(self, obj):
return obj in self.d
def _to_front(self, node):
if node.prev:
node.prev.next = node.next
if node.next:
node.next.prev = node.prev
node.next = self.first
node.prev = None
self.first = node
def __getitem__(self, obj):
node = self.d[obj]
self._to_front(node)
return node.me[1]
def __setitem__(self, key, val):
d = self.d
node = d.get(key, sentinal)
if node is not sentinal:
node.me = (key, val)
else:
node = Node(None, (key, val))
d[key] = node
self._to_front(node)
if len(d) > self.count:
self._remove(self.last)
def _remove(self, node):
if node.prev:
node.prev.next = nobj.next
else:
self.first = node.next
if node.next:
node.next.prev = node.prev
else:
self.last = node.prev
del self.d[node.me[0]]
def __delitem__(self, key):
node = self.d[key]
self._remove(node)
def __iter__(self):
cur = self.first
while cur != None:
cur2 = cur.next
yield cur.me[1]
cur = cur2
def iteritems(self):
cur = self.first
while cur != None:
cur2 = cur.next
yield cur.me
cur = cur2
def iterkeys(self):
return iter(self.d)
def itervalues(self):
for i,j in self.iteritems():
yield j
def keys(self):
return self.d.keys()sentinal = object()
class LRU(object):
"""
Implementation of a length-limited O(1) LRU queue.
Built for and used by PyPE:
http://pype.sourceforge.net
Copyright 2003 Josiah Carlson.
"""
def __init__(self, count, pairs=[]):
self.count = max(count, 2)
self.d = {}
self.first = None
self.last = None
for key, value in pairs:
self[key] = value
def __contains__(self, obj):
return obj in self.d
def _to_front(self, node):
if node.prev:
node.prev.next = node.next
if node.next:
node.next.prev = node.prev
node.next = self.first
node.prev = None
self.first = node
def __getitem__(self, obj):
node = self.d[obj]
self._to_front(node)
return node.me[1]
def __setitem__(self, key, val):
d = self.d
node = d.get(key, sentinal)
if node is not sentinal:
node.me = (key, val)
else:
node = Node(None, (key, val))
d[key] = node
self._to_front(node)
if len(d) > self.count:
self._remove(self.last)
def _remove(self, node):
if node.prev:
node.prev.next = node.next
else:
self.first = node.next
if node.next:
node.next.prev = node.prev
else:
self.last = node.prev
del self.d[node.me[0]]
def __delitem__(self, key):
node = self.d[key]
self._remove(node)
def __iter__(self):
cur = self.first
while cur != None:
cur2 = cur.next
yield cur.me[1]
cur = cur2
def iteritems(self):
cur = self.first
while cur != None:
cur2 = cur.next
yield cur.me
cur = cur2
def iterkeys(self):
return iter(self.d)
def itervalues(self):
for i,j in self.iteritems():
yield j
def keys(self):
return self.d.keys()