##// END OF EJS Templates
smartset: split generatorset classes to avoid cycle...
Gregory Szorc -
r35517:12a46ad6 default
parent child Browse files
Show More
@@ -772,6 +772,16 b' class generatorset(abstractsmartset):'
772 >>> xs.last() # cached
772 >>> xs.last() # cached
773 4
773 4
774 """
774 """
775 def __new__(cls, gen, iterasc=None):
776 if iterasc is None:
777 typ = cls
778 elif iterasc:
779 typ = _generatorsetasc
780 else:
781 typ = _generatorsetdesc
782
783 return super(generatorset, cls).__new__(typ)
784
775 def __init__(self, gen, iterasc=None):
785 def __init__(self, gen, iterasc=None):
776 """
786 """
777 gen: a generator producing the values for the generatorset.
787 gen: a generator producing the values for the generatorset.
@@ -782,13 +792,6 b' class generatorset(abstractsmartset):'
782 self._genlist = []
792 self._genlist = []
783 self._finished = False
793 self._finished = False
784 self._ascending = True
794 self._ascending = True
785 if iterasc is not None:
786 if iterasc:
787 self.fastasc = self._iterator
788 self.__contains__ = self._asccontains
789 else:
790 self.fastdesc = self._iterator
791 self.__contains__ = self._desccontains
792
795
793 def __nonzero__(self):
796 def __nonzero__(self):
794 # Do not use 'for r in self' because it will enforce the iteration
797 # Do not use 'for r in self' because it will enforce the iteration
@@ -814,36 +817,6 b' class generatorset(abstractsmartset):'
814 self._cache[x] = False
817 self._cache[x] = False
815 return False
818 return False
816
819
817 def _asccontains(self, x):
818 """version of contains optimised for ascending generator"""
819 if x in self._cache:
820 return self._cache[x]
821
822 # Use new values only, as existing values would be cached.
823 for l in self._consumegen():
824 if l == x:
825 return True
826 if l > x:
827 break
828
829 self._cache[x] = False
830 return False
831
832 def _desccontains(self, x):
833 """version of contains optimised for descending generator"""
834 if x in self._cache:
835 return self._cache[x]
836
837 # Use new values only, as existing values would be cached.
838 for l in self._consumegen():
839 if l == x:
840 return True
841 if l < x:
842 break
843
844 self._cache[x] = False
845 return False
846
847 def __iter__(self):
820 def __iter__(self):
848 if self._ascending:
821 if self._ascending:
849 it = self.fastasc
822 it = self.fastasc
@@ -947,7 +920,45 b' class generatorset(abstractsmartset):'
947
920
948 def __repr__(self):
921 def __repr__(self):
949 d = {False: '-', True: '+'}[self._ascending]
922 d = {False: '-', True: '+'}[self._ascending]
950 return '<%s%s>' % (type(self).__name__, d)
923 return '<%s%s>' % (type(self).__name__.lstrip('_'), d)
924
925 class _generatorsetasc(generatorset):
926 """Special case of generatorset optimized for ascending generators."""
927
928 fastasc = generatorset._iterator
929
930 def __contains__(self, x):
931 if x in self._cache:
932 return self._cache[x]
933
934 # Use new values only, as existing values would be cached.
935 for l in self._consumegen():
936 if l == x:
937 return True
938 if l > x:
939 break
940
941 self._cache[x] = False
942 return False
943
944 class _generatorsetdesc(generatorset):
945 """Special case of generatorset optimized for descending generators."""
946
947 fastdesc = generatorset._iterator
948
949 def __contains__(self, x):
950 if x in self._cache:
951 return self._cache[x]
952
953 # Use new values only, as existing values would be cached.
954 for l in self._consumegen():
955 if l == x:
956 return True
957 if l < x:
958 break
959
960 self._cache[x] = False
961 return False
951
962
952 def spanset(repo, start=0, end=None):
963 def spanset(repo, start=0, end=None):
953 """Create a spanset that represents a range of repository revisions
964 """Create a spanset that represents a range of repository revisions
@@ -1484,7 +1484,7 b' Test scmutil.revsingle() should return t'
1484 $ hg debugrevspec -s 'last(0::)'
1484 $ hg debugrevspec -s 'last(0::)'
1485 * set:
1485 * set:
1486 <baseset slice=0:1
1486 <baseset slice=0:1
1487 <generatorset->>
1487 <generatorsetasc->>
1488 9
1488 9
1489 $ hg identify -r '0::' --num
1489 $ hg identify -r '0::' --num
1490 9
1490 9
@@ -152,7 +152,7 b' test that `or` operation skips duplicate'
152 * set:
152 * set:
153 <addset
153 <addset
154 <baseset- [1, 3, 5]>,
154 <baseset- [1, 3, 5]>,
155 <generatorset+>>
155 <generatorsetdesc+>>
156 5
156 5
157 3
157 3
158 1
158 1
@@ -174,7 +174,7 b' test that `or` operation skips duplicate'
174 (symbol '5'))))))
174 (symbol '5'))))))
175 * set:
175 * set:
176 <addset+
176 <addset+
177 <generatorset+>,
177 <generatorsetdesc+>,
178 <baseset- [1, 3, 5]>>
178 <baseset- [1, 3, 5]>>
179 0
179 0
180 1
180 1
@@ -927,7 +927,7 b' test alias recursion'
927 (symbol 'merge')
927 (symbol 'merge')
928 None))
928 None))
929 * set:
929 * set:
930 <generatorset+>
930 <generatorsetasc+>
931 6
931 6
932 7
932 7
933
933
General Comments 0
You need to be logged in to leave comments. Login now