Statistics
| Branch: | Tag: | Revision:

root / snf-common / synnefo / lib / ordereddict.py @ 5f6ad491

History | View | Annotate | Download (4.1 kB)

1 597e7eba Christos Stavrakakis
# Copyright (c) 2009 Raymond Hettinger
2 597e7eba Christos Stavrakakis
#
3 597e7eba Christos Stavrakakis
# Permission is hereby granted, free of charge, to any person
4 597e7eba Christos Stavrakakis
# obtaining a copy of this software and associated documentation files
5 597e7eba Christos Stavrakakis
# (the "Software"), to deal in the Software without restriction,
6 597e7eba Christos Stavrakakis
# including without limitation the rights to use, copy, modify, merge,
7 597e7eba Christos Stavrakakis
# publish, distribute, sublicense, and/or sell copies of the Software,
8 597e7eba Christos Stavrakakis
# and to permit persons to whom the Software is furnished to do so,
9 597e7eba Christos Stavrakakis
# subject to the following conditions:
10 597e7eba Christos Stavrakakis
#
11 597e7eba Christos Stavrakakis
#     The above copyright notice and this permission notice shall be
12 597e7eba Christos Stavrakakis
#     included in all copies or substantial portions of the Software.
13 597e7eba Christos Stavrakakis
#
14 597e7eba Christos Stavrakakis
#     THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15 597e7eba Christos Stavrakakis
#     EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
16 597e7eba Christos Stavrakakis
#     OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17 597e7eba Christos Stavrakakis
#     NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
18 597e7eba Christos Stavrakakis
#     HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
19 597e7eba Christos Stavrakakis
#     WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20 597e7eba Christos Stavrakakis
#     FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
21 597e7eba Christos Stavrakakis
#     OTHER DEALINGS IN THE SOFTWARE.
22 597e7eba Christos Stavrakakis
23 597e7eba Christos Stavrakakis
from UserDict import DictMixin
24 597e7eba Christos Stavrakakis
25 597e7eba Christos Stavrakakis
class OrderedDict(dict, DictMixin):
26 597e7eba Christos Stavrakakis
27 597e7eba Christos Stavrakakis
    def __init__(self, *args, **kwds):
28 597e7eba Christos Stavrakakis
        if len(args) > 1:
29 597e7eba Christos Stavrakakis
            raise TypeError('expected at most 1 arguments, got %d' % len(args))
30 597e7eba Christos Stavrakakis
        try:
31 597e7eba Christos Stavrakakis
            self.__end
32 597e7eba Christos Stavrakakis
        except AttributeError:
33 597e7eba Christos Stavrakakis
            self.clear()
34 597e7eba Christos Stavrakakis
        self.update(*args, **kwds)
35 597e7eba Christos Stavrakakis
36 597e7eba Christos Stavrakakis
    def clear(self):
37 597e7eba Christos Stavrakakis
        self.__end = end = []
38 597e7eba Christos Stavrakakis
        end += [None, end, end]         # sentinel node for doubly linked list
39 597e7eba Christos Stavrakakis
        self.__map = {}                 # key --> [key, prev, next]
40 597e7eba Christos Stavrakakis
        dict.clear(self)
41 597e7eba Christos Stavrakakis
42 597e7eba Christos Stavrakakis
    def __setitem__(self, key, value):
43 597e7eba Christos Stavrakakis
        if key not in self:
44 597e7eba Christos Stavrakakis
            end = self.__end
45 597e7eba Christos Stavrakakis
            curr = end[1]
46 597e7eba Christos Stavrakakis
            curr[2] = end[1] = self.__map[key] = [key, curr, end]
47 597e7eba Christos Stavrakakis
        dict.__setitem__(self, key, value)
48 597e7eba Christos Stavrakakis
49 597e7eba Christos Stavrakakis
    def __delitem__(self, key):
50 597e7eba Christos Stavrakakis
        dict.__delitem__(self, key)
51 597e7eba Christos Stavrakakis
        key, prev, next = self.__map.pop(key)
52 597e7eba Christos Stavrakakis
        prev[2] = next
53 597e7eba Christos Stavrakakis
        next[1] = prev
54 597e7eba Christos Stavrakakis
55 597e7eba Christos Stavrakakis
    def __iter__(self):
56 597e7eba Christos Stavrakakis
        end = self.__end
57 597e7eba Christos Stavrakakis
        curr = end[2]
58 597e7eba Christos Stavrakakis
        while curr is not end:
59 597e7eba Christos Stavrakakis
            yield curr[0]
60 597e7eba Christos Stavrakakis
            curr = curr[2]
