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:
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user