[v3,17/37] libcamera: value_node: Add mutable children accessors
diff mbox series

Message ID 20260423230059.3180987-18-laurent.pinchart@ideasonboard.com
State New
Headers show
Series
  • libcamera: Global configuration file improvements
Related show

Commit Message

Laurent Pinchart April 23, 2026, 11 p.m. UTC
Add 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>
Reviewed-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>
Reviewed-by: Isaac Scott <isaac.scott@ideasonboard.com>
---
Changes since v1:

- Improve documentation
- Fix typo in commit message
---
 include/libcamera/internal/value_node.h |  2 ++
 src/libcamera/value_node.cpp            | 42 +++++++++++++++++++++++++
 2 files changed, 44 insertions(+)

Patch
diff mbox series

diff --git a/include/libcamera/internal/value_node.h b/include/libcamera/internal/value_node.h
index b51d2f4b610b..da68a74c5e14 100644
--- a/include/libcamera/internal/value_node.h
+++ b/include/libcamera/internal/value_node.h
@@ -230,9 +230,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);
diff --git a/src/libcamera/value_node.cpp b/src/libcamera/value_node.cpp
index e2dd455d3f1e..fbf9ac470359 100644
--- a/src/libcamera/value_node.cpp
+++ b/src/libcamera/value_node.cpp
@@ -384,6 +384,25 @@  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 an index, calling this
+ * function on other types of instances or with an invalid index returns a null
+ * pointer.
+ *
+ * \return The ValueNode corresponding to \a index
+ */
+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 +438,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