[{"id":37773,"web_url":"https://patchwork.libcamera.org/comment/37773/","msgid":"<20260120180345.GC143894@killaraus>","date":"2026-01-20T18:03:45","subject":"Re: [PATCH v1] libcamera: base: utils: join(): Don't use\n\t`const_iterator` directly","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"On Tue, Jan 20, 2026 at 03:44:31PM +0100, Barnabás Pőcze wrote:\n> For example, `std::span` does not have a `const_iterator` typedef before\n> C++23, so compilation fails. Simply use `auto`, the `const` qualifier on\n> the `items` variable should already ensure that, if one exists, a \"const\"\n> iterator will be used.\n\nWhat will be used with C++20, std::span::iterator ?\n\nI'm surprised that C++20 doesn't have a const_iterator for std::span,\nbut as std::span<const T>::iterator is not mutable, I see no issue with\nthis patch.\n\nReviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n\n> Signed-off-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>\n> ---\n>  include/libcamera/base/utils.h | 6 ++----\n>  1 file changed, 2 insertions(+), 4 deletions(-)\n> \n> diff --git a/include/libcamera/base/utils.h b/include/libcamera/base/utils.h\n> index 0b7407f77..2cb8e0a88 100644\n> --- a/include/libcamera/base/utils.h\n> +++ b/include/libcamera/base/utils.h\n> @@ -110,8 +110,7 @@ std::string join(const Container &items, const std::string &sep, UnaryOp op)\n>  \tstd::ostringstream ss;\n>  \tbool first = true;\n>  \n> -\tfor (typename Container::const_iterator it = std::begin(items);\n> -\t     it != std::end(items); ++it) {\n> +\tfor (auto it = std::begin(items); it != std::end(items); ++it) {\n>  \t\tif (!first)\n>  \t\t\tss << sep;\n>  \t\telse\n> @@ -129,8 +128,7 @@ std::string join(const Container &items, const std::string &sep)\n>  \tstd::ostringstream ss;\n>  \tbool first = true;\n>  \n> -\tfor (typename Container::const_iterator it = std::begin(items);\n> -\t     it != std::end(items); ++it) {\n> +\tfor (auto it = std::begin(items); it != std::end(items); ++it) {\n>  \t\tif (!first)\n>  \t\t\tss << sep;\n>  \t\telse","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 CB171C3220\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 20 Jan 2026 18:03:48 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 2C1C461FC4;\n\tTue, 20 Jan 2026 19:03:48 +0100 (CET)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id A13D561A35\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 20 Jan 2026 19:03:46 +0100 (CET)","from pendragon.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 33B58461;\n\tTue, 20 Jan 2026 19:03:15 +0100 (CET)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"v9VNx5P8\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1768932195;\n\tbh=p4vTBFYkbOuoSPxDkwAXoPRxO0Eia8zOytDXzEsfO/8=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=v9VNx5P8mIZ0mOSL/HoBIdlSuHFOJ4xE2SYOjYvqJUdikUVzB8jkDmSXkOfYL7QDy\n\tKAp9M8VVPqz5iqoimFU7rzlgDdXNPK72h7nfQFEjKlTebpGV/E7kfcldD8mJjQ4EGg\n\tRqdZh/wsdGun/GR7AXFJCXR78NUcg2Su+CgYgUVY=","Date":"Tue, 20 Jan 2026 20:03:45 +0200","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"=?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= <barnabas.pocze@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","Subject":"Re: [PATCH v1] libcamera: base: utils: join(): Don't use\n\t`const_iterator` directly","Message-ID":"<20260120180345.GC143894@killaraus>","References":"<20260120144431.264758-1-barnabas.pocze@ideasonboard.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","Content-Transfer-Encoding":"8bit","In-Reply-To":"<20260120144431.264758-1-barnabas.pocze@ideasonboard.com>","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>"}},{"id":37837,"web_url":"https://patchwork.libcamera.org/comment/37837/","msgid":"<176906926345.1693075.4997329894880504025@ping.linuxembedded.co.uk>","date":"2026-01-22T08:07:43","subject":"Re: [PATCH v1] libcamera: base: utils: join(): Don't use\n\t`const_iterator` directly","submitter":{"id":4,"url":"https://patchwork.libcamera.org/api/people/4/","name":"Kieran Bingham","email":"kieran.bingham@ideasonboard.com"},"content":"Quoting Laurent Pinchart (2026-01-20 18:03:45)\n> On Tue, Jan 20, 2026 at 03:44:31PM +0100, Barnabás Pőcze wrote:\n> > For example, `std::span` does not have a `const_iterator` typedef before\n> > C++23, so compilation fails. Simply use `auto`, the `const` qualifier on\n> > the `items` variable should already ensure that, if one exists, a \"const\"\n> > iterator will be used.\n> \n> What will be used with C++20, std::span::iterator ?\n> \n> I'm surprised that C++20 doesn't have a const_iterator for std::span,\n> but as std::span<const T>::iterator is not mutable, I see no issue with\n> this patch.\n> \n> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n\n\nReviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n\n> \n> > Signed-off-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>\n> > ---\n> >  include/libcamera/base/utils.h | 6 ++----\n> >  1 file changed, 2 insertions(+), 4 deletions(-)\n> > \n> > diff --git a/include/libcamera/base/utils.h b/include/libcamera/base/utils.h\n> > index 0b7407f77..2cb8e0a88 100644\n> > --- a/include/libcamera/base/utils.h\n> > +++ b/include/libcamera/base/utils.h\n> > @@ -110,8 +110,7 @@ std::string join(const Container &items, const std::string &sep, UnaryOp op)\n> >       std::ostringstream ss;\n> >       bool first = true;\n> >  \n> > -     for (typename Container::const_iterator it = std::begin(items);\n> > -          it != std::end(items); ++it) {\n> > +     for (auto it = std::begin(items); it != std::end(items); ++it) {\n> >               if (!first)\n> >                       ss << sep;\n> >               else\n> > @@ -129,8 +128,7 @@ std::string join(const Container &items, const std::string &sep)\n> >       std::ostringstream ss;\n> >       bool first = true;\n> >  \n> > -     for (typename Container::const_iterator it = std::begin(items);\n> > -          it != std::end(items); ++it) {\n> > +     for (auto it = std::begin(items); it != std::end(items); ++it) {\n> >               if (!first)\n> >                       ss << sep;\n> >               else\n> \n> -- \n> Regards,\n> \n> Laurent Pinchart","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 16B76BDCBF\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu, 22 Jan 2026 08:07:50 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 007DB61FC9;\n\tThu, 22 Jan 2026 09:07:48 +0100 (CET)","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 BAC4961FA0\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 22 Jan 2026 09:07:46 +0100 (CET)","from pendragon.ideasonboard.com\n\t(cpc89244-aztw30-2-0-cust6594.18-1.cable.virginm.net [86.31.185.195])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id D2BC4324;\n\tThu, 22 Jan 2026 09:07:13 +0100 (CET)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"aMy0utHc\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1769069234;\n\tbh=UzqKKvjnMJ2+3Ffp5aE0GZre4qB2ZZMIi+l6OeA4deo=;\n\th=In-Reply-To:References:Subject:From:Cc:To:Date:From;\n\tb=aMy0utHcBduKEMpABxaqzcooa6xPtstUKj4a+xbyp9bhgghbt7jv2IdNqyAd/KWzT\n\t4hdE92voP06afqwEmpmhbpKdf20c2Z4vWyGi6T/p28ueuda7WPPo3KY25/1lo3h5vx\n\tWOVw8KX9wlIjI3moa/sZwH0i/lFMzb11sOM0j3do=","Content-Type":"text/plain; charset=\"utf-8\"","MIME-Version":"1.0","Content-Transfer-Encoding":"quoted-printable","In-Reply-To":"<20260120180345.GC143894@killaraus>","References":"<20260120144431.264758-1-barnabas.pocze@ideasonboard.com>\n\t<20260120180345.GC143894@killaraus>","Subject":"Re: [PATCH v1] libcamera: base: utils: join(): Don't use\n\t`const_iterator` directly","From":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","To":"=?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= <barnabas.pocze@ideasonboard.com>,\n\tLaurent Pinchart <laurent.pinchart@ideasonboard.com>","Date":"Thu, 22 Jan 2026 08:07:43 +0000","Message-ID":"<176906926345.1693075.4997329894880504025@ping.linuxembedded.co.uk>","User-Agent":"alot/0.9.1","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>"}},{"id":37902,"web_url":"https://patchwork.libcamera.org/comment/37902/","msgid":"<61e7c280-246f-4cba-ae87-5ad49d56d1e9@ideasonboard.com>","date":"2026-01-23T10:28:41","subject":"Re: [PATCH v1] libcamera: base: utils: join(): Don't use\n\t`const_iterator` directly","submitter":{"id":216,"url":"https://patchwork.libcamera.org/api/people/216/","name":"Barnabás Pőcze","email":"barnabas.pocze@ideasonboard.com"},"content":"2026. 01. 20. 19:03 keltezéssel, Laurent Pinchart írta:\n> On Tue, Jan 20, 2026 at 03:44:31PM +0100, Barnabás Pőcze wrote:\n>> For example, `std::span` does not have a `const_iterator` typedef before\n>> C++23, so compilation fails. Simply use `auto`, the `const` qualifier on\n>> the `items` variable should already ensure that, if one exists, a \"const\"\n>> iterator will be used.\n> \n> What will be used with C++20, std::span::iterator ?\n\nYes.\n\n\n> \n> I'm surprised that C++20 doesn't have a const_iterator for std::span,\n> but as std::span<const T>::iterator is not mutable, I see no issue with\n> this patch.\n\nI imagine the motivation might have been that dereferencing a `T * const`\ngives `T&`. So `*((const std::span<T>)::begin())` should be the same. And\none can trivially go from a const span/pointer to a non-cost one, it is\nnot really possible to enforce any const-ness if `T` is not `const`.\n\nBut in C++23 they added `std::basic_const_iterator` that wraps an iterator\nand does not allow mutation. So they could easily add a const iterator to\nstd::span now. `std::ranges::cbegin()` (but not `std::cbegin()` apparently)\nhas also been changed to try to return such immutable iterators. So things\nappear to be moving towards ensuring that an iterator from `c{,r}{begin,end}()`\ndoes not allow mutation.\n\n\n> \n> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> \n>> Signed-off-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>\n>> ---\n>>   include/libcamera/base/utils.h | 6 ++----\n>>   1 file changed, 2 insertions(+), 4 deletions(-)\n>>\n>> diff --git a/include/libcamera/base/utils.h b/include/libcamera/base/utils.h\n>> index 0b7407f77..2cb8e0a88 100644\n>> --- a/include/libcamera/base/utils.h\n>> +++ b/include/libcamera/base/utils.h\n>> @@ -110,8 +110,7 @@ std::string join(const Container &items, const std::string &sep, UnaryOp op)\n>>   \tstd::ostringstream ss;\n>>   \tbool first = true;\n>>\n>> -\tfor (typename Container::const_iterator it = std::begin(items);\n>> -\t     it != std::end(items); ++it) {\n>> +\tfor (auto it = std::begin(items); it != std::end(items); ++it) {\n>>   \t\tif (!first)\n>>   \t\t\tss << sep;\n>>   \t\telse\n>> @@ -129,8 +128,7 @@ std::string join(const Container &items, const std::string &sep)\n>>   \tstd::ostringstream ss;\n>>   \tbool first = true;\n>>\n>> -\tfor (typename Container::const_iterator it = std::begin(items);\n>> -\t     it != std::end(items); ++it) {\n>> +\tfor (auto it = std::begin(items); it != std::end(items); ++it) {\n>>   \t\tif (!first)\n>>   \t\t\tss << sep;\n>>   \t\telse\n> \n> --\n> Regards,\n> \n> Laurent Pinchart","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 90349BDCBF\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 23 Jan 2026 10:28:47 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 9DAD261FC9;\n\tFri, 23 Jan 2026 11:28:46 +0100 (CET)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 25D3861F61\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 23 Jan 2026 11:28:45 +0100 (CET)","from [192.168.33.29] (185.221.143.114.nat.pool.zt.hu\n\t[185.221.143.114])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id A115C103D;\n\tFri, 23 Jan 2026 11:28:11 +0100 (CET)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"MnZOV3/d\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1769164091;\n\tbh=VTK6DY2j6fZ3zfMxEcKnt84Vtwdl8X6i2cspUxsQ1Sg=;\n\th=Date:Subject:To:Cc:References:From:In-Reply-To:From;\n\tb=MnZOV3/d9kjEp6eCfgttpWqIQuyroH/oF7scxr0maMapBZ5R34a9nPXBFHhsdLSlR\n\tUfQ5QvgBUSlLEw6hcplc5uTFHuuwP/TlbKKmZUdFXEaj/TrbsTOQFN1ZeV9mOWl5gT\n\tjfC0IMumUka6aiJEGZco4gdJ+OJl/1ZZKjv+RXco=","Message-ID":"<61e7c280-246f-4cba-ae87-5ad49d56d1e9@ideasonboard.com>","Date":"Fri, 23 Jan 2026 11:28:41 +0100","MIME-Version":"1.0","User-Agent":"Mozilla Thunderbird","Subject":"Re: [PATCH v1] libcamera: base: utils: join(): Don't use\n\t`const_iterator` directly","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>, =?utf-8?q?Barnab?=\n\t=?utf-8?b?w6FzIFDFkWN6ZQ==?= <barnabas.pocze@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","References":"<20260120144431.264758-1-barnabas.pocze@ideasonboard.com>\n\t<84OuNb-Snjc8wHJNlzJMow43ONc5OdkkfuFeBj13hXlbnM3b5GsWbeIv3rBsaLOy1SFO16lBrjknjYuSkpbuJA==@protonmail.internalid>\n\t<20260120180345.GC143894@killaraus>","From":"=?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= <barnabas.pocze@ideasonboard.com>","Content-Language":"en-US, hu-HU","In-Reply-To":"<20260120180345.GC143894@killaraus>","Content-Type":"text/plain; charset=UTF-8; format=flowed","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>"}},{"id":37903,"web_url":"https://patchwork.libcamera.org/comment/37903/","msgid":"<1cf5c501-0371-4008-b157-6b28acf6a76a@ideasonboard.com>","date":"2026-01-23T10:49:48","subject":"Re: [PATCH v1] libcamera: base: utils: join(): Don't use\n\t`const_iterator` directly","submitter":{"id":216,"url":"https://patchwork.libcamera.org/api/people/216/","name":"Barnabás Pőcze","email":"barnabas.pocze@ideasonboard.com"},"content":"2026. 01. 23. 11:28 keltezéssel, Barnabás Pőcze írta:\n> 2026. 01. 20. 19:03 keltezéssel, Laurent Pinchart írta:\n>> On Tue, Jan 20, 2026 at 03:44:31PM +0100, Barnabás Pőcze wrote:\n>>> For example, `std::span` does not have a `const_iterator` typedef before\n>>> C++23, so compilation fails. Simply use `auto`, the `const` qualifier on\n>>> the `items` variable should already ensure that, if one exists, a \"const\"\n>>> iterator will be used.\n>>\n>> What will be used with C++20, std::span::iterator ?\n> \n> Yes.\n\nJust to clarify: std::span<...>::begin() always returns `std::span<...>::iterator`,\neven if the span itself is const qualified. Since C++23 there is `c{,r}begin()`\nthat always returns an \"immutable\" iterator (`std::span<...>::const_iterator`),\neven if the span itself is not const qualified.\n\n\n> \n> \n>>\n>> I'm surprised that C++20 doesn't have a const_iterator for std::span,\n>> but as std::span<const T>::iterator is not mutable, I see no issue with\n>> this patch.\n> \n> I imagine the motivation might have been that dereferencing a `T * const`\n> gives `T&`. So `*((const std::span<T>)::begin())` should be the same. And\n> one can trivially go from a const span/pointer to a non-cost one, it is\n> not really possible to enforce any const-ness if `T` is not `const`.\n> \n> But in C++23 they added `std::basic_const_iterator` that wraps an iterator\n> and does not allow mutation. So they could easily add a const iterator to\n> std::span now. `std::ranges::cbegin()` (but not `std::cbegin()` apparently)\n> has also been changed to try to return such immutable iterators. So things\n> appear to be moving towards ensuring that an iterator from `c{,r}{begin,end}()`\n> does not allow mutation.\n> \n> \n>>\n>> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n>>\n>>> Signed-off-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>\n>>> ---\n>>>    include/libcamera/base/utils.h | 6 ++----\n>>>    1 file changed, 2 insertions(+), 4 deletions(-)\n>>>\n>>> diff --git a/include/libcamera/base/utils.h b/include/libcamera/base/utils.h\n>>> index 0b7407f77..2cb8e0a88 100644\n>>> --- a/include/libcamera/base/utils.h\n>>> +++ b/include/libcamera/base/utils.h\n>>> @@ -110,8 +110,7 @@ std::string join(const Container &items, const std::string &sep, UnaryOp op)\n>>>    \tstd::ostringstream ss;\n>>>    \tbool first = true;\n>>>\n>>> -\tfor (typename Container::const_iterator it = std::begin(items);\n>>> -\t     it != std::end(items); ++it) {\n>>> +\tfor (auto it = std::begin(items); it != std::end(items); ++it) {\n>>>    \t\tif (!first)\n>>>    \t\t\tss << sep;\n>>>    \t\telse\n>>> @@ -129,8 +128,7 @@ std::string join(const Container &items, const std::string &sep)\n>>>    \tstd::ostringstream ss;\n>>>    \tbool first = true;\n>>>\n>>> -\tfor (typename Container::const_iterator it = std::begin(items);\n>>> -\t     it != std::end(items); ++it) {\n>>> +\tfor (auto it = std::begin(items); it != std::end(items); ++it) {\n>>>    \t\tif (!first)\n>>>    \t\t\tss << sep;\n>>>    \t\telse\n>>\n>> --\n>> Regards,\n>>\n>> Laurent Pinchart\n>","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 A53E5C3220\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 23 Jan 2026 10:49:53 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id D71AC61FC9;\n\tFri, 23 Jan 2026 11:49:52 +0100 (CET)","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 3010161F61\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 23 Jan 2026 11:49:51 +0100 (CET)","from [192.168.33.29] (185.221.143.114.nat.pool.zt.hu\n\t[185.221.143.114])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id B47BC103D;\n\tFri, 23 Jan 2026 11:49:17 +0100 (CET)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"vhK7eTXE\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1769165357;\n\tbh=lYme+xyPFlh1nigcYNxVyvFmFn0lUfV1bbn7Oz/OWgE=;\n\th=Date:Subject:To:Cc:References:From:In-Reply-To:From;\n\tb=vhK7eTXEP9S2nmCwdcvULdsGyzGX/JywZbrbEM0HcRLavDBCsIAPQ2J8lfzkhs/5L\n\tppEeEgqyTKn85VQ53yS7xRUGialv+DyqYq7ENGmcvgK0mWL1hUmRrJUTBv3cy0tkyX\n\taEvIhStkVhfnnJ+n7ivJfSKqBLCxl+tjNeoD//3A=","Message-ID":"<1cf5c501-0371-4008-b157-6b28acf6a76a@ideasonboard.com>","Date":"Fri, 23 Jan 2026 11:49:48 +0100","MIME-Version":"1.0","User-Agent":"Mozilla Thunderbird","Subject":"Re: [PATCH v1] libcamera: base: utils: join(): Don't use\n\t`const_iterator` directly","To":"=?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= <barnabas.pocze@ideasonboard.com>,\n\tLaurent Pinchart <laurent.pinchart@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","References":"<20260120144431.264758-1-barnabas.pocze@ideasonboard.com>\n\t<84OuNb-Snjc8wHJNlzJMow43ONc5OdkkfuFeBj13hXlbnM3b5GsWbeIv3rBsaLOy1SFO16lBrjknjYuSkpbuJA==@protonmail.internalid>\n\t<20260120180345.GC143894@killaraus>\n\t<buCPxCiQMS-Qgtr8iPA98XUXxqdSLA8EpY_BjuQgl8Hk9fLzk0LZK1S4lrLK39mHUESVNu0cKh9hTCIEpBFWeA==@protonmail.internalid>\n\t<61e7c280-246f-4cba-ae87-5ad49d56d1e9@ideasonboard.com>","From":"=?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= <barnabas.pocze@ideasonboard.com>","Content-Language":"en-US, hu-HU","In-Reply-To":"<61e7c280-246f-4cba-ae87-5ad49d56d1e9@ideasonboard.com>","Content-Type":"text/plain; charset=UTF-8; format=flowed","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>"}}]