libcamera: value_node: Support looking up descendant node by path
Looking up a descendant node based on a path is a common operation. Add a helper function to do so, to avoid loops in the callers. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com> Reviewed-by: Isaac Scott <isaac.scott@ideasonboard.com>
This commit is contained in:
@@ -237,6 +237,7 @@ public:
|
||||
bool contains(std::string_view key) const;
|
||||
ValueNode *at(std::string_view key);
|
||||
const ValueNode &operator[](std::string_view key) const;
|
||||
const ValueNode &operator[](std::initializer_list<std::string_view> path) const;
|
||||
|
||||
ValueNode *add(std::unique_ptr<ValueNode> &&child);
|
||||
ValueNode *add(std::string key, std::unique_ptr<ValueNode> &&child);
|
||||
|
||||
@@ -490,6 +490,29 @@ const ValueNode &ValueNode::operator[](std::string_view key) const
|
||||
return *iter->second;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Retrieve a descendant node by path
|
||||
* \param[in] path The path
|
||||
*
|
||||
* This function retrieves a descendant of a ValueNode by following a \a path.
|
||||
* The path is a list of keys that index nested dictionary nodes. If any node
|
||||
* along the path is not a Dictionary node, an empty node is returned.
|
||||
*
|
||||
* \return The ValueNode corresponding to the \a path
|
||||
*/
|
||||
const ValueNode &ValueNode::operator[](std::initializer_list<std::string_view> path) const
|
||||
{
|
||||
const ValueNode *node = this;
|
||||
|
||||
for (const auto &part : path) {
|
||||
node = &(*node)[part];
|
||||
if (!*node)
|
||||
return empty;
|
||||
}
|
||||
|
||||
return *node;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Add a child node to a list
|
||||
* \param[in] child The child node
|
||||
|
||||
Reference in New Issue
Block a user