libcamera: yaml_parser: Add functions to add children

Add YamlObject::add() functions to add children to a list or dictionary
object. This will be used by the YamlParserContext to replace direct
access to YamlObject member variables to decouple the two classes.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Isaac Scott <isaac.scott@ideasonboard.com>
Reviewed-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>
This commit is contained in:
Laurent Pinchart
2026-04-24 18:08:01 +03:00
parent 6657a19247
commit f59a6f6857
2 changed files with 59 additions and 1 deletions
+4 -1
View File
@@ -28,7 +28,7 @@ class YamlObject
{
private:
struct Value {
Value(std::string &&k, std::unique_ptr<YamlObject> &&v)
Value(std::string k, std::unique_ptr<YamlObject> &&v)
: key(std::move(k)), value(std::move(v))
{
}
@@ -197,6 +197,9 @@ public:
bool contains(std::string_view key) const;
const YamlObject &operator[](std::string_view key) const;
YamlObject *add(std::unique_ptr<YamlObject> &&child);
YamlObject *add(std::string key, std::unique_ptr<YamlObject> &&child);
private:
LIBCAMERA_DISABLE_COPY_AND_MOVE(YamlObject)
+55
View File
@@ -438,6 +438,61 @@ const YamlObject &YamlObject::operator[](std::string_view key) const
return *iter->second;
}
/**
* \brief Add a child object to a list
* \param[in] child The child object
*
* Append the \a child object as the last element of this object's children
* list. This object must be empty, in which case it is converted to the
* Type::List type, or be a list. Otherwise, the function returns a nullptr and
* the \a child is not modified.
*
* \return A pointer to the child object if successfully added, nullptr
* otherwise
*/
YamlObject *YamlObject::add(std::unique_ptr<YamlObject> &&child)
{
if (type_ == Type::Empty)
type_ = Type::List;
if (type_ != Type::List)
return nullptr;
Value &elem = list_.emplace_back(std::string{}, std::move(child));
return elem.value.get();
}
/**
* \brief Add a child object to a dictionary
* \param[in] key The dictionary key
* \param[in] child The child object
*
* Add the \a child object with the given \a key to this object's children. This
* object must be empty, in which case it is converted to the Type::Dictionary
* type, or be a dictionary. Otherwise, the function returns a nullptr and the
* \a child is not modified.
*
* Keys are unique. If a child with the same \a key already exists, the function
* returns a nullptr and the \a child is not modified.
*
* \return A pointer to the child object if successfully added, nullptr
* otherwise
*/
YamlObject *YamlObject::add(std::string key, std::unique_ptr<YamlObject> &&child)
{
if (type_ == Type::Empty)
type_ = Type::Dictionary;
if (type_ != Type::Dictionary)
return nullptr;
auto [it, inserted] = dictionary_.try_emplace(std::move(key), child.get());
if (!inserted)
return nullptr;
return list_.emplace_back(it->first, std::move(child)).value.get();
}
#ifndef __DOXYGEN__
class YamlParserContext