Mercurial > public > mercurial-scm > hg
comparison mercurial/util.py @ 32300:bd0fd3ff9916
util: rewrite sortdict using Python 2.7's OrderedDict
Pattern copied from
https://docs.python.org/dev/library/collections.html#ordereddict-examples-and-recipes.
author | Martin von Zweigbergk <martinvonz@google.com> |
---|---|
date | Tue, 16 May 2017 23:40:29 -0700 |
parents | bd872f64a8ba |
children | 2d19664e257d |
comparison
equal
deleted
inserted
replaced
32299:7040f5131454 | 32300:bd0fd3ff9916 |
---|---|
565 cache[args] = func(*args) | 565 cache[args] = func(*args) |
566 return cache[args] | 566 return cache[args] |
567 | 567 |
568 return f | 568 return f |
569 | 569 |
570 class sortdict(dict): | 570 class sortdict(collections.OrderedDict): |
571 '''a simple sorted dictionary''' | 571 '''a simple sorted dictionary''' |
572 def __init__(self, data=None): | 572 def __setitem__(self, key, value): |
573 self._list = [] | 573 if key in self: |
574 if data: | 574 del self[key] |
575 self.update(data) | 575 super(sortdict, self).__setitem__(key, value) |
576 def copy(self): | 576 def copy(self): |
577 return sortdict(self) | 577 return sortdict(self) |
578 def __setitem__(self, key, val): | |
579 if key in self: | |
580 self._list.remove(key) | |
581 self._list.append(key) | |
582 dict.__setitem__(self, key, val) | |
583 def __iter__(self): | |
584 return self._list.__iter__() | |
585 def update(self, src): | |
586 if isinstance(src, dict): | |
587 src = src.iteritems() | |
588 for k, v in src: | |
589 self[k] = v | |
590 def clear(self): | |
591 dict.clear(self) | |
592 self._list = [] | |
593 def items(self): | |
594 return [(k, self[k]) for k in self._list] | |
595 def __delitem__(self, key): | |
596 dict.__delitem__(self, key) | |
597 self._list.remove(key) | |
598 def pop(self, key, *args, **kwargs): | |
599 try: | |
600 self._list.remove(key) | |
601 except ValueError: | |
602 pass | |
603 return dict.pop(self, key, *args, **kwargs) | |
604 def keys(self): | |
605 return self._list[:] | |
606 def iterkeys(self): | |
607 return self._list.__iter__() | |
608 def iteritems(self): | |
609 for k in self._list: | |
610 yield k, self[k] | |
611 def insert(self, index, key, val): | |
612 self._list.insert(index, key) | |
613 dict.__setitem__(self, key, val) | |
614 def __repr__(self): | |
615 if not self: | |
616 return '%s()' % self.__class__.__name__ | |
617 return '%s(%r)' % (self.__class__.__name__, self.items()) | |
618 | 578 |
619 class _lrucachenode(object): | 579 class _lrucachenode(object): |
620 """A node in a doubly linked list. | 580 """A node in a doubly linked list. |
621 | 581 |
622 Holds a reference to nodes on either side as well as a key-value | 582 Holds a reference to nodes on either side as well as a key-value |