61 597e7eba Christos Stavrakakis
62 597e7eba Christos Stavrakakis
    def __reversed__(self):
63 597e7eba Christos Stavrakakis
        end = self.__end
64 597e7eba Christos Stavrakakis
        curr = end[1]
65 597e7eba Christos Stavrakakis
        while curr is not end:
66 597e7eba Christos Stavrakakis
            yield curr[0]
67 597e7eba Christos Stavrakakis
            curr = curr[1]
68 597e7eba Christos Stavrakakis
69 597e7eba Christos Stavrakakis
    def popitem(self, last=True):
70 597e7eba Christos Stavrakakis
        if not self:
71 597e7eba Christos Stavrakakis
            raise KeyError('dictionary is empty')
72 597e7eba Christos Stavrakakis
        if last:
73 597e7eba Christos Stavrakakis
            key = reversed(self).next()
74 597e7eba Christos Stavrakakis
        else:
75 597e7eba Christos Stavrakakis
            key = iter(self).next()
76 597e7eba Christos Stavrakakis
        value = self.pop(key)
77 597e7eba Christos Stavrakakis
        return key, value
78 597e7eba Christos Stavrakakis
79 597e7eba Christos Stavrakakis
    def __reduce__(self):
80 597e7eba Christos Stavrakakis
        items = [[k, self[k]] for k in self]
81 597e7eba Christos Stavrakakis
        tmp = self.__map, self.__end
82 597e7eba Christos Stavrakakis
        del self.__map, self.__end
83 597e7eba Christos Stavrakakis
        inst_dict = vars(self).copy()
84 597e7eba Christos Stavrakakis
        self.__map, self.__end = tmp
85 597e7eba Christos Stavrakakis
        if inst_dict:
86 597e7eba Christos Stavrakakis
            return (self.__class__, (items,), inst_dict)
87 597e7eba Christos Stavrakakis
        return self.__class__, (items,)
88 597e7eba Christos Stavrakakis
89 597e7eba Christos Stavrakakis
    def keys(self):
90 597e7eba Christos Stavrakakis
        return list(self)
91 597e7eba Christos Stavrakakis
92 597e7eba Christos Stavrakakis
    setdefault = DictMixin.setdefault
93 597e7eba Christos Stavrakakis
    update = DictMixin.update
94 597e7eba Christos Stavrakakis
    pop = DictMixin.pop
95 597e7eba Christos Stavrakakis
    values = DictMixin.values
96 597e7eba Christos Stavrakakis
    items = DictMixin.items
97 597e7eba Christos Stavrakakis
    iterkeys = DictMixin.iterkeys
98 597e7eba Christos Stavrakakis
    itervalues = DictMixin.itervalues
99 597e7eba Christos Stavrakakis
    iteritems = DictMixin.iteritems
100 597e7eba Christos Stavrakakis
101 597e7eba Christos Stavrakakis
    def __repr__(self):
102 597e7eba Christos Stavrakakis
        if not self:
103 597e7eba Christos Stavrakakis
            return '%s()' % (self.__class__.__name__,)
104 597e7eba Christos Stavrakakis
        return '%s(%r)' % (self.__class__.__name__, self.items())
105 597e7eba Christos Stavrakakis
106 597e7eba Christos Stavrakakis
    def copy(self):
107 597e7eba Christos Stavrakakis
        return self.__class__(self)
108 597e7eba Christos Stavrakakis
109 597e7eba Christos Stavrakakis
    @classmethod
110 597e7eba Christos Stavrakakis
    def fromkeys(cls, iterable, value=None):
111 597e7eba Christos Stavrakakis
        d = cls()
112 597e7eba Christos Stavrakakis
        for key in iterable:
113 597e7eba Christos Stavrakakis
            d[key] = value
114 597e7eba Christos Stavrakakis
        return d
115 597e7eba Christos Stavrakakis
116 597e7eba Christos Stavrakakis
    def __eq__(self, other):
117 597e7eba Christos Stavrakakis
        if isinstance(other, OrderedDict):
118 597e7eba Christos Stavrakakis
            if len(self) != len(other):
119 597e7eba Christos Stavrakakis
                return False
120 597e7eba Christos Stavrakakis
            for p, q in  zip(self.items(), other.items()):
121 597e7eba Christos Stavrakakis
                if p != q:
122 597e7eba Christos Stavrakakis
                    return False
123 597e7eba Christos Stavrakakis
            return True
124 597e7eba Christos Stavrakakis
        return dict.__eq__(self, other)
125 597e7eba Christos Stavrakakis
126 597e7eba Christos Stavrakakis
    def __ne__(self, other):
127 597e7eba Christos Stavrakakis
        return not self == other