summaryrefslogtreecommitdiffstats
path: root/pym
diff options
context:
space:
mode:
authorZac Medico <zmedico@gentoo.org>2008-04-27 06:38:37 +0000
committerZac Medico <zmedico@gentoo.org>2008-04-27 06:38:37 +0000
commit9acab0e741cd8ad5a084c70c998c6d60138908a7 (patch)
tree44145b0eeb18fa2cf4a5fa10fb390d2780b6e65f /pym
parent20d63d57219657a14be2ba0333180ff82abb88d9 (diff)
downloadportage-9acab0e741cd8ad5a084c70c998c6d60138908a7.tar.gz
portage-9acab0e741cd8ad5a084c70c998c6d60138908a7.tar.bz2
portage-9acab0e741cd8ad5a084c70c998c6d60138908a7.zip
Create a digraph.difference_update() method and use it to amortize the
cost of removing nodes from the digraph.order list. (trunk r9992) svn path=/main/branches/2.1.2/; revision=9993
Diffstat (limited to 'pym')
-rw-r--r--pym/portage.py20
1 files changed, 20 insertions, 0 deletions
diff --git a/pym/portage.py b/pym/portage.py
index f11e8877e..9dd0ecd92 100644
--- a/pym/portage.py
+++ b/pym/portage.py
@@ -391,6 +391,26 @@ class digraph:
del self.nodes[node]
self.order.remove(node)
+ def difference_update(self, t):
+ """
+ Remove all given nodes from node_set. This is more efficient
+ than multiple calls to the remove() method.
+ """
+ if isinstance(t, (list, tuple)) or \
+ not hasattr(t, "__contains__"):
+ t = frozenset(t)
+ order = []
+ for node in self.order:
+ if node not in t:
+ order.append(node)
+ continue
+ for parent in self.nodes[node][1]:
+ del self.nodes[parent][0][node]
+ for child in self.nodes[node][0]:
+ del self.nodes[child][1][node]
+ del self.nodes[node]
+ self.order = order
+
def remove_edge(self, child, parent):
"""
Remove edge in the direction from child to parent. Note that it is