[27/36] libcamera: value_node: Add mutable adapters
diff mbox series

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

Commit Message

Laurent Pinchart Jan. 13, 2026, 12:07 a.m. UTC
The ValueNode class was initially designed to store read-only property
trees. It is useful to also provide mutable access. Add non-const
adapters and iterators and adapters. This allows obtaining a mutable
ValueNode instance when traversing a tree.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 include/libcamera/internal/value_node.h | 32 ++++++++++++++++++-------
 src/libcamera/value_node.cpp            | 10 ++++++++
 2 files changed, 34 insertions(+), 8 deletions(-)

Comments

Barnabás Pőcze Jan. 14, 2026, 11:01 a.m. UTC | #1
2026. 01. 13. 1:07 keltezéssel, Laurent Pinchart írta:
> The ValueNode class was initially designed to store read-only property
> trees. It is useful to also provide mutable access. Add non-const
> adapters and iterators and adapters. This allows obtaining a mutable
> ValueNode instance when traversing a tree.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

Reviewed-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>


>   include/libcamera/internal/value_node.h | 32 ++++++++++++++++++-------
>   src/libcamera/value_node.cpp            | 10 ++++++++
>   2 files changed, 34 insertions(+), 8 deletions(-)
> 
> diff --git a/include/libcamera/internal/value_node.h b/include/libcamera/internal/value_node.h
> index dd45859f3501..56d200e1cf27 100644
> --- a/include/libcamera/internal/value_node.h
> +++ b/include/libcamera/internal/value_node.h
> @@ -143,17 +143,31 @@ public:
>   		}
>   	};
>   
> -	class DictAdapter : public Adapter<DictIterator<const ValueNode,
> -							ValueContainer::const_iterator>,
> -					   const ValueContainer>
> +	class DictAdapter : public Adapter<DictIterator<ValueNode,
> +							ValueContainer::iterator>,
> +					   ValueContainer>
>   	{
>   	public:
>   		using key_type = std::string;
>   	};
>   
> -	class ListAdapter : public Adapter<ListIterator<const ValueNode,
> -							ValueContainer::const_iterator>,
> -					   const ValueContainer>
> +	class ListAdapter : public Adapter<ListIterator<ValueNode,
> +							ValueContainer::iterator>,
> +					   ValueContainer>
> +	{
> +	};
> +
> +	class ConstDictAdapter : public Adapter<DictIterator<const ValueNode,
> +							     ValueContainer::const_iterator>,
> +						const ValueContainer>
> +	{
> +	public:
> +		using key_type = std::string;
> +	};
> +
> +	class ConstListAdapter : public Adapter<ListIterator<const ValueNode,
> +							     ValueContainer::const_iterator>,
> +						const ValueContainer>
>   	{
>   	};
>   #endif /* __DOXYGEN__ */
> @@ -209,8 +223,10 @@ public:
>   		return Accessor<std::remove_reference_t<T>>{}.set(*this, std::forward<T>(value));
>   	}
>   
> -	DictAdapter asDict() const { return DictAdapter{ list_ }; }
> -	ListAdapter asList() const { return ListAdapter{ list_ }; }
> +	DictAdapter asDict() { return DictAdapter{ list_ }; }
> +	ListAdapter asList() { return ListAdapter{ list_ }; }
> +	ConstDictAdapter asDict() const { return ConstDictAdapter{ list_ }; }
> +	ConstListAdapter asList() const { return ConstListAdapter{ list_ }; }
>   
>   	const ValueNode &operator[](std::size_t index) const;
>   
> diff --git a/src/libcamera/value_node.cpp b/src/libcamera/value_node.cpp
> index b8f0c6d5cbc4..3c56b47bf79d 100644
> --- a/src/libcamera/value_node.cpp
> +++ b/src/libcamera/value_node.cpp
> @@ -335,6 +335,11 @@ template struct ValueNode::Accessor<std::vector<uint32_t>>;
>   template struct ValueNode::Accessor<std::vector<std::string>>;
>   #endif /* __DOXYGEN__ */
>   
> +/**
> + * \fn ValueNode::asDict()
> + * \copydoc ValueNode::asDict() const
> + */
> +
>   /**
>    * \fn ValueNode::asDict() const
>    * \brief Wrap a dictionary ValueNode in an adapter that exposes iterators
> @@ -355,6 +360,11 @@ template struct ValueNode::Accessor<std::vector<std::string>>;
>    * \return An adapter of unspecified type compatible with range-based for loops
>    */
>   
> +/**
> + * \fn ValueNode::asList()
> + * \copydoc ValueNode::asList() const
> + */
> +
>   /**
>    * \fn ValueNode::asList() const
>    * \brief Wrap a list ValueNode in an adapter that exposes iterators

Patch
diff mbox series

diff --git a/include/libcamera/internal/value_node.h b/include/libcamera/internal/value_node.h
index dd45859f3501..56d200e1cf27 100644
--- a/include/libcamera/internal/value_node.h
+++ b/include/libcamera/internal/value_node.h
@@ -143,17 +143,31 @@  public:
 		}
 	};
 
-	class DictAdapter : public Adapter<DictIterator<const ValueNode,
-							ValueContainer::const_iterator>,
-					   const ValueContainer>
+	class DictAdapter : public Adapter<DictIterator<ValueNode,
+							ValueContainer::iterator>,
+					   ValueContainer>
 	{
 	public:
 		using key_type = std::string;
 	};
 
-	class ListAdapter : public Adapter<ListIterator<const ValueNode,
-							ValueContainer::const_iterator>,
-					   const ValueContainer>
+	class ListAdapter : public Adapter<ListIterator<ValueNode,
+							ValueContainer::iterator>,
+					   ValueContainer>
+	{
+	};
+
+	class ConstDictAdapter : public Adapter<DictIterator<const ValueNode,
+							     ValueContainer::const_iterator>,
+						const ValueContainer>
+	{
+	public:
+		using key_type = std::string;
+	};
+
+	class ConstListAdapter : public Adapter<ListIterator<const ValueNode,
+							     ValueContainer::const_iterator>,
+						const ValueContainer>
 	{
 	};
 #endif /* __DOXYGEN__ */
