xref: /aosp_15_r20/external/vulkan-headers/registry/spec_tools/util.py (revision 902771965e4c6d39c75c62130a6a330c08b024db)
1*90277196SAndroid Build Coastguard Worker"""Utility functions not closely tied to other spec_tools types."""
2*90277196SAndroid Build Coastguard Worker# Copyright (c) 2018-2019 Collabora, Ltd.
3*90277196SAndroid Build Coastguard Worker# Copyright 2013-2024 The Khronos Group Inc.
4*90277196SAndroid Build Coastguard Worker#
5*90277196SAndroid Build Coastguard Worker# SPDX-License-Identifier: Apache-2.0
6*90277196SAndroid Build Coastguard Worker
7*90277196SAndroid Build Coastguard Worker
8*90277196SAndroid Build Coastguard Workerdef getElemName(elem, default=None):
9*90277196SAndroid Build Coastguard Worker    """Get the name associated with an element, either a name child or name attribute."""
10*90277196SAndroid Build Coastguard Worker    name_elem = elem.find('name')
11*90277196SAndroid Build Coastguard Worker    if name_elem is not None:
12*90277196SAndroid Build Coastguard Worker        return name_elem.text
13*90277196SAndroid Build Coastguard Worker    # Fallback if there is no child.
14*90277196SAndroid Build Coastguard Worker    return elem.get('name', default)
15*90277196SAndroid Build Coastguard Worker
16*90277196SAndroid Build Coastguard Worker
17*90277196SAndroid Build Coastguard Workerdef getElemType(elem, default=None):
18*90277196SAndroid Build Coastguard Worker    """Get the type associated with an element, either a type child or type attribute."""
19*90277196SAndroid Build Coastguard Worker    type_elem = elem.find('type')
20*90277196SAndroid Build Coastguard Worker    if type_elem is not None:
21*90277196SAndroid Build Coastguard Worker        return type_elem.text
22*90277196SAndroid Build Coastguard Worker    # Fallback if there is no child.
23*90277196SAndroid Build Coastguard Worker    return elem.get('type', default)
24*90277196SAndroid Build Coastguard Worker
25*90277196SAndroid Build Coastguard Worker
26*90277196SAndroid Build Coastguard Workerdef findFirstWithPredicate(collection, pred):
27*90277196SAndroid Build Coastguard Worker    """Return the first element that satisfies the predicate, or None if none exist.
28*90277196SAndroid Build Coastguard Worker
29*90277196SAndroid Build Coastguard Worker    NOTE: Some places where this is used might be better served by changing to a dictionary.
30*90277196SAndroid Build Coastguard Worker    """
31*90277196SAndroid Build Coastguard Worker    for elt in collection:
32*90277196SAndroid Build Coastguard Worker        if pred(elt):
33*90277196SAndroid Build Coastguard Worker            return elt
34*90277196SAndroid Build Coastguard Worker    return None
35*90277196SAndroid Build Coastguard Worker
36*90277196SAndroid Build Coastguard Worker
37*90277196SAndroid Build Coastguard Workerdef findNamedElem(elems, name):
38*90277196SAndroid Build Coastguard Worker    """Traverse a collection of elements with 'name' nodes or attributes, looking for and returning one with the right name.
39*90277196SAndroid Build Coastguard Worker
40*90277196SAndroid Build Coastguard Worker    NOTE: Many places where this is used might be better served by changing to a dictionary.
41*90277196SAndroid Build Coastguard Worker    """
42*90277196SAndroid Build Coastguard Worker    return findFirstWithPredicate(elems, lambda elem: getElemName(elem) == name)
43*90277196SAndroid Build Coastguard Worker
44*90277196SAndroid Build Coastguard Worker
45*90277196SAndroid Build Coastguard Workerdef findTypedElem(elems, typename):
46*90277196SAndroid Build Coastguard Worker    """Traverse a collection of elements with 'type' nodes or attributes, looking for and returning one with the right typename.
47*90277196SAndroid Build Coastguard Worker
48*90277196SAndroid Build Coastguard Worker    NOTE: Many places where this is used might be better served by changing to a dictionary.
49*90277196SAndroid Build Coastguard Worker    """
50*90277196SAndroid Build Coastguard Worker    return findFirstWithPredicate(elems, lambda elem: getElemType(elem) == typename)
51*90277196SAndroid Build Coastguard Worker
52*90277196SAndroid Build Coastguard Worker
53*90277196SAndroid Build Coastguard Workerdef findNamedObject(collection, name):
54*90277196SAndroid Build Coastguard Worker    """Traverse a collection of elements with 'name' attributes, looking for and returning one with the right name.
55*90277196SAndroid Build Coastguard Worker
56*90277196SAndroid Build Coastguard Worker    NOTE: Many places where this is used might be better served by changing to a dictionary.
57*90277196SAndroid Build Coastguard Worker    """
58*90277196SAndroid Build Coastguard Worker    return findFirstWithPredicate(collection, lambda elt: elt.name == name)
59