[{"id":38196,"web_url":"https://patchwork.libcamera.org/comment/38196/","msgid":"<1cc044d4-5140-49f4-821c-6649933d43cd@ideasonboard.com>","date":"2026-02-13T09:16:06","subject":"Re: [PATCH v2 1/4] libcamera: Replace iterators with structured\n\tbindings","submitter":{"id":216,"url":"https://patchwork.libcamera.org/api/people/216/","name":"Barnabás Pőcze","email":"barnabas.pocze@ideasonboard.com"},"content":"2026. 02. 12. 16:12 keltezéssel, Laurent Pinchart írta:\n> Use structured bindings when iterating over a map in range-based for\n> loops. This improves readability.\n> \n> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> ---\n> Changes since v1:\n> \n> - Standardize on 'const auto &'\n> - Replace more iterators\n> ---\n\nWhile looking at some of the changes, I noticed that `Request::reuse()`\nis not converted (probably because it uses `pair` as the name).\n\nReviewed-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>\n\n\n>   include/libcamera/internal/ipa_data_serializer.h    |  6 +++---\n>   src/apps/common/options.cpp                         |  6 ++----\n>   src/gstreamer/gstlibcamera-controls.cpp.in          |  7 +------\n>   src/libcamera/camera.cpp                            |  4 +---\n>   src/libcamera/converter/converter_v4l2_m2m.cpp      |  8 ++++----\n>   src/libcamera/pipeline/ipu3/cio2.cpp                |  6 +++---\n>   src/libcamera/pipeline/ipu3/ipu3.cpp                | 11 +++--------\n>   src/libcamera/pipeline/rpi/common/pipeline_base.cpp |  5 ++---\n>   src/libcamera/pipeline/vimc/vimc.cpp                | 10 ++++------\n>   src/libcamera/sensor/camera_sensor_legacy.cpp       |  4 ++--\n>   src/libcamera/sensor/camera_sensor_raw.cpp          |  4 ++--\n>   src/libcamera/software_isp/software_isp.cpp         |  3 +--\n>   src/libcamera/stream.cpp                            |  4 ++--\n>   src/libcamera/v4l2_videodevice.cpp                  |  6 ++----\n>   14 files changed, 32 insertions(+), 52 deletions(-)\n> \n> diff --git a/include/libcamera/internal/ipa_data_serializer.h b/include/libcamera/internal/ipa_data_serializer.h\n> index 927f5c4c7337..61bada52f691 100644\n> --- a/include/libcamera/internal/ipa_data_serializer.h\n> +++ b/include/libcamera/internal/ipa_data_serializer.h\n> @@ -211,12 +211,12 @@ public:\n>   \t\tappendPOD<uint32_t>(dataVec, mapLen);\n>   \n>   \t\t/* Serialize the members. */\n> -\t\tfor (auto const &it : data) {\n> +\t\tfor (const auto &[key, value] : data) {\n>   \t\t\tstd::vector<uint8_t> dvec;\n>   \t\t\tstd::vector<SharedFD> fvec;\n>   \n>   \t\t\tstd::tie(dvec, fvec) =\n> -\t\t\t\tIPADataSerializer<K>::serialize(it.first, cs);\n> +\t\t\t\tIPADataSerializer<K>::serialize(key, cs);\n>   \n>   \t\t\tappendPOD<uint32_t>(dataVec, dvec.size());\n>   \t\t\tappendPOD<uint32_t>(dataVec, fvec.size());\n> @@ -225,7 +225,7 @@ public:\n>   \t\t\tfdsVec.insert(fdsVec.end(), fvec.begin(), fvec.end());\n>   \n>   \t\t\tstd::tie(dvec, fvec) =\n> -\t\t\t\tIPADataSerializer<V>::serialize(it.second, cs);\n> +\t\t\t\tIPADataSerializer<V>::serialize(value, cs);\n>   \n>   \t\t\tappendPOD<uint32_t>(dataVec, dvec.size());\n>   \t\t\tappendPOD<uint32_t>(dataVec, fvec.size());\n> diff --git a/src/apps/common/options.cpp b/src/apps/common/options.cpp\n> index b4ea1afe2136..b95f95afadf3 100644\n> --- a/src/apps/common/options.cpp\n> +++ b/src/apps/common/options.cpp\n> @@ -423,8 +423,7 @@ unsigned int KeyValueParser::maxOptionLength() const\n>   {\n>   \tunsigned int maxLength = 0;\n>   \n> -\tfor (auto const &iter : optionsMap_) {\n> -\t\tconst Option &option = iter.second;\n> +\tfor (const auto &[name, option] : optionsMap_) {\n>   \t\tunsigned int length = 10 + strlen(option.name);\n>   \t\tif (option.argument != ArgumentNone)\n>   \t\t\tlength += 1 + strlen(option.typeName());\n> @@ -440,8 +439,7 @@ unsigned int KeyValueParser::maxOptionLength() const\n>   \n>   void KeyValueParser::usage(int indent)\n>   {\n> -\tfor (auto const &iter : optionsMap_) {\n> -\t\tconst Option &option = iter.second;\n> +\tfor (const auto &[name, option] : optionsMap_) {\n>   \t\tstd::string argument = std::string(\"          \") + option.name;\n>   \n>   \t\tif (option.argument != ArgumentNone) {\n> diff --git a/src/gstreamer/gstlibcamera-controls.cpp.in b/src/gstreamer/gstlibcamera-controls.cpp.in\n> index 6faf3ee7a6c3..c3f0695f9b90 100644\n> --- a/src/gstreamer/gstlibcamera-controls.cpp.in\n> +++ b/src/gstreamer/gstlibcamera-controls.cpp.in\n> @@ -252,12 +252,7 @@ void GstCameraControls::setCamera(const std::shared_ptr<libcamera::Camera> &cam)\n>   \t * the pipeline has started and thus before the camera was known.\n>   \t */\n>   \tControlList new_controls;\n> -\tfor (auto control = controls_acc_.begin();\n> -\t     control != controls_acc_.end();\n> -\t     ++control) {\n> -\t\tunsigned int id = control->first;\n> -\t\tControlValue value = control->second;\n> -\n> +\tfor (const auto &[id, value] : controls_acc_) {\n>   \t\tconst ControlId *cid = capabilities_.idmap().at(id);\n>   \t\tauto info = capabilities_.find(cid);\n>   \n> diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp\n> index 7c0e93ff483f..f724a1be5e3d 100644\n> --- a/src/libcamera/camera.cpp\n> +++ b/src/libcamera/camera.cpp\n> @@ -1362,9 +1362,7 @@ int Camera::queueRequest(Request *request)\n>   \t\treturn -EINVAL;\n>   \t}\n>   \n> -\tfor (auto const &it : request->buffers()) {\n> -\t\tconst Stream *stream = it.first;\n> -\n> +\tfor (const auto &[stream, buffer] : request->buffers()) {\n>   \t\tif (d->activeStreams_.find(stream) == d->activeStreams_.end()) {\n>   \t\t\tLOG(Camera, Error) << \"Invalid request\";\n>   \t\t\treturn -EINVAL;\n> diff --git a/src/libcamera/converter/converter_v4l2_m2m.cpp b/src/libcamera/converter/converter_v4l2_m2m.cpp\n> index 37377ab24952..4427a37c6fc0 100644\n> --- a/src/libcamera/converter/converter_v4l2_m2m.cpp\n> +++ b/src/libcamera/converter/converter_v4l2_m2m.cpp\n> @@ -646,8 +646,8 @@ int V4L2M2MConverter::start()\n>   {\n>   \tint ret;\n>   \n> -\tfor (auto &iter : streams_) {\n> -\t\tret = iter.second->start();\n> +\tfor (auto &[stream, m2mStream] : streams_) {\n> +\t\tret = m2mStream->start();\n>   \t\tif (ret < 0) {\n>   \t\t\tstop();\n>   \t\t\treturn ret;\n> @@ -662,8 +662,8 @@ int V4L2M2MConverter::start()\n>    */\n>   void V4L2M2MConverter::stop()\n>   {\n> -\tfor (auto &iter : streams_)\n> -\t\titer.second->stop();\n> +\tfor (auto &[stream, m2mStream] : streams_)\n> +\t\tm2mStream->stop();\n>   }\n>   \n>   /**\n> diff --git a/src/libcamera/pipeline/ipu3/cio2.cpp b/src/libcamera/pipeline/ipu3/cio2.cpp\n> index 6f9c055f4d12..b6fe84fe70cc 100644\n> --- a/src/libcamera/pipeline/ipu3/cio2.cpp\n> +++ b/src/libcamera/pipeline/ipu3/cio2.cpp\n> @@ -82,11 +82,11 @@ std::vector<SizeRange> CIO2Device::sizes(const PixelFormat &format) const\n>   \t\treturn {};\n>   \n>   \tstd::vector<SizeRange> sizes;\n> -\tfor (const auto &iter : mbusCodesToPixelFormat) {\n> -\t\tif (iter.second != format)\n> +\tfor (const auto &[code, pixelFormat] : mbusCodesToPixelFormat) {\n> +\t\tif (pixelFormat != format)\n>   \t\t\tcontinue;\n>   \n> -\t\tmbusCode = iter.first;\n> +\t\tmbusCode = code;\n>   \t\tbreak;\n>   \t}\n>   \n> diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp\n> index 0190f677e679..bac6f1c2ef40 100644\n> --- a/src/libcamera/pipeline/ipu3/ipu3.cpp\n> +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp\n> @@ -791,8 +791,7 @@ void IPU3CameraData::cancelPendingRequests()\n>   \twhile (!pendingRequests_.empty()) {\n>   \t\tRequest *request = pendingRequests_.front();\n>   \n> -\t\tfor (auto it : request->buffers()) {\n> -\t\t\tFrameBuffer *buffer = it.second;\n> +\t\tfor (const auto &[stream, buffer] : request->buffers()) {\n>   \t\t\tbuffer->_d()->cancel();\n>   \t\t\tpipe()->completeBuffer(request, buffer);\n>   \t\t}\n> @@ -1225,10 +1224,7 @@ void IPU3CameraData::paramsComputed(unsigned int id)\n>   \t\treturn;\n>   \n>   \t/* Queue all buffers from the request aimed for the ImgU. */\n> -\tfor (auto it : info->request->buffers()) {\n> -\t\tconst Stream *stream = it.first;\n> -\t\tFrameBuffer *outbuffer = it.second;\n> -\n> +\tfor (const auto &[stream, outbuffer] : info->request->buffers()) {\n>   \t\tif (stream == &outStream_)\n>   \t\t\timgu_->output_->queueBuffer(outbuffer);\n>   \t\telse if (stream == &vfStream_)\n> @@ -1304,8 +1300,7 @@ void IPU3CameraData::cio2BufferReady(FrameBuffer *buffer)\n>   \n>   \t/* If the buffer is cancelled force a complete of the whole request. */\n>   \tif (buffer->metadata().status == FrameMetadata::FrameCancelled) {\n> -\t\tfor (auto it : request->buffers()) {\n> -\t\t\tFrameBuffer *b = it.second;\n> +\t\tfor (const auto &[stream, b] : request->buffers()) {\n>   \t\t\tb->_d()->cancel();\n>   \t\t\tpipe()->completeBuffer(request, b);\n>   \t\t}\n> diff --git a/src/libcamera/pipeline/rpi/common/pipeline_base.cpp b/src/libcamera/pipeline/rpi/common/pipeline_base.cpp\n> index fb8e466f6e3b..de43603ddf69 100644\n> --- a/src/libcamera/pipeline/rpi/common/pipeline_base.cpp\n> +++ b/src/libcamera/pipeline/rpi/common/pipeline_base.cpp\n> @@ -941,13 +941,12 @@ V4L2SubdeviceFormat CameraData::findBestFormat(const Size &req, unsigned int bit\n>   \tconstexpr float penaltyBitDepth = 500.0;\n>   \n>   \t/* Calculate the closest/best mode from the user requested size. */\n> -\tfor (const auto &iter : sensorFormats_) {\n> -\t\tconst unsigned int mbusCode = iter.first;\n> +\tfor (const auto &[mbusCode, sizes] : sensorFormats_) {\n>   \t\tconst PixelFormat format = mbusCodeToPixelFormat(mbusCode,\n>   \t\t\t\t\t\t\t\t BayerFormat::Packing::None);\n>   \t\tconst PixelFormatInfo &info = PixelFormatInfo::info(format);\n>   \n> -\t\tfor (const Size &size : iter.second) {\n> +\t\tfor (const Size &size : sizes) {\n>   \t\t\tdouble reqAr = static_cast<double>(req.width) / req.height;\n>   \t\t\tdouble fmtAr = static_cast<double>(size.width) / size.height;\n>   \n> diff --git a/src/libcamera/pipeline/vimc/vimc.cpp b/src/libcamera/pipeline/vimc/vimc.cpp\n> index 4a03c149a617..08b1007528f2 100644\n> --- a/src/libcamera/pipeline/vimc/vimc.cpp\n> +++ b/src/libcamera/pipeline/vimc/vimc.cpp\n> @@ -405,8 +405,7 @@ int PipelineHandlerVimc::processControls(VimcCameraData *data, Request *request)\n>   {\n>   \tControlList controls(data->sensor_->controls());\n>   \n> -\tfor (const auto &it : request->controls()) {\n> -\t\tunsigned int id = it.first;\n> +\tfor (const auto &[id, value] : request->controls()) {\n>   \t\tunsigned int offset;\n>   \t\tuint32_t cid;\n>   \n> @@ -423,8 +422,8 @@ int PipelineHandlerVimc::processControls(VimcCameraData *data, Request *request)\n>   \t\t\tcontinue;\n>   \t\t}\n>   \n> -\t\tint32_t value = std::lround(it.second.get<float>() * 128 + offset);\n> -\t\tcontrols.set(cid, std::clamp(value, 0, 255));\n> +\t\tint32_t v4l2Value = std::lround(value.get<float>() * 128 + offset);\n> +\t\tcontrols.set(cid, std::clamp(v4l2Value, 0, 255));\n>   \t}\n>   \n>   \tfor (const auto &ctrl : controls)\n> @@ -607,8 +606,7 @@ void VimcCameraData::imageBufferReady(FrameBuffer *buffer)\n>   \n>   \t/* If the buffer is cancelled force a complete of the whole request. */\n>   \tif (buffer->metadata().status == FrameMetadata::FrameCancelled) {\n> -\t\tfor (auto it : request->buffers()) {\n> -\t\t\tFrameBuffer *b = it.second;\n> +\t\tfor (const auto &[stream, b] : request->buffers()) {\n>   \t\t\tb->_d()->cancel();\n>   \t\t\tpipe->completeBuffer(request, b);\n>   \t\t}\n> diff --git a/src/libcamera/sensor/camera_sensor_legacy.cpp b/src/libcamera/sensor/camera_sensor_legacy.cpp\n> index 39c34200b0ff..6a683821f219 100644\n> --- a/src/libcamera/sensor/camera_sensor_legacy.cpp\n> +++ b/src/libcamera/sensor/camera_sensor_legacy.cpp\n> @@ -536,8 +536,8 @@ void CameraSensorLegacy::initTestPatternModes()\n>   \t * list of supported test patterns.\n>   \t */\n>   \tstd::map<int32_t, controls::draft::TestPatternModeEnum> indexToTestPatternMode;\n> -\tfor (const auto &it : testPatternModes)\n> -\t\tindexToTestPatternMode[it.second] = it.first;\n> +\tfor (const auto &[mode, index] : testPatternModes)\n> +\t\tindexToTestPatternMode[index] = mode;\n>   \n>   \tfor (const ControlValue &value : v4l2TestPattern->second.values()) {\n>   \t\tconst int32_t index = value.get<int32_t>();\n> diff --git a/src/libcamera/sensor/camera_sensor_raw.cpp b/src/libcamera/sensor/camera_sensor_raw.cpp\n> index 81d8985ee134..10eba0331fe8 100644\n> --- a/src/libcamera/sensor/camera_sensor_raw.cpp\n> +++ b/src/libcamera/sensor/camera_sensor_raw.cpp\n> @@ -720,8 +720,8 @@ void CameraSensorRaw::initTestPatternModes()\n>   \t * list of supported test patterns.\n>   \t */\n>   \tstd::map<int32_t, controls::draft::TestPatternModeEnum> indexToTestPatternMode;\n> -\tfor (const auto &it : testPatternModes)\n> -\t\tindexToTestPatternMode[it.second] = it.first;\n> +\tfor (const auto &[mode, index] : testPatternModes)\n> +\t\tindexToTestPatternMode[index] = mode;\n>   \n>   \tfor (const ControlValue &value : v4l2TestPattern->second.values()) {\n>   \t\tconst int32_t index = value.get<int32_t>();\n> diff --git a/src/libcamera/software_isp/software_isp.cpp b/src/libcamera/software_isp/software_isp.cpp\n> index a83986b787b7..167aaa0441c9 100644\n> --- a/src/libcamera/software_isp/software_isp.cpp\n> +++ b/src/libcamera/software_isp/software_isp.cpp\n> @@ -330,8 +330,7 @@ int SoftwareIsp::queueBuffers(uint32_t frame, FrameBuffer *input,\n>   \n>   \tqueuedInputBuffers_.push_back(input);\n>   \n> -\tfor (auto iter = outputs.begin(); iter != outputs.end(); iter++) {\n> -\t\tFrameBuffer *const buffer = iter->second;\n> +\tfor (const auto &[stream, buffer] : outputs) {\n>   \t\tqueuedOutputBuffers_.push_back(buffer);\n>   \t\tprocess(frame, input, buffer);\n>   \t}\n> diff --git a/src/libcamera/stream.cpp b/src/libcamera/stream.cpp\n> index f091487c9353..8df70dbfd10b 100644\n> --- a/src/libcamera/stream.cpp\n> +++ b/src/libcamera/stream.cpp\n> @@ -108,8 +108,8 @@ std::vector<PixelFormat> StreamFormats::pixelformats() const\n>   {\n>   \tstd::vector<PixelFormat> formats;\n>   \n> -\tfor (auto const &it : formats_)\n> -\t\tformats.push_back(it.first);\n> +\tfor (const auto &[format, sizes] : formats_)\n> +\t\tformats.push_back(format);\n>   \n>   \treturn formats;\n>   }\n> diff --git a/src/libcamera/v4l2_videodevice.cpp b/src/libcamera/v4l2_videodevice.cpp\n> index 25b61d049a0e..61a4551c63c5 100644\n> --- a/src/libcamera/v4l2_videodevice.cpp\n> +++ b/src/libcamera/v4l2_videodevice.cpp\n> @@ -2042,10 +2042,8 @@ int V4L2VideoDevice::streamOff()\n>   \tstate_ = State::Stopping;\n>   \n>   \t/* Send back all queued buffers. */\n> -\tfor (auto it : queuedBuffers_) {\n> -\t\tFrameBuffer *buffer = it.second;\n> -\n> -\t\tcache_->put(it.first);\n> +\tfor (const auto &[id, buffer] : queuedBuffers_) {\n> +\t\tcache_->put(id);\n>   \t\tbuffer->_d()->cancel();\n>   \t\tbufferReady.emit(buffer);\n>   \t}","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 033B7BD78E\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 13 Feb 2026 09:16:10 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id A8CE6621D8;\n\tFri, 13 Feb 2026 10:16:10 +0100 (CET)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 6A3E7621CE\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 13 Feb 2026 10:16:09 +0100 (CET)","from [192.168.33.67] (185.221.141.206.nat.pool.zt.hu\n\t[185.221.141.206])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id D8947CF5;\n\tFri, 13 Feb 2026 10:15:20 +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=\"Ja7JuTec\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1770974121;\n\tbh=TeDAwqD/7QIRIxjkb7V+YOgjUKBPduzD5JEtCl68p1g=;\n\th=Date:Subject:To:References:From:In-Reply-To:From;\n\tb=Ja7JuTecgcYkVXlXH7BwmV+3QC44QYVVMcOgZ4Ruj3543tQ+w5p88ZsCD2p0DYH5f\n\tFvH/n496jhXOhTP/z4oAp9TljQNmXDKKPYYDjbg1HLR8Ek0fDtGKyfFsYSMqWHaCND\n\tNLib/cJZ1hCusmHEwjW6sV95GVWWYO4bf3lkQHLY=","Message-ID":"<1cc044d4-5140-49f4-821c-6649933d43cd@ideasonboard.com>","Date":"Fri, 13 Feb 2026 10:16:06 +0100","MIME-Version":"1.0","User-Agent":"Mozilla Thunderbird","Subject":"Re: [PATCH v2 1/4] libcamera: Replace iterators with structured\n\tbindings","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>,\n\tlibcamera-devel@lists.libcamera.org","References":"<20260212151238.3736234-1-laurent.pinchart@ideasonboard.com>\n\t<20260212151238.3736234-2-laurent.pinchart@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":"<20260212151238.3736234-2-laurent.pinchart@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>"}},{"id":38257,"web_url":"https://patchwork.libcamera.org/comment/38257/","msgid":"<20260219143629.GS520738@killaraus.ideasonboard.com>","date":"2026-02-19T14:36:29","subject":"Re: [PATCH v2 1/4] libcamera: Replace iterators with structured\n\tbindings","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"On Fri, Feb 13, 2026 at 10:16:06AM +0100, Barnabás Pőcze wrote:\n> 2026. 02. 12. 16:12 keltezéssel, Laurent Pinchart írta:\n> > Use structured bindings when iterating over a map in range-based for\n> > loops. This improves readability.\n> > \n> > Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> > ---\n> > Changes since v1:\n> > \n> > - Standardize on 'const auto &'\n> > - Replace more iterators\n> > ---\n> \n> While looking at some of the changes, I noticed that `Request::reuse()`\n> is not converted (probably because it uses `pair` as the name).\n\nGood catch. I'll fix it in v3.\n\n> Reviewed-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>\n> \n> >   include/libcamera/internal/ipa_data_serializer.h    |  6 +++---\n> >   src/apps/common/options.cpp                         |  6 ++----\n> >   src/gstreamer/gstlibcamera-controls.cpp.in          |  7 +------\n> >   src/libcamera/camera.cpp                            |  4 +---\n> >   src/libcamera/converter/converter_v4l2_m2m.cpp      |  8 ++++----\n> >   src/libcamera/pipeline/ipu3/cio2.cpp                |  6 +++---\n> >   src/libcamera/pipeline/ipu3/ipu3.cpp                | 11 +++--------\n> >   src/libcamera/pipeline/rpi/common/pipeline_base.cpp |  5 ++---\n> >   src/libcamera/pipeline/vimc/vimc.cpp                | 10 ++++------\n> >   src/libcamera/sensor/camera_sensor_legacy.cpp       |  4 ++--\n> >   src/libcamera/sensor/camera_sensor_raw.cpp          |  4 ++--\n> >   src/libcamera/software_isp/software_isp.cpp         |  3 +--\n> >   src/libcamera/stream.cpp                            |  4 ++--\n> >   src/libcamera/v4l2_videodevice.cpp                  |  6 ++----\n> >   14 files changed, 32 insertions(+), 52 deletions(-)\n> > \n> > diff --git a/include/libcamera/internal/ipa_data_serializer.h b/include/libcamera/internal/ipa_data_serializer.h\n> > index 927f5c4c7337..61bada52f691 100644\n> > --- a/include/libcamera/internal/ipa_data_serializer.h\n> > +++ b/include/libcamera/internal/ipa_data_serializer.h\n> > @@ -211,12 +211,12 @@ public:\n> >   \t\tappendPOD<uint32_t>(dataVec, mapLen);\n> >   \n> >   \t\t/* Serialize the members. */\n> > -\t\tfor (auto const &it : data) {\n> > +\t\tfor (const auto &[key, value] : data) {\n> >   \t\t\tstd::vector<uint8_t> dvec;\n> >   \t\t\tstd::vector<SharedFD> fvec;\n> >   \n> >   \t\t\tstd::tie(dvec, fvec) =\n> > -\t\t\t\tIPADataSerializer<K>::serialize(it.first, cs);\n> > +\t\t\t\tIPADataSerializer<K>::serialize(key, cs);\n> >   \n> >   \t\t\tappendPOD<uint32_t>(dataVec, dvec.size());\n> >   \t\t\tappendPOD<uint32_t>(dataVec, fvec.size());\n> > @@ -225,7 +225,7 @@ public:\n> >   \t\t\tfdsVec.insert(fdsVec.end(), fvec.begin(), fvec.end());\n> >   \n> >   \t\t\tstd::tie(dvec, fvec) =\n> > -\t\t\t\tIPADataSerializer<V>::serialize(it.second, cs);\n> > +\t\t\t\tIPADataSerializer<V>::serialize(value, cs);\n> >   \n> >   \t\t\tappendPOD<uint32_t>(dataVec, dvec.size());\n> >   \t\t\tappendPOD<uint32_t>(dataVec, fvec.size());\n> > diff --git a/src/apps/common/options.cpp b/src/apps/common/options.cpp\n> > index b4ea1afe2136..b95f95afadf3 100644\n> > --- a/src/apps/common/options.cpp\n> > +++ b/src/apps/common/options.cpp\n> > @@ -423,8 +423,7 @@ unsigned int KeyValueParser::maxOptionLength() const\n> >   {\n> >   \tunsigned int maxLength = 0;\n> >   \n> > -\tfor (auto const &iter : optionsMap_) {\n> > -\t\tconst Option &option = iter.second;\n> > +\tfor (const auto &[name, option] : optionsMap_) {\n> >   \t\tunsigned int length = 10 + strlen(option.name);\n> >   \t\tif (option.argument != ArgumentNone)\n> >   \t\t\tlength += 1 + strlen(option.typeName());\n> > @@ -440,8 +439,7 @@ unsigned int KeyValueParser::maxOptionLength() const\n> >   \n> >   void KeyValueParser::usage(int indent)\n> >   {\n> > -\tfor (auto const &iter : optionsMap_) {\n> > -\t\tconst Option &option = iter.second;\n> > +\tfor (const auto &[name, option] : optionsMap_) {\n> >   \t\tstd::string argument = std::string(\"          \") + option.name;\n> >   \n> >   \t\tif (option.argument != ArgumentNone) {\n> > diff --git a/src/gstreamer/gstlibcamera-controls.cpp.in b/src/gstreamer/gstlibcamera-controls.cpp.in\n> > index 6faf3ee7a6c3..c3f0695f9b90 100644\n> > --- a/src/gstreamer/gstlibcamera-controls.cpp.in\n> > +++ b/src/gstreamer/gstlibcamera-controls.cpp.in\n> > @@ -252,12 +252,7 @@ void GstCameraControls::setCamera(const std::shared_ptr<libcamera::Camera> &cam)\n> >   \t * the pipeline has started and thus before the camera was known.\n> >   \t */\n> >   \tControlList new_controls;\n> > -\tfor (auto control = controls_acc_.begin();\n> > -\t     control != controls_acc_.end();\n> > -\t     ++control) {\n> > -\t\tunsigned int id = control->first;\n> > -\t\tControlValue value = control->second;\n> > -\n> > +\tfor (const auto &[id, value] : controls_acc_) {\n> >   \t\tconst ControlId *cid = capabilities_.idmap().at(id);\n> >   \t\tauto info = capabilities_.find(cid);\n> >   \n> > diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp\n> > index 7c0e93ff483f..f724a1be5e3d 100644\n> > --- a/src/libcamera/camera.cpp\n> > +++ b/src/libcamera/camera.cpp\n> > @@ -1362,9 +1362,7 @@ int Camera::queueRequest(Request *request)\n> >   \t\treturn -EINVAL;\n> >   \t}\n> >   \n> > -\tfor (auto const &it : request->buffers()) {\n> > -\t\tconst Stream *stream = it.first;\n> > -\n> > +\tfor (const auto &[stream, buffer] : request->buffers()) {\n> >   \t\tif (d->activeStreams_.find(stream) == d->activeStreams_.end()) {\n> >   \t\t\tLOG(Camera, Error) << \"Invalid request\";\n> >   \t\t\treturn -EINVAL;\n> > diff --git a/src/libcamera/converter/converter_v4l2_m2m.cpp b/src/libcamera/converter/converter_v4l2_m2m.cpp\n> > index 37377ab24952..4427a37c6fc0 100644\n> > --- a/src/libcamera/converter/converter_v4l2_m2m.cpp\n> > +++ b/src/libcamera/converter/converter_v4l2_m2m.cpp\n> > @@ -646,8 +646,8 @@ int V4L2M2MConverter::start()\n> >   {\n> >   \tint ret;\n> >   \n> > -\tfor (auto &iter : streams_) {\n> > -\t\tret = iter.second->start();\n> > +\tfor (auto &[stream, m2mStream] : streams_) {\n> > +\t\tret = m2mStream->start();\n> >   \t\tif (ret < 0) {\n> >   \t\t\tstop();\n> >   \t\t\treturn ret;\n> > @@ -662,8 +662,8 @@ int V4L2M2MConverter::start()\n> >    */\n> >   void V4L2M2MConverter::stop()\n> >   {\n> > -\tfor (auto &iter : streams_)\n> > -\t\titer.second->stop();\n> > +\tfor (auto &[stream, m2mStream] : streams_)\n> > +\t\tm2mStream->stop();\n> >   }\n> >   \n> >   /**\n> > diff --git a/src/libcamera/pipeline/ipu3/cio2.cpp b/src/libcamera/pipeline/ipu3/cio2.cpp\n> > index 6f9c055f4d12..b6fe84fe70cc 100644\n> > --- a/src/libcamera/pipeline/ipu3/cio2.cpp\n> > +++ b/src/libcamera/pipeline/ipu3/cio2.cpp\n> > @@ -82,11 +82,11 @@ std::vector<SizeRange> CIO2Device::sizes(const PixelFormat &format) const\n> >   \t\treturn {};\n> >   \n> >   \tstd::vector<SizeRange> sizes;\n> > -\tfor (const auto &iter : mbusCodesToPixelFormat) {\n> > -\t\tif (iter.second != format)\n> > +\tfor (const auto &[code, pixelFormat] : mbusCodesToPixelFormat) {\n> > +\t\tif (pixelFormat != format)\n> >   \t\t\tcontinue;\n> >   \n> > -\t\tmbusCode = iter.first;\n> > +\t\tmbusCode = code;\n> >   \t\tbreak;\n> >   \t}\n> >   \n> > diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp\n> > index 0190f677e679..bac6f1c2ef40 100644\n> > --- a/src/libcamera/pipeline/ipu3/ipu3.cpp\n> > +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp\n> > @@ -791,8 +791,7 @@ void IPU3CameraData::cancelPendingRequests()\n> >   \twhile (!pendingRequests_.empty()) {\n> >   \t\tRequest *request = pendingRequests_.front();\n> >   \n> > -\t\tfor (auto it : request->buffers()) {\n> > -\t\t\tFrameBuffer *buffer = it.second;\n> > +\t\tfor (const auto &[stream, buffer] : request->buffers()) {\n> >   \t\t\tbuffer->_d()->cancel();\n> >   \t\t\tpipe()->completeBuffer(request, buffer);\n> >   \t\t}\n> > @@ -1225,10 +1224,7 @@ void IPU3CameraData::paramsComputed(unsigned int id)\n> >   \t\treturn;\n> >   \n> >   \t/* Queue all buffers from the request aimed for the ImgU. */\n> > -\tfor (auto it : info->request->buffers()) {\n> > -\t\tconst Stream *stream = it.first;\n> > -\t\tFrameBuffer *outbuffer = it.second;\n> > -\n> > +\tfor (const auto &[stream, outbuffer] : info->request->buffers()) {\n> >   \t\tif (stream == &outStream_)\n> >   \t\t\timgu_->output_->queueBuffer(outbuffer);\n> >   \t\telse if (stream == &vfStream_)\n> > @@ -1304,8 +1300,7 @@ void IPU3CameraData::cio2BufferReady(FrameBuffer *buffer)\n> >   \n> >   \t/* If the buffer is cancelled force a complete of the whole request. */\n> >   \tif (buffer->metadata().status == FrameMetadata::FrameCancelled) {\n> > -\t\tfor (auto it : request->buffers()) {\n> > -\t\t\tFrameBuffer *b = it.second;\n> > +\t\tfor (const auto &[stream, b] : request->buffers()) {\n> >   \t\t\tb->_d()->cancel();\n> >   \t\t\tpipe()->completeBuffer(request, b);\n> >   \t\t}\n> > diff --git a/src/libcamera/pipeline/rpi/common/pipeline_base.cpp b/src/libcamera/pipeline/rpi/common/pipeline_base.cpp\n> > index fb8e466f6e3b..de43603ddf69 100644\n> > --- a/src/libcamera/pipeline/rpi/common/pipeline_base.cpp\n> > +++ b/src/libcamera/pipeline/rpi/common/pipeline_base.cpp\n> > @@ -941,13 +941,12 @@ V4L2SubdeviceFormat CameraData::findBestFormat(const Size &req, unsigned int bit\n> >   \tconstexpr float penaltyBitDepth = 500.0;\n> >   \n> >   \t/* Calculate the closest/best mode from the user requested size. */\n> > -\tfor (const auto &iter : sensorFormats_) {\n> > -\t\tconst unsigned int mbusCode = iter.first;\n> > +\tfor (const auto &[mbusCode, sizes] : sensorFormats_) {\n> >   \t\tconst PixelFormat format = mbusCodeToPixelFormat(mbusCode,\n> >   \t\t\t\t\t\t\t\t BayerFormat::Packing::None);\n> >   \t\tconst PixelFormatInfo &info = PixelFormatInfo::info(format);\n> >   \n> > -\t\tfor (const Size &size : iter.second) {\n> > +\t\tfor (const Size &size : sizes) {\n> >   \t\t\tdouble reqAr = static_cast<double>(req.width) / req.height;\n> >   \t\t\tdouble fmtAr = static_cast<double>(size.width) / size.height;\n> >   \n> > diff --git a/src/libcamera/pipeline/vimc/vimc.cpp b/src/libcamera/pipeline/vimc/vimc.cpp\n> > index 4a03c149a617..08b1007528f2 100644\n> > --- a/src/libcamera/pipeline/vimc/vimc.cpp\n> > +++ b/src/libcamera/pipeline/vimc/vimc.cpp\n> > @@ -405,8 +405,7 @@ int PipelineHandlerVimc::processControls(VimcCameraData *data, Request *request)\n> >   {\n> >   \tControlList controls(data->sensor_->controls());\n> >   \n> > -\tfor (const auto &it : request->controls()) {\n> > -\t\tunsigned int id = it.first;\n> > +\tfor (const auto &[id, value] : request->controls()) {\n> >   \t\tunsigned int offset;\n> >   \t\tuint32_t cid;\n> >   \n> > @@ -423,8 +422,8 @@ int PipelineHandlerVimc::processControls(VimcCameraData *data, Request *request)\n> >   \t\t\tcontinue;\n> >   \t\t}\n> >   \n> > -\t\tint32_t value = std::lround(it.second.get<float>() * 128 + offset);\n> > -\t\tcontrols.set(cid, std::clamp(value, 0, 255));\n> > +\t\tint32_t v4l2Value = std::lround(value.get<float>() * 128 + offset);\n> > +\t\tcontrols.set(cid, std::clamp(v4l2Value, 0, 255));\n> >   \t}\n> >   \n> >   \tfor (const auto &ctrl : controls)\n> > @@ -607,8 +606,7 @@ void VimcCameraData::imageBufferReady(FrameBuffer *buffer)\n> >   \n> >   \t/* If the buffer is cancelled force a complete of the whole request. */\n> >   \tif (buffer->metadata().status == FrameMetadata::FrameCancelled) {\n> > -\t\tfor (auto it : request->buffers()) {\n> > -\t\t\tFrameBuffer *b = it.second;\n> > +\t\tfor (const auto &[stream, b] : request->buffers()) {\n> >   \t\t\tb->_d()->cancel();\n> >   \t\t\tpipe->completeBuffer(request, b);\n> >   \t\t}\n> > diff --git a/src/libcamera/sensor/camera_sensor_legacy.cpp b/src/libcamera/sensor/camera_sensor_legacy.cpp\n> > index 39c34200b0ff..6a683821f219 100644\n> > --- a/src/libcamera/sensor/camera_sensor_legacy.cpp\n> > +++ b/src/libcamera/sensor/camera_sensor_legacy.cpp\n> > @@ -536,8 +536,8 @@ void CameraSensorLegacy::initTestPatternModes()\n> >   \t * list of supported test patterns.\n> >   \t */\n> >   \tstd::map<int32_t, controls::draft::TestPatternModeEnum> indexToTestPatternMode;\n> > -\tfor (const auto &it : testPatternModes)\n> > -\t\tindexToTestPatternMode[it.second] = it.first;\n> > +\tfor (const auto &[mode, index] : testPatternModes)\n> > +\t\tindexToTestPatternMode[index] = mode;\n> >   \n> >   \tfor (const ControlValue &value : v4l2TestPattern->second.values()) {\n> >   \t\tconst int32_t index = value.get<int32_t>();\n> > diff --git a/src/libcamera/sensor/camera_sensor_raw.cpp b/src/libcamera/sensor/camera_sensor_raw.cpp\n> > index 81d8985ee134..10eba0331fe8 100644\n> > --- a/src/libcamera/sensor/camera_sensor_raw.cpp\n> > +++ b/src/libcamera/sensor/camera_sensor_raw.cpp\n> > @@ -720,8 +720,8 @@ void CameraSensorRaw::initTestPatternModes()\n> >   \t * list of supported test patterns.\n> >   \t */\n> >   \tstd::map<int32_t, controls::draft::TestPatternModeEnum> indexToTestPatternMode;\n> > -\tfor (const auto &it : testPatternModes)\n> > -\t\tindexToTestPatternMode[it.second] = it.first;\n> > +\tfor (const auto &[mode, index] : testPatternModes)\n> > +\t\tindexToTestPatternMode[index] = mode;\n> >   \n> >   \tfor (const ControlValue &value : v4l2TestPattern->second.values()) {\n> >   \t\tconst int32_t index = value.get<int32_t>();\n> > diff --git a/src/libcamera/software_isp/software_isp.cpp b/src/libcamera/software_isp/software_isp.cpp\n> > index a83986b787b7..167aaa0441c9 100644\n> > --- a/src/libcamera/software_isp/software_isp.cpp\n> > +++ b/src/libcamera/software_isp/software_isp.cpp\n> > @@ -330,8 +330,7 @@ int SoftwareIsp::queueBuffers(uint32_t frame, FrameBuffer *input,\n> >   \n> >   \tqueuedInputBuffers_.push_back(input);\n> >   \n> > -\tfor (auto iter = outputs.begin(); iter != outputs.end(); iter++) {\n> > -\t\tFrameBuffer *const buffer = iter->second;\n> > +\tfor (const auto &[stream, buffer] : outputs) {\n> >   \t\tqueuedOutputBuffers_.push_back(buffer);\n> >   \t\tprocess(frame, input, buffer);\n> >   \t}\n> > diff --git a/src/libcamera/stream.cpp b/src/libcamera/stream.cpp\n> > index f091487c9353..8df70dbfd10b 100644\n> > --- a/src/libcamera/stream.cpp\n> > +++ b/src/libcamera/stream.cpp\n> > @@ -108,8 +108,8 @@ std::vector<PixelFormat> StreamFormats::pixelformats() const\n> >   {\n> >   \tstd::vector<PixelFormat> formats;\n> >   \n> > -\tfor (auto const &it : formats_)\n> > -\t\tformats.push_back(it.first);\n> > +\tfor (const auto &[format, sizes] : formats_)\n> > +\t\tformats.push_back(format);\n> >   \n> >   \treturn formats;\n> >   }\n> > diff --git a/src/libcamera/v4l2_videodevice.cpp b/src/libcamera/v4l2_videodevice.cpp\n> > index 25b61d049a0e..61a4551c63c5 100644\n> > --- a/src/libcamera/v4l2_videodevice.cpp\n> > +++ b/src/libcamera/v4l2_videodevice.cpp\n> > @@ -2042,10 +2042,8 @@ int V4L2VideoDevice::streamOff()\n> >   \tstate_ = State::Stopping;\n> >   \n> >   \t/* Send back all queued buffers. */\n> > -\tfor (auto it : queuedBuffers_) {\n> > -\t\tFrameBuffer *buffer = it.second;\n> > -\n> > -\t\tcache_->put(it.first);\n> > +\tfor (const auto &[id, buffer] : queuedBuffers_) {\n> > +\t\tcache_->put(id);\n> >   \t\tbuffer->_d()->cancel();\n> >   \t\tbufferReady.emit(buffer);\n> >   \t}","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 E9DE6C0DA4\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu, 19 Feb 2026 14:36:35 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id F1B2662255;\n\tThu, 19 Feb 2026 15:36:34 +0100 (CET)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 54588620C9\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 19 Feb 2026 15:36:33 +0100 (CET)","from killaraus.ideasonboard.com (unknown [83.245.237.175])\n\tby perceval.ideasonboard.com (Postfix) with UTF8SMTPSA id 811364D3;\n\tThu, 19 Feb 2026 15:35:39 +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=\"U8icoSrQ\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1771511740;\n\tbh=zLVTd58fJbycsXnmXm2Ai2UwhCKUWXLyMkl4iyV/ssk=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=U8icoSrQ9yrvulRDm+udWy1j/tyQ36VVwzk7EAsLQ5gxBQVE2VC76VP4/O12bRu1f\n\tFLkw5ImOypPR1eQz4Y95CsCAM9J0E21keUhK8eKtyzEYXVdJWVzQxWiEDQ1bXX6LE1\n\toG3oD+RvkUSBURyx0Ndj6oUF+d/BwRsuqaOdNf3A=","Date":"Thu, 19 Feb 2026 15:36:29 +0100","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 v2 1/4] libcamera: Replace iterators with structured\n\tbindings","Message-ID":"<20260219143629.GS520738@killaraus.ideasonboard.com>","References":"<20260212151238.3736234-1-laurent.pinchart@ideasonboard.com>\n\t<20260212151238.3736234-2-laurent.pinchart@ideasonboard.com>\n\t<1cc044d4-5140-49f4-821c-6649933d43cd@ideasonboard.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","Content-Transfer-Encoding":"8bit","In-Reply-To":"<1cc044d4-5140-49f4-821c-6649933d43cd@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>"}}]