[PATCH] util: rewrite sortdict using Python 2.7's OrderedDict

Martin von Zweigbergk martinvonz at google.com
Wed May 17 05:08:35 UTC 2017


# HG changeset patch
# User Martin von Zweigbergk <martinvonz at google.com>
# 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.


More information about the Mercurial-devel mailing list