From patchwork Tue Apr 7 15:34:07 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 26462 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id 4E2CDC3306 for ; Tue, 7 Apr 2026 15:35:05 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 891AD62E0B; Tue, 7 Apr 2026 17:35:04 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="PMKYYp1X"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 014CC62DD4 for ; Tue, 7 Apr 2026 17:34:59 +0200 (CEST) Received: from killaraus.ideasonboard.com (2001-14ba-703d-e500--2a1.rev.dnainternet.fi [IPv6:2001:14ba:703d:e500::2a1]) by perceval.ideasonboard.com (Postfix) with UTF8SMTPSA id 6A1B678E for ; Tue, 7 Apr 2026 17:33:31 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1775576011; bh=AFlAO62YzdTVI1vHXr1V9D7kB1G0XmGp6wg/1WxMcmQ=; h=From:To:Subject:Date:In-Reply-To:References:From; b=PMKYYp1Xo5jnAlZU3NFIkOrzKmy8tgYPXpoRDyG57vbgR6x6H5dBMLVtIU0OfrkXj 0T308ctZwPOCuHvnvj01YGGJXp8U0on1sYa9TfFolCwVDHeG3Atna2lSRC5r8j3lCT EA1f8oAvN/2QQpPBFuT5Kn268iuNszlDmXBGLKj0= From: Laurent Pinchart To: libcamera-devel@lists.libcamera.org Subject: [PATCH v2 22/42] libcamera: value_node: Add mutable adapters Date: Tue, 7 Apr 2026 18:34:07 +0300 Message-ID: <20260407153427.1825999-23-laurent.pinchart@ideasonboard.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260407153427.1825999-1-laurent.pinchart@ideasonboard.com> References: <20260407153427.1825999-1-laurent.pinchart@ideasonboard.com> MIME-Version: 1.0 X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" 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 Reviewed-by: Barnabás Pőcze --- 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 f8d0329f7670..3bdb537e9eab 100644 --- a/include/libcamera/internal/value_node.h +++ b/include/libcamera/internal/value_node.h @@ -143,17 +143,31 @@ public: } }; - class DictAdapter : public Adapter, - const ValueContainer> + class DictAdapter : public Adapter, + ValueContainer> { public: using key_type = std::string; }; - class ListAdapter : public Adapter, - const ValueContainer> + class ListAdapter : public Adapter, + ValueContainer> + { + }; + + class ConstDictAdapter : public Adapter, + const ValueContainer> + { + public: + using key_type = std::string; + }; + + class ConstListAdapter : public Adapter, + const ValueContainer> { }; #endif /* __DOXYGEN__ */ @@ -211,8 +225,10 @@ public: .set(*this, std::forward(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 6c9e2239165b..5aef72cd29a4 100644 --- a/src/libcamera/value_node.cpp +++ b/src/libcamera/value_node.cpp @@ -335,6 +335,11 @@ template struct ValueNode::Accessor>; template struct ValueNode::Accessor>; #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>; * \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