diff options
Diffstat (limited to 'codegen/vulkan/scripts/spec_tools/data_structures.py')
-rw-r--r-- | codegen/vulkan/scripts/spec_tools/data_structures.py | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/codegen/vulkan/scripts/spec_tools/data_structures.py b/codegen/vulkan/scripts/spec_tools/data_structures.py new file mode 100644 index 00000000..f2808cf1 --- /dev/null +++ b/codegen/vulkan/scripts/spec_tools/data_structures.py @@ -0,0 +1,58 @@ +#!/usr/bin/python3 -i +# +# Copyright (c) 2019 Collabora, Ltd. +# +# SPDX-License-Identifier: Apache-2.0 +# +# Author(s): Ryan Pavlik <ryan.pavlik@collabora.com> +"""Provides general-purpose data structures.""" + + +class DictOfStringSets: + """A dictionary where the values are sets of strings. + + Has some convenience functions to allow easier maintenance via + the .add method.""" + + def __init__(self, d=None): + self.d = {} + if d: + for k, v in d.items(): + self.add(k, v) + + def __getitem__(self, k): + return self.d[k] + + def __contains__(self, k): + return k in self.d + + def get(self, k, default=None): + return self.d.get(k, default) + + def get_dict(self): + return self.d + + def items(self): + """Return an iterator like dict().items().""" + return self.d.items() + + def keys(self): + """Return an iterator over keys.""" + return self.d.keys() + + def values(self): + """Return an iterator over values.""" + return self.d.values() + + def add_key(self, k): + """Ensure the set for the given key exists.""" + if k not in self.d: + self.d[k] = set() + + def add(self, k, v): + self.add_key(k) + if isinstance(v, str): + v = (v, ) + if not isinstance(v, set): + v = set(v) + self.d[k].update(v) |