Merge ktlim@zizzer.eecs.umich.edu:/bk/m5
[gem5.git] / python / m5 / multidict.py
1 __all__ = [ 'multidict' ]
2
3 class multidict(object):
4 __nodefault = object()
5 def __init__(self, parent = {}, **kwargs):
6 self.dict = dict(**kwargs)
7 self.parent = parent
8 self.deleted = {}
9
10 def __str__(self):
11 return str(dict(self.items()))
12
13 def __repr__(self):
14 return `dict(self.items())`
15
16 def __contains__(self, key):
17 return self.dict.has_key(key) or self.parent.has_key(key)
18
19 def __delitem__(self, key):
20 try:
21 del self.dict[key]
22 except KeyError, e:
23 if key in self.parent:
24 self.deleted[key] = True
25 else:
26 raise KeyError, e
27
28 def __setitem__(self, key, value):
29 self.deleted.pop(key, False)
30 self.dict[key] = value
31
32 def __getitem__(self, key):
33 try:
34 return self.dict[key]
35 except KeyError, e:
36 if not self.deleted.get(key, False) and key in self.parent:
37 return self.parent[key]
38 else:
39 raise KeyError, e
40
41 def __len__(self):
42 return len(self.dict) + len(self.parent)
43
44 def next(self):
45 for key,value in self.dict.items():
46 yield key,value
47
48 if self.parent:
49 for key,value in self.parent.next():
50 if key not in self.dict and key not in self.deleted:
51 yield key,value
52
53 def has_key(self, key):
54 return key in self
55
56 def iteritems(self):
57 for item in self.next():
58 yield item
59
60 def items(self):
61 return [ item for item in self.next() ]
62
63 def iterkeys(self):
64 for key,value in self.next():
65 yield key
66
67 def keys(self):
68 return [ key for key,value in self.next() ]
69
70 def itervalues(self):
71 for key,value in self.next():
72 yield value
73
74 def values(self):
75 return [ value for key,value in self.next() ]
76
77 def get(self, key, default=__nodefault):
78 try:
79 return self[key]
80 except KeyError, e:
81 if default != self.__nodefault:
82 return default
83 else:
84 raise KeyError, e
85
86 def setdefault(self, key, default):
87 try:
88 return self[key]
89 except KeyError:
90 self.deleted.pop(key, False)
91 self.dict[key] = default
92 return default
93
94 def _dump(self):
95 print 'multidict dump'
96 node = self
97 while isinstance(node, multidict):
98 print ' ', node.dict
99 node = node.parent
100
101 def _dumpkey(self, key):
102 values = []
103 node = self
104 while isinstance(node, multidict):
105 if key in node.dict:
106 values.append(node.dict[key])
107 node = node.parent
108 print key, values
109
110 if __name__ == '__main__':
111 test1 = multidict()
112 test2 = multidict(test1)
113 test3 = multidict(test2)
114 test4 = multidict(test3)
115
116 test1['a'] = 'test1_a'
117 test1['b'] = 'test1_b'
118 test1['c'] = 'test1_c'
119 test1['d'] = 'test1_d'
120 test1['e'] = 'test1_e'
121
122 test2['a'] = 'test2_a'
123 del test2['b']
124 test2['c'] = 'test2_c'
125 del test1['a']
126
127 test2.setdefault('f', multidict)
128
129 print 'test1>', test1.items()
130 print 'test2>', test2.items()
131 #print test1['a']
132 print test1['b']
133 print test1['c']
134 print test1['d']
135 print test1['e']
136
137 print test2['a']
138 #print test2['b']
139 print test2['c']
140 print test2['d']
141 print test2['e']
142
143 for key in test2.iterkeys():
144 print key
145
146 test2.get('g', 'foo')
147 #test2.get('b')
148 test2.get('b', 'bar')
149 test2.setdefault('b', 'blah')
150 print test1
151 print test2
152 print `test2`
153
154 print len(test2)
155
156 test3['a'] = [ 0, 1, 2, 3 ]
157
158 print test4