[PATCH 1 of 2] revlog: add __contains__ for fast membership test

Yuya Nishihara yuya at tcha.org
Wed Feb 4 13:27:03 UTC 2015


# HG changeset patch
# User Yuya Nishihara <yuya at tcha.org>
# Date 1423052757 -32400
#      Wed Feb 04 21:25:57 2015 +0900
# Node ID f65a44d4905a5b4767e4b901de6ed1efe703611f
# Parent  e1dbe0b215ae137eec53ceb12440536d570a83d2
revlog: add __contains__ for fast membership test

Because revlog implements __iter__, "rev in revlog" works but does silly O(n)
lookup unexpectedly. So it seems good to add fast version of __contains__.

This allows "rev in repo.changelog" in the next patch.

diff --git a/mercurial/changelog.py b/mercurial/changelog.py
--- a/mercurial/changelog.py
+++ b/mercurial/changelog.py
@@ -143,6 +143,11 @@ class changelog(revlog.revlog):
             if i not in self.filteredrevs:
                 return self.node(i)
 
+    def __contains__(self, rev):
+        """filtered version of revlog.__contains__"""
+        return (revlog.revlog.__contains__(self, rev)
+                and rev not in self.filteredrevs)
+
     def __iter__(self):
         """filtered version of revlog.__iter__"""
         if len(self.filteredrevs) == 0:
diff --git a/mercurial/revlog.py b/mercurial/revlog.py
--- a/mercurial/revlog.py
+++ b/mercurial/revlog.py
@@ -277,6 +277,8 @@ class revlog(object):
 
     def tip(self):
         return self.node(len(self.index) - 2)
+    def __contains__(self, rev):
+        return 0 <= rev < len(self)
     def __len__(self):
         return len(self.index) - 1
     def __iter__(self):


More information about the Mercurial-devel mailing list