Mercurial > public > mercurial-scm > hg
comparison mercurial/revset.py @ 22798:586d7058ea48
generatorset: get list-based fast iterations after the generator is consumed
When all revisions are known, we shortcut most of the class logic to use list
iteration instead. The cost of the sort is expected to be non-significant. The
list creation and sorting could be done lazily in the future. We have to copy
the list to not break existing iterator created before we finished consuming the
generator.
author | Pierre-Yves David <pierre-yves.david@fb.com> |
---|---|
date | Fri, 03 Oct 2014 21:01:30 -0700 |
parents | 61ecabeeadb3 |
children | bafa371d7af3 |
comparison
equal
deleted
inserted
replaced
22797:61ecabeeadb3 | 22798:586d7058ea48 |
---|---|
2619 def __init__(self, gen, iterasc=None): | 2619 def __init__(self, gen, iterasc=None): |
2620 """ | 2620 """ |
2621 gen: a generator producing the values for the generatorset. | 2621 gen: a generator producing the values for the generatorset. |
2622 """ | 2622 """ |
2623 self._gen = gen | 2623 self._gen = gen |
2624 self._asclist = None | |
2624 self._cache = {} | 2625 self._cache = {} |
2625 self._genlist = [] | 2626 self._genlist = [] |
2626 self._finished = False | 2627 self._finished = False |
2627 if iterasc is not None: | 2628 if iterasc is not None: |
2628 if iterasc: | 2629 if iterasc: |
2710 genlist = self._genlist.append | 2711 genlist = self._genlist.append |
2711 for item in self._gen: | 2712 for item in self._gen: |
2712 cache[item] = True | 2713 cache[item] = True |
2713 genlist(item) | 2714 genlist(item) |
2714 yield item | 2715 yield item |
2715 self._finished = True | 2716 if not self._finished: |
2717 self._finished = True | |
2718 asc = self._genlist[:] | |
2719 asc.sort() | |
2720 self._asclist = asc | |
2721 self.fastasc = asc.__iter__ | |
2722 self.fastdesc = asc.__reversed__ | |
2716 | 2723 |
2717 def set(self): | 2724 def set(self): |
2718 return self | 2725 return self |
2719 | 2726 |
2720 def sort(self, reverse=False): | 2727 def sort(self, reverse=False): |