diff options
author | Marco Pesenti Gritti <mpg@redhat.com> | 2007-09-08 10:10:35 (GMT) |
---|---|---|
committer | Marco Pesenti Gritti <mpg@redhat.com> | 2007-09-08 10:10:35 (GMT) |
commit | 34e9d30a9cd87e5b3fa665a0a4a9a954a5edb88e (patch) | |
tree | da168c2d98ab8b6e6458ef896564b684b94df71e /sugar/util.py | |
parent | 434483f54a3a5477077a96167f17ee6e19e2a0e7 (diff) |
Improved icon caching logic
Diffstat (limited to 'sugar/util.py')
-rw-r--r-- | sugar/util.py | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/sugar/util.py b/sugar/util.py index 814a728..5f01848 100644 --- a/sugar/util.py +++ b/sugar/util.py @@ -128,3 +128,81 @@ def set_proc_title(title): except: return False +class Node(object): + __slots__ = ['prev', 'next', 'me'] + def __init__(self, prev, me): + self.prev = prev + self.me = me + self.next = None + +class LRU: + """ + 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, 1) + 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 __getitem__(self, obj): + a = self.d[obj].me + self[a[0]] = a[1] + return a[1] + def __setitem__(self, obj, val): + if obj in self.d: + del self[obj] + nobj = Node(self.last, (obj, val)) + if self.first is None: + self.first = nobj + if self.last: + self.last.next = nobj + self.last = nobj + self.d[obj] = nobj + if len(self.d) > self.count: + if self.first == self.last: + self.first = None + self.last = None + return + a = self.first + a.next.prev = None + self.first = a.next + a.next = None + del self.d[a.me[0]] + del a + def __delitem__(self, obj): + nobj = self.d[obj] + if nobj.prev: + nobj.prev.next = nobj.next + else: + self.first = nobj.next + if nobj.next: + nobj.next.prev = nobj.prev + else: + self.last = nobj.prev + del self.d[obj] + 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() |