Mercurial > public > mercurial-scm > hg
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 |