[PATCH V2] smartset: add a "toset" method

Jun Wu quark at fb.com
Sat Jun 3 21:06:38 UTC 2017


# HG changeset patch
# User Jun Wu <quark at fb.com>
# Date 1496515319 25200
#      Sat Jun 03 11:41:59 2017 -0700
# Node ID a5f77662c4f22467b84fc3ce494998d23b0daa82
# Parent  783394c0c97807e83daad9da561179bd0719e159
# Available At https://bitbucket.org/quark-zju/hg-draft
#              hg pull https://bitbucket.org/quark-zju/hg-draft -r a5f77662c4f2
smartset: add a "toset" method

This allows us to convert a smartset to a Python set using a customized
approach.  Namely, baseset may have a "_set" property already which could be
used directly to avoid __iter__ overhead.

diff --git a/mercurial/smartset.py b/mercurial/smartset.py
--- a/mercurial/smartset.py
+++ b/mercurial/smartset.py
@@ -156,4 +156,8 @@ class abstractsmartset(object):
         return filteredset(self, condition, condrepr)
 
+    def toset(self):
+        """Convert to unordered Python set"""
+        return set(self)
+
 class baseset(abstractsmartset):
     """Basic data structure that represents a revset and contains the basic
@@ -169,5 +173,6 @@ class baseset(abstractsmartset):
 
     Construct by a set:
-    >>> xs = baseset(set(x))
+    >>> xset = set(x)
+    >>> xs = baseset(xset)
     >>> ys = baseset(set(y))
     >>> [list(i) for i in [xs + ys, xs & ys, xs - ys]]
@@ -175,4 +180,6 @@ class baseset(abstractsmartset):
     >>> [type(i).__name__ for i in [xs + ys, xs & ys, xs - ys]]
     ['addset', 'baseset', 'baseset']
+    >>> xset is xs.toset()
+    True
 
     Construct by a list-like:
@@ -237,4 +244,7 @@ class baseset(abstractsmartset):
         return set(self._list)
 
+    def toset(self):
+        return self._set
+
     @util.propertycache
     def _asclist(self):
@@ -584,4 +594,8 @@ class addset(abstractsmartset):
     >>> [x for x in rs]
     [5, 4, 3, 2, 0]
+
+    convert to Python set:
+    >>> sorted(rs.toset())
+    [0, 2, 3, 4, 5]
     """
     def __init__(self, revs1, revs2, ascending=None):


More information about the Mercurial-devel mailing list