libcamera: value_node: Add mutable children accessors

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>
This commit is contained in:
Laurent Pinchart
2025-10-17 21:53:34 +03:00
parent b25556c691
commit eafc366012
2 changed files with 44 additions and 0 deletions

View File

@@ -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);

View File

@@ -386,6 +386,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
@@ -421,6 +440,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