@@ -228,9 +228,11 @@ public:
ConstDictAdapter asDict() const { return ConstDictAdapter{ list_ }; }
ConstListAdapter asList() const { return ConstListAdapter{ list_ }; }
+ ValueNode *at(std::size_t index);
const ValueNode &operator[](std::size_t index) const;
bool contains(std::string_view key) const;
+ ValueNode *at(std::string_view key);
const ValueNode &operator[](std::string_view key) const;
ValueNode *add(std::unique_ptr<ValueNode> child);
@@ -384,6 +384,24 @@ template struct ValueNode::Accessor<std::vector<std::string>>;
* \return An adapter of unspecified type compatible with range-based for loops
*/
+/**
+ * \brief Retrieve the element from list ValueNode by index
+ * \param[in] index The element index
+ *
+ * This function retrieves an element of the ValueNode. Only ValueNode
+ * instances of List type associate elements with index, calling this function
+ * on other types of instances or with an invalid index returns a null pointer.
+ *
+ * \return The ValueNode as an element of the list
+ */
+ValueNode *ValueNode::at(std::size_t index)
+{
+ if (type_ != Type::List || index >= size())
+ return nullptr;
+
+ return list_[index].value.get();
+}
+
/**
* \brief Retrieve the element from list ValueNode by index
* \param[in] index The element index
@@ -419,6 +437,29 @@ bool ValueNode::contains(std::string_view key) const
return dictionary_.find(key) != dictionary_.end();
}
+/**
+ * \brief Retrieve a member by key from the dictionary
+ * \param[in] key The element key
+ *
+ * This function retrieves a member of a ValueNode by \a key. Only ValueNode
+ * instances of Dictionary type associate elements with keys, calling this
+ * function on other types of instances or with a nonexistent key returns a null
+ * pointer.
+ *
+ * \return The ValueNode corresponding to the \a key member
+ */
+ValueNode *ValueNode::at(std::string_view key)
+{
+ if (type_ != Type::Dictionary)
+ return nullptr;
+
+ auto iter = dictionary_.find(key);
+ if (iter == dictionary_.end())
+ return nullptr;
+
+ return iter->second;
+}
+
/**
* \brief Retrieve a member by key from the dictionary
* \param[in] key The element key
At two at() functions that return mutable pointer to child nodes, based on an index for lists and a key for dictionaries. The API differs from const children accessors that use operator[] and return a reference in order to allow better error handling: while the const accessors return a reference to a global instance of an empty ValueNode when the requested child doesn't exist, a mutable accessor can't do the same without allowing modifying the empty global instance. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> --- include/libcamera/internal/value_node.h | 2 ++ src/libcamera/value_node.cpp | 41 +++++++++++++++++++++++++ 2 files changed, 43 insertions(+)