# HG changeset patch # User Lucas Moscovicz # Date 2014-02-28 01:27:03 # Node ID 7fc371d2e5a38d8d06878ed78da3f6c22364659d # Parent 0dc7a50345c2c64539837a4645f1aa3c162fb4e9 revset: added ordered generatorset classes with __contains__ method They stop iterating as soon as they go past the value they are looking for, so, for values not in the generator they return faster. diff --git a/mercurial/revset.py b/mercurial/revset.py --- a/mercurial/revset.py +++ b/mercurial/revset.py @@ -2296,6 +2296,40 @@ class generatorset(object): def set(self): return self +class ascgeneratorset(generatorset): + """ Same structure as generatorset but stops iterating after it goes past + the value when asked for membership and the element is not contained + """ + def __contains__(self, x): + if x in self._cache: + return self._cache[x] + + for l in self: + if l == x: + return True + if l > x: + break + + self._cache[x] = False + return False + +class descgeneratorset(generatorset): + """ Same structure as generatorset but stops iterating after it goes past + the value when asked for membership and the element is not contained + """ + def __contains__(self, x): + if x in self._cache: + return self._cache[x] + + for l in self: + if l == x: + return True + if l < x: + break + + self._cache[x] = False + return False + class spanset(object): """Duck type for baseset class which represents a range of revisions and can work lazily and without having all the range in memory