Mercurial > public > mercurial-scm > hg
comparison mercurial/revset.py @ 22717:b89f7e3a414d
spanset: enforce the order lazily to gain `fastasc` and `fastdesc` methods
Instead of having the direction of iteration enforced through the ordering of
`start` and `end` attributes of spanset, we encode the iteration direction in
an explicit attribute and always store start < end. The logic for sort and
reverse has to be updated. The __iter__ is now based on the newly introduced
`fastasc` and `fastdesc` methods.
This will allow other code simplifications in the future.
author | Pierre-Yves David <pierre-yves.david@fb.com> |
---|---|
date | Thu, 02 Oct 2014 18:02:17 -0500 |
parents | 6877ba8d85ff |
children | 7b123e5639f4 |
comparison
equal
deleted
inserted
replaced
22716:6877ba8d85ff | 22717:b89f7e3a414d |
---|---|
2853 end: first revision excluded (last+1) | 2853 end: first revision excluded (last+1) |
2854 (default to len(repo) | 2854 (default to len(repo) |
2855 | 2855 |
2856 Spanset will be descending if `end` < `start`. | 2856 Spanset will be descending if `end` < `start`. |
2857 """ | 2857 """ |
2858 if end is None: | |
2859 end = len(repo) | |
2860 self._ascending = start <= end | |
2861 if not self._ascending: | |
2862 start, end = end + 1, start +1 | |
2858 self._start = start | 2863 self._start = start |
2859 if end is not None: | 2864 self._end = end |
2860 self._end = end | 2865 self._hiddenrevs = repo.changelog.filteredrevs |
2866 | |
2867 def sort(self, reverse=False): | |
2868 self._ascending = not reverse | |
2869 | |
2870 def reverse(self): | |
2871 self._ascending = not self._ascending | |
2872 | |
2873 def _iterfilter(self, iterrange): | |
2874 s = self._hiddenrevs | |
2875 for r in iterrange: | |
2876 if r not in s: | |
2877 yield r | |
2878 | |
2879 def __iter__(self): | |
2880 if self._ascending: | |
2881 return self.fastasc() | |
2861 else: | 2882 else: |
2862 self._end = len(repo) | 2883 return self.fastdesc() |
2863 self._hiddenrevs = repo.changelog.filteredrevs | 2884 |
2864 | 2885 def fastasc(self): |
2865 def __iter__(self): | 2886 iterrange = xrange(self._start, self._end) |
2866 if self.isascending(): | |
2867 iterrange = xrange(self._start, self._end) | |
2868 else: | |
2869 iterrange = xrange(self._start, self._end, -1) | |
2870 | |
2871 if self._hiddenrevs: | 2887 if self._hiddenrevs: |
2872 s = self._hiddenrevs | 2888 return self._iterfilter(iterrange) |
2873 for r in iterrange: | 2889 return iter(iterrange) |
2874 if r not in s: | 2890 |
2875 yield r | 2891 def fastdesc(self): |
2876 else: | 2892 iterrange = xrange(self._end - 1, self._start - 1, -1) |
2877 for r in iterrange: | 2893 if self._hiddenrevs: |
2878 yield r | 2894 return self._iterfilter(iterrange) |
2895 return iter(iterrange) | |
2879 | 2896 |
2880 def __contains__(self, rev): | 2897 def __contains__(self, rev): |
2881 start = self._start | 2898 start = self._start |
2882 end = self._end | 2899 end = self._end |
2883 hidden = self._hiddenrevs | 2900 hidden = self._hiddenrevs |
2920 | 2937 |
2921 def __getitem__(self, x): | 2938 def __getitem__(self, x): |
2922 # Basic implementation to be changed in future patches. | 2939 # Basic implementation to be changed in future patches. |
2923 l = baseset([r for r in self]) | 2940 l = baseset([r for r in self]) |
2924 return l[x] | 2941 return l[x] |
2925 | |
2926 def sort(self, reverse=False): | |
2927 if bool(reverse) != (self._start > self._end): | |
2928 self.reverse() | |
2929 | |
2930 def reverse(self): | |
2931 # Just switch the _start and _end parameters | |
2932 if self.isascending(): | |
2933 self._start, self._end = self._end - 1, self._start - 1 | |
2934 else: | |
2935 self._start, self._end = self._end + 1, self._start + 1 | |
2936 | 2942 |
2937 def set(self): | 2943 def set(self): |
2938 return self | 2944 return self |
2939 | 2945 |
2940 def isascending(self): | 2946 def isascending(self): |