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):