diff --git a/ChangeLog b/ChangeLog index 24bfac027..bc3c1d135 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,7 +1,7 @@ 2006-10-29 Don Allingham * src/GrampsCfg.py: make look more like gedit * src/Lru.py: Added least-recently-used module from - the PyPE program + the PyPE program * src/DisplayModels/_PeopleModel.py: use LRU module to speed up name displays * configure.in: post 2.2.1 release update diff --git a/src/DisplayModels/_PeopleModel.py b/src/DisplayModels/_PeopleModel.py index 57719a042..aaf4c1697 100644 --- a/src/DisplayModels/_PeopleModel.py +++ b/src/DisplayModels/_PeopleModel.py @@ -66,7 +66,7 @@ import ToolTips import GrampsLocale import Config from Filters import SearchFilter -from lru import LRU +from Lru import LRU #------------------------------------------------------------------------- # diff --git a/src/Lru.py b/src/Lru.py new file mode 100644 index 000000000..31cf2e40e --- /dev/null +++ b/src/Lru.py @@ -0,0 +1,103 @@ +# This file is derived from the GPL program "PyPE" +# +# Copyright (C) 2003-2006 Josiah Carlson +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# + +class Node: + def __init__(self, prev, me): + self.prev = prev + self.me = me + self.next = None + +class LRU: #Implementation of a length-limited O(1) LRU cache + def __init__(self, count): + self.count = max(count, 2) + self.d = {} + self.first = None + self.last = None + + def __contains__(self, obj): + return obj in self.d + + def __getitem__(self, obj): + return self.d[obj].me[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 + raise StopIteration + + def iteritems(self): + cur = self.first + while cur != None: + cur2 = cur.next + yield cur.me + cur = cur2 + raise StopIteration + + def iterkeys(self): + return iter(self.d) + + def itervalues(self): + for i,j in self.iteritems(): + yield j + + def keys(self): + return [i for i,j in self.iteritems()] + + def values(self): + return [j for i,j in self.iteritems()] + + def items(self): + return [i for i in self.iteritems()]