{"id":26461,"url":"https://patchwork.libcamera.org/api/patches/26461/?format=json","web_url":"https://patchwork.libcamera.org/patch/26461/","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":"<20260407153427.1825999-22-laurent.pinchart@ideasonboard.com>","date":"2026-04-07T15:34:06","name":"[v2,21/42] libcamera: value_node: Rework templates to prepare for mutable views","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"737cf40945077caca8d10412435041079cb33f08","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/26461/mbox/","series":[{"id":5873,"url":"https://patchwork.libcamera.org/api/series/5873/?format=json","web_url":"https://patchwork.libcamera.org/project/libcamera/list/?series=5873","date":"2026-04-07T15:33:45","name":"libcamera: Global configuration file improvements","version":2,"mbox":"https://patchwork.libcamera.org/series/5873/mbox/"}],"comments":"https://patchwork.libcamera.org/api/patches/26461/comments/","check":"pending","checks":"https://patchwork.libcamera.org/api/patches/26461/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 40C8EC3305\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue,  7 Apr 2026 15:35:04 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 4866262E09;\n\tTue,  7 Apr 2026 17:35:03 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id A7D2462DF5\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue,  7 Apr 2026 17:34:57 +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 UTF8SMTPSA id 2907278E\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue,  7 Apr 2026 17:33:30 +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=\"BY/0tMOm\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1775576010;\n\tbh=EfQ3ejPh+as/ini3dHIUSM0q8G1dLsiYvXruH2QZn3U=;\n\th=From:To:Subject:Date:In-Reply-To:References:From;\n\tb=BY/0tMOmMdi0sBfQr8jMvmywFybUOscxJSIBJlJ2D75C7LZIpvggG3OLU2luBjKbf\n\t2bp9SvDwfvjvG3L0+vYTQNKGkqijf3fawLoX2hIHvjD5VkM0c1RecwPD/OLqNEb+Ip\n\t9HPSIcgGHLUP5JxzCWzhssJXraPi7vB6os/Yr0j8=","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"libcamera-devel@lists.libcamera.org","Subject":"[PATCH v2 21/42] libcamera: value_node: Rework templates to prepare\n\tfor mutable views","Date":"Tue,  7 Apr 2026 18:34:06 +0300","Message-ID":"<20260407153427.1825999-22-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","Content-Type":"text/plain; charset=UTF-8","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":"ValueNode provides adapter classes to expose the object as an iteratable\nlist or dictionary. The Iterator and Adapter classes hardcode the\nassumption that the ValueNode is const. To prepare for mutable views,\nmove the const specifier to the top-level DictAdapter and ListAdapter\nclass templates.\n\nSigned-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\nReviewed-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>\n---\n include/libcamera/internal/value_node.h | 54 ++++++++++++++++---------\n 1 file changed, 35 insertions(+), 19 deletions(-)","diff":"diff --git a/include/libcamera/internal/value_node.h b/include/libcamera/internal/value_node.h\nindex a7f916e22bc8..f8d0329f7670 100644\n--- a/include/libcamera/internal/value_node.h\n+++ b/include/libcamera/internal/value_node.h\n@@ -38,14 +38,14 @@ private:\n \n public:\n #ifndef __DOXYGEN__\n-\ttemplate<typename Derived>\n+\ttemplate<typename Derived, typename ContainerIterator>\n \tclass Iterator\n \t{\n \tpublic:\n \t\tusing difference_type = std::ptrdiff_t;\n \t\tusing iterator_category = std::forward_iterator_tag;\n \n-\t\tIterator(typename ValueContainer::const_iterator it)\n+\t\tIterator(ContainerIterator it)\n \t\t\t: it_(it)\n \t\t{\n \t\t}\n@@ -74,14 +74,14 @@ public:\n \t\t}\n \n \tprotected:\n-\t\tValueContainer::const_iterator it_;\n+\t\tContainerIterator it_;\n \t};\n \n-\ttemplate<typename Iterator>\n+\ttemplate<typename Iterator, typename Container>\n \tclass Adapter\n \t{\n \tpublic:\n-\t\tAdapter(const ValueContainer &container)\n+\t\tAdapter(Container &container)\n \t\t\t: container_(container)\n \t\t{\n \t\t}\n@@ -97,47 +97,63 @@ public:\n \t\t}\n \n \tprotected:\n-\t\tconst ValueContainer &container_;\n+\t\tContainer &container_;\n \t};\n \n-\tclass ListIterator : public Iterator<ListIterator>\n+\ttemplate<typename Value, typename ContainerIterator>\n+\tclass ListIterator : public Iterator<ListIterator<Value, ContainerIterator>,\n+\t\t\t\t\t     ContainerIterator>\n \t{\n-\tpublic:\n-\t\tusing value_type = const ValueNode &;\n-\t\tusing pointer = const ValueNode *;\n-\t\tusing reference = value_type;\n+\tprivate:\n+\t\tusing Base = Iterator<ListIterator<Value, ContainerIterator>,\n+\t\t\t\t      ContainerIterator>;\n \n-\t\tvalue_type operator*() const\n+\tpublic:\n+\t\tusing value_type = Value;\n+\t\tusing pointer = value_type *;\n+\t\tusing reference = value_type &;\n+\n+\t\treference operator*() const\n \t\t{\n-\t\t\treturn *it_->value.get();\n+\t\t\treturn *Base::it_->value.get();\n \t\t}\n \n \t\tpointer operator->() const\n \t\t{\n-\t\t\treturn it_->value.get();\n+\t\t\treturn Base::it_->value.get();\n \t\t}\n \t};\n \n-\tclass DictIterator : public Iterator<DictIterator>\n+\ttemplate<typename Value, typename ContainerIterator>\n+\tclass DictIterator : public Iterator<DictIterator<Value, ContainerIterator>,\n+\t\t\t\t\t     ContainerIterator>\n \t{\n+\tprivate:\n+\t\tusing Base = Iterator<DictIterator<Value, ContainerIterator>,\n+\t\t\t\t      ContainerIterator>;\n+\n \tpublic:\n-\t\tusing value_type = std::pair<const std::string &, const ValueNode &>;\n+\t\tusing value_type = std::pair<const std::string &, Value &>;\n \t\tusing pointer = value_type *;\n \t\tusing reference = value_type &;\n \n \t\tvalue_type operator*() const\n \t\t{\n-\t\t\treturn { it_->key, *it_->value.get() };\n+\t\t\treturn { Base::it_->key, *Base::it_->value.get() };\n \t\t}\n \t};\n \n-\tclass DictAdapter : public Adapter<DictIterator>\n+\tclass DictAdapter : public Adapter<DictIterator<const ValueNode,\n+\t\t\t\t\t\t\tValueContainer::const_iterator>,\n+\t\t\t\t\t   const ValueContainer>\n \t{\n \tpublic:\n \t\tusing key_type = std::string;\n \t};\n \n-\tclass ListAdapter : public Adapter<ListIterator>\n+\tclass ListAdapter : public Adapter<ListIterator<const ValueNode,\n+\t\t\t\t\t\t\tValueContainer::const_iterator>,\n+\t\t\t\t\t   const ValueContainer>\n \t{\n \t};\n #endif /* __DOXYGEN__ */\n","prefixes":["v2","21/42"]}