From patchwork Wed May 17 05:08:35 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: util: rewrite sortdict using Python 2.7's OrderedDict From: via Mercurial-devel X-Patchwork-Id: 20649 Message-Id: To: mercurial-devel@mercurial-scm.org Date: Tue, 16 May 2017 22:08:35 -0700 # HG changeset patch # User Martin von Zweigbergk # Date 1494997046 25200 # Tue May 16 21:57:26 2017 -0700 # Node ID eccddf592f672910ea22e13ffa9f5fe9fb757591 # Parent 779a1ae6d0d9eeb487636f665747e92195eb234e util: rewrite sortdict using Python 2.7's OrderedDict Pattern copied from https://docs.python.org/dev/library/collections.html#ordereddict-examples-and-recipes. diff --git a/mercurial/util.py b/mercurial/util.py --- a/mercurial/util.py +++ b/mercurial/util.py @@ -567,54 +567,14 @@ return f -class sortdict(dict): +class sortdict(collections.OrderedDict): '''a simple sorted dictionary''' - def __init__(self, data=None): - self._list = [] - if data: - self.update(data) + def __setitem__(self, key, value): + if key in self: + del self[key] + collections.OrderedDict.__setitem__(self, key, value) def copy(self): return sortdict(self) - def __setitem__(self, key, val): - if key in self: - self._list.remove(key) - self._list.append(key) - dict.__setitem__(self, key, val) - def __iter__(self): - return self._list.__iter__() - def update(self, src): - if isinstance(src, dict): - src = src.iteritems() - for k, v in src: - self[k] = v - def clear(self): - dict.clear(self) - self._list = [] - def items(self): - return [(k, self[k]) for k in self._list] - def __delitem__(self, key): - dict.__delitem__(self, key) - self._list.remove(key) - def pop(self, key, *args, **kwargs): - try: - self._list.remove(key) - except ValueError: - pass - return dict.pop(self, key, *args, **kwargs) - def keys(self): - return self._list[:] - def iterkeys(self): - return self._list.__iter__() - def iteritems(self): - for k in self._list: - yield k, self[k] - def insert(self, index, key, val): - self._list.insert(index, key) - dict.__setitem__(self, key, val) - def __repr__(self): - if not self: - return '%s()' % self.__class__.__name__ - return '%s(%r)' % (self.__class__.__name__, self.items()) class _lrucachenode(object): """A node in a doubly linked list.