comparison mercurial/revset.py @ 20694:621c94378d0d

revset: added addset class with its basic methods This class addresses the problem of losing performance on the __contains__ method when adding two smart structures with fast membership testing.
author Lucas Moscovicz <lmoscovicz@fb.com>
date Fri, 07 Mar 2014 13:48:31 -0800
parents d04aac468bf4
children d99fcf4483f8
comparison
equal deleted inserted replaced
20693:d04aac468bf4 20694:621c94378d0d
2312 2312
2313 def reverse(self): 2313 def reverse(self):
2314 self._subset.reverse() 2314 self._subset.reverse()
2315 self._ascending = not self._ascending 2315 self._ascending = not self._ascending
2316 2316
2317 class addset(object):
2318 """Wrapper structure for lazily adding two structures without losing much
2319 performance on the __contains__ method
2320 """
2321 def __init__(self, revs1, revs2):
2322 self._r1 = revs1
2323 self._r2 = revs2
2324 self._iter = None
2325
2326 def _iterator(self):
2327 if not self._iter:
2328 def gen():
2329 for r in self._r1:
2330 yield r
2331 s = self._r1.set()
2332 for r in self._r2:
2333 if r not in s:
2334 yield r
2335 self._iter = generatorset(gen())
2336
2337 return self._iter
2338
2339 def __iter__(self):
2340 for r in self._iterator():
2341 yield r
2342
2343 def __contains__(self, x):
2344 return x in self._r1 or x in self._r2
2345
2317 class generatorset(object): 2346 class generatorset(object):
2318 """Wrapper structure for generators that provides lazy membership and can 2347 """Wrapper structure for generators that provides lazy membership and can
2319 be iterated more than once. 2348 be iterated more than once.
2320 When asked for membership it generates values until either it finds the 2349 When asked for membership it generates values until either it finds the
2321 requested one or has gone through all the elements in the generator 2350 requested one or has gone through all the elements in the generator