@@ -209,8 +223,10 @@  public:
 		return Accessor<std::remove_reference_t<T>>{}.set(*this, std::forward<T>(value));
 	}
 
-	DictAdapter asDict() const { return DictAdapter{ list_ }; }
-	ListAdapter asList() const { return ListAdapter{ list_ }; }
+	DictAdapter asDict() { return DictAdapter{ list_ }; }
+	ListAdapter asList() { return ListAdapter{ list_ }; }
+	ConstDictAdapter asDict() const { return ConstDictAdapter{ list_ }; }
+	ConstListAdapter asList() const { return ConstListAdapter{ list_ }; }
 
 	const ValueNode &operator[](std::size_t index) const;
 
diff --git a/src/libcamera/value_node.cpp b/src/libcamera/value_node.cpp
index b8f0c6d5cbc4..3c56b47bf79d 100644
--- a/src/libcamera/value_node.cpp
+++ b/src/libcamera/value_node.cpp
@@ -335,6 +335,11 @@  template struct ValueNode::Accessor<std::vector<uint32_t>>;
 template struct ValueNode::Accessor<std::vector<std::string>>;
 #endif /* __DOXYGEN__ */
 
+/**
+ * \fn ValueNode::asDict()
+ * \copydoc ValueNode::asDict() const
+ */
+
 /**
  * \fn ValueNode::asDict() const
  * \brief Wrap a dictionary ValueNode in an adapter that exposes iterators
@@ -355,6 +360,11 @@  template struct ValueNode::Accessor<std::vector<std::string>>;
  * \return An adapter of unspecified type compatible with range-based for loops
  */
 
+/**
+ * \fn ValueNode::asList()
+ * \copydoc ValueNode::asList() const
+ */
+
 /**
  * \fn ValueNode::asList() const
  * \brief Wrap a list ValueNode in an adapter that exposes iterators