aboutsummaryrefslogtreecommitdiff
path: root/lib/OrderedDict.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/OrderedDict.py')
-rw-r--r--lib/OrderedDict.py76
1 files changed, 76 insertions, 0 deletions
diff --git a/lib/OrderedDict.py b/lib/OrderedDict.py
new file mode 100644
index 0000000..fa3f276
--- /dev/null
+++ b/lib/OrderedDict.py
@@ -0,0 +1,76 @@
+# OrderedDict.py
+#
+# This class functions almost exactly like UserDict. However, when using
+# the sequence methods, it returns items in the same order in which they
+# were added, instead of some random order.
+#
+# Copyright 2001 Adam Heath <doogie@debian.org>
+#
+# This file 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+from UserDict import UserDict
+
+class OrderedDict(UserDict):
+ __order=[]
+
+ def __init__(self, dict=None):
+ UserDict.__init__(self)
+ self.__order=[]
+ if dict is not None and dict.__class__ is not None:
+ self.update(dict)
+
+ def __cmp__(self, dict):
+ if isinstance(dict, OrderedDict):
+ ret=cmp(self.__order, dict.__order)
+ if not ret:
+ ret=UserDict.__cmp__(self, dict)
+ return ret
+ else:
+ return UserDict.__cmp__(self, dict)
+
+ def __setitem__(self, key, value):
+ if not self.has_key(key):
+ self.__order.append(key)
+ UserDict.__setitem__(self, key, value)
+
+ def __delitem__(self, key):
+ if self.has_key(key):
+ del self.__order[self.__order.index(key)]
+ UserDict.__delitem__(self, key)
+
+ def clear(self):
+ self.__order=[]
+ UserDict.clear(self)
+
+ def copy(self):
+ if self.__class__ is OrderedDict:
+ return OrderedDict(self)
+ import copy
+ return copy.copy(self)
+
+ def keys(self):
+ return self.__order
+
+ def items(self):
+ return map(lambda x, self=self: (x, self.__getitem__(x)), self.__order)
+
+ def values(self):
+ return map(lambda x, self=self: self.__getitem__(x), self.__order)
+
+ def update(self, dict):
+ for k, v in dict.items():
+ self.__setitem__(k, v)
+
+# vim:ts=4:sw=4:et: