@@ -235,6 +235,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);
@@ -487,6 +487,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
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> --- include/libcamera/internal/value_node.h | 1 + src/libcamera/value_node.cpp | 23 +++++++++++++++++++++++ 2 files changed, 24 insertions(+)