[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