{"id":26542,"url":"https://patchwork.libcamera.org/api/patches/26542/?format=json","web_url":"https://patchwork.libcamera.org/patch/26542/","project":{"id":1,"url":"https://patchwork.libcamera.org/api/projects/1/?format=json","name":"libcamera","link_name":"libcamera","list_id":"libcamera_core","list_email":"libcamera-devel@lists.libcamera.org","web_url":"","scm_url":"","webscm_url":""},"msgid":"<20260423230059.3180987-21-laurent.pinchart@ideasonboard.com>","date":"2026-04-23T23:00:42","name":"[v3,20/37] libcamera: value_node: Add functions to erase child nodes","commit_ref":null,"pull_url":null,"state":"accepted","archived":false,"hash":"e0e6051153ed2acc2ef8e34080db78ea5ea536b6","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/?format=json","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"delegate":null,"mbox":"https://patchwork.libcamera.org/patch/26542/mbox/","series":[{"id":5883,"url":"https://patchwork.libcamera.org/api/series/5883/?format=json","web_url":"https://patchwork.libcamera.org/project/libcamera/list/?series=5883","date":"2026-04-23T23:00:22","name":"libcamera: Global configuration file improvements","version":3,"mbox":"https://patchwork.libcamera.org/series/5883/mbox/"}],"comments":"https://patchwork.libcamera.org/api/patches/26542/comments/","check":"pending","checks":"https://patchwork.libcamera.org/api/patches/26542/checks/","tags":{},"headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id C9785BDCB5\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu, 23 Apr 2026 23:01:44 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 524D962FD5;\n\tFri, 24 Apr 2026 01:01:44 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 4675D62F7B\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 24 Apr 2026 01:01:29 +0200 (CEST)","from killaraus.ideasonboard.com\n\t(2001-14ba-703d-e500--2a1.rev.dnainternet.fi\n\t[IPv6:2001:14ba:703d:e500::2a1])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id BCE6D802\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 24 Apr 2026 00:59:49 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"tvMHLga3\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1776985189;\n\tbh=WzSSponFlqQsxWhUEDvIaRQGV4bNbY+du6Wbsgii0aA=;\n\th=From:To:Subject:Date:In-Reply-To:References:From;\n\tb=tvMHLga3g98UUM5VeQPPDl56phhlNWUo/+lIxUQIxOzI1DaC5oP36d+kEjU8r77jl\n\tejyShoXFTdh/u711GExDh53Bn+8dc91KPJfezR8lFHJtXiypczzaJkkMG9VB8vrFQj\n\tZ8yHcTAK26SWjhlA6xowSbK981Zp6pD18pQaTKj8=","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"libcamera-devel@lists.libcamera.org","Subject":"[PATCH v3 20/37] libcamera: value_node: Add functions to erase child\n\tnodes","Date":"Fri, 24 Apr 2026 02:00:42 +0300","Message-ID":"<20260423230059.3180987-21-laurent.pinchart@ideasonboard.com>","X-Mailer":"git-send-email 2.53.0","In-Reply-To":"<20260423230059.3180987-1-laurent.pinchart@ideasonboard.com>","References":"<20260423230059.3180987-1-laurent.pinchart@ideasonboard.com>","MIME-Version":"1.0","Content-Transfer-Encoding":"8bit","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"},"content":"There will be a need to erase child nodes when implementing support for\noverriding configuration options. Add two erase() functions to the\nValueNode class, mimicking the add() API.\n\nMore erase() overloads could be added, for instance taking iterators as\nparameters, to improve efficiency. This should be considered later, when\nusage of the ValueNode class will expand, based on the actual usage\npatterns.\n\nSigned-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\nReviewed-by: Isaac Scott <isaac.scott@ideasonboard.com>\n---\nChanges since v2:\n\n- Use std::string_view() for first overload\n- Add todo comment\n---\n include/libcamera/internal/value_node.h |  3 ++\n src/libcamera/value_node.cpp            | 54 +++++++++++++++++++++++++\n 2 files changed, 57 insertions(+)","diff":"diff --git a/include/libcamera/internal/value_node.h b/include/libcamera/internal/value_node.h\nindex ccae69e25a82..cab14943c03f 100644\n--- a/include/libcamera/internal/value_node.h\n+++ b/include/libcamera/internal/value_node.h\n@@ -244,6 +244,9 @@ public:\n \tValueNode *add(std::initializer_list<std::string_view> path,\n \t\t       std::unique_ptr<ValueNode> &&child);\n \n+\tvoid erase(std::string_view key);\n+\tvoid erase(std::initializer_list<std::string_view> path);\n+\n private:\n \tLIBCAMERA_DISABLE_COPY_AND_MOVE(ValueNode)\n \ndiff --git a/src/libcamera/value_node.cpp b/src/libcamera/value_node.cpp\nindex 6ab11009fccc..2c875db366e7 100644\n--- a/src/libcamera/value_node.cpp\n+++ b/src/libcamera/value_node.cpp\n@@ -620,4 +620,58 @@ ValueNode *ValueNode::add(std::initializer_list<std::string_view> path,\n \treturn node;\n }\n \n+/**\n+ * \\brief Erase a child node in a dictionary\n+ * \\param[in] key The dictionary key\n+ *\n+ * Erase the child node referenced by \\a key in a dictionary node. If the \\a\n+ * key does not exist, or if this node is not a dictionary, the function\n+ * returns without performing any operation.\n+ */\n+void ValueNode::erase(std::string_view key)\n+{\n+\tauto node = dictionary_.find(key);\n+\tif (node == dictionary_.end())\n+\t\treturn;\n+\n+\t/* \\todo Not an ideal algorithm */\n+\tfor (auto iter = list_.begin(); iter != list_.end(); ++iter) {\n+\t\tif (iter->value.get() != node->second)\n+\t\t\tcontinue;\n+\n+\t\tlist_.erase(iter);\n+\t\tbreak;\n+\t}\n+\n+\tdictionary_.erase(node);\n+}\n+\n+/**\n+ * \\brief Erase the child node at the given path\n+ * \\param[in] path The path\n+ *\n+ * Erase the child node at the given \\a path. If no child node exists for the\n+ * path, the function returns without performing any operation.\n+ */\n+void ValueNode::erase(std::initializer_list<std::string_view> path)\n+{\n+\tif (!path.size())\n+\t\treturn;\n+\n+\tValueNode *node = this;\n+\n+\tfor (const auto [i, name] : utils::enumerate(path)) {\n+\t\tif (i == path.size() - 1) {\n+\t\t\tnode->erase(name);\n+\t\t\treturn;\n+\t\t}\n+\n+\t\tauto iter = node->dictionary_.find(name);\n+\t\tif (iter == node->dictionary_.end())\n+\t\t\treturn;\n+\n+\t\tnode = iter->second;\n+\t}\n+}\n+\n } /* namespace libcamera */\n","prefixes":["v3","20/37"]}