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