[v2,23/42] libcamera: value_node: Add mutable children accessors
diff mbox series

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

Commit Message

Laurent Pinchart April 7, 2026, 3:34 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>
---
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 3bdb537e9eab..d237b2c1e0d6 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 5aef72cd29a4..4c3a5e4d381d 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