|  | 
 | class LookupDictionary(dict): | 
 |     """ | 
 |     a dictionary which can lookup value by key, or keys by value | 
 |     """ | 
 |  | 
 |     def __init__(self, items=[]): | 
 |         """items can be a list of pair_lists or a dictionary""" | 
 |         dict.__init__(self, items) | 
 |  | 
 |     def get_keys_for_value(self, value, fail_value=None): | 
 |         """find the key(s) as a list given a value""" | 
 |         list_result = [item[0] for item in self.items() if item[1] == value] | 
 |         if len(list_result) > 0: | 
 |             return list_result | 
 |         return fail_value | 
 |  | 
 |     def get_first_key_for_value(self, value, fail_value=None): | 
 |         """return the first key of this dictionary given the value""" | 
 |         list_result = [item[0] for item in self.items() if item[1] == value] | 
 |         if len(list_result) > 0: | 
 |             return list_result[0] | 
 |         return fail_value | 
 |  | 
 |     def get_value(self, key, fail_value=None): | 
 |         """find the value given a key""" | 
 |         if key in self: | 
 |             return self[key] | 
 |         return fail_value | 
 |  | 
 |  | 
 | class Enum(LookupDictionary): | 
 |  | 
 |     def __init__(self, initial_value=0, items=[]): | 
 |         """items can be a list of pair_lists or a dictionary""" | 
 |         LookupDictionary.__init__(self, items) | 
 |         self.value = initial_value | 
 |  | 
 |     def set_value(self, v): | 
 |         v_typename = typeof(v).__name__ | 
 |         if v_typename == 'str': | 
 |             if str in self: | 
 |                 v = self[v] | 
 |             else: | 
 |                 v = 0 | 
 |         else: | 
 |             self.value = v | 
 |  | 
 |     def get_enum_value(self): | 
 |         return self.value | 
 |  | 
 |     def get_enum_name(self): | 
 |         return self.__str__() | 
 |  | 
 |     def __str__(self): | 
 |         s = self.get_first_key_for_value(self.value, None) | 
 |         if s is None: | 
 |             s = "%#8.8x" % self.value | 
 |         return s | 
 |  | 
 |     def __repr__(self): | 
 |         return self.__str__() |