summaryrefslogtreecommitdiff
path: root/bzrlib/identitymap.py
diff options
context:
space:
mode:
Diffstat (limited to 'bzrlib/identitymap.py')
-rw-r--r--bzrlib/identitymap.py75
1 files changed, 75 insertions, 0 deletions
diff --git a/bzrlib/identitymap.py b/bzrlib/identitymap.py
new file mode 100644
index 0000000..a2c98d7
--- /dev/null
+++ b/bzrlib/identitymap.py
@@ -0,0 +1,75 @@
+# Copyright (C) 2005 Canonical Ltd
+# Authors: Robert Collins <robert.collins@canonical.com>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+"""This module provides an IdentityMap."""
+
+from __future__ import absolute_import
+
+from bzrlib import (
+ errors,
+ )
+
+
+class IdentityMap(object):
+ """An in memory map from object id to instance.
+
+ An IdentityMap maps from keys to single instances of objects in memory.
+ We have explicit calls on the map for the root of each inheritance tree
+ that is store in the map. Look for find_CLASS and add_CLASS methods.
+ """
+
+ def add_weave(self, id, weave):
+ """Add weave to the map with a given id."""
+ if self._weave_key(id) in self._map:
+ raise errors.BzrError('weave %s already in the identity map' % id)
+ self._map[self._weave_key(id)] = weave
+ self._reverse_map[weave] = self._weave_key(id)
+
+ def find_weave(self, id):
+ """Return the weave for 'id', or None if it is not present."""
+ return self._map.get(self._weave_key(id), None)
+
+ def __init__(self):
+ super(IdentityMap, self).__init__()
+ self._map = {}
+ self._reverse_map = {}
+
+ def remove_object(self, an_object):
+ """Remove object from map."""
+ if isinstance(an_object, list):
+ raise KeyError('%r not in identity map' % an_object)
+ else:
+ self._map.pop(self._reverse_map[an_object])
+ self._reverse_map.pop(an_object)
+
+ def _weave_key(self, id):
+ """Return the key for a weaves id."""
+ return "weave-" + id
+
+
+class NullIdentityMap(object):
+ """A pretend in memory map from object id to instance.
+
+ A NullIdentityMap is an Identity map that does not store anything in it.
+ """
+
+ def add_weave(self, id, weave):
+ """See IdentityMap.add_weave."""
+
+ def find_weave(self, id):
+ """See IdentityMap.find_weave."""
+ return None