Cache ordered values in ValueList section

This commit is contained in:
Florian Bruhin 2014-05-02 11:46:58 +02:00
parent be86ca03e2
commit 3b015cd5df

View File

@ -137,10 +137,10 @@ class ValueList(Section):
They basically consist of two different SettingValues. They basically consist of two different SettingValues.
Attributes: Attributes:
default: An OrderedDict with the default configuration as strings. layers: An OrderedDict of the config layers.
keytype: The type to use for the key (only used for validating) keytype: The type to use for the key (only used for validating)
valtype: The type to use for the value. valtype: The type to use for the value.
valdict: The "true value" dict. _ordered_value_cache: A ChainMap-like OrderedDict of all values.
""" """
# FIXME how to handle value layers here? # FIXME how to handle value layers here?
@ -154,6 +154,7 @@ class ValueList(Section):
*defaults: A (key, value) list of default values. *defaults: A (key, value) list of default values.
""" """
super().__init__() super().__init__()
self._ordered_value_cache = None
self.keytype = keytype self.keytype = keytype
self.valtype = valtype self.valtype = valtype
self.layers = OrderedDict([ self.layers = OrderedDict([
@ -172,10 +173,11 @@ class ValueList(Section):
This is more expensive than the ChainMap, but we need this for This is more expensive than the ChainMap, but we need this for
iterating/items/etc. when order matters. iterating/items/etc. when order matters.
""" """
d = OrderedDict() if self._ordered_value_cache is None:
for layer in self.layers.values(): self._ordered_value_cache = OrderedDict()
d.update(layer) for layer in self.layers.values():
return d self._ordered_value_cache.update(layer)
return self._ordered_value_cache
def setv(self, layer, key, value, interpolated): def setv(self, layer, key, value, interpolated):
self.keytype.validate(key) self.keytype.validate(key)
@ -185,6 +187,7 @@ class ValueList(Section):
val = SettingValue(self.valtype) val = SettingValue(self.valtype)
val.setv(layer, value, interpolated) val.setv(layer, value, interpolated)
self.layers[layer][key] = val self.layers[layer][key] = val
self._ordered_value_cache = None
def dump_userconfig(self): def dump_userconfig(self):
changed = [] changed = []