{"id":26193,"url":"https://patchwork.libcamera.org/api/1.1/patches/26193/?format=json","web_url":"https://patchwork.libcamera.org/patch/26193/","project":{"id":1,"url":"https://patchwork.libcamera.org/api/1.1/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":"<20260219144040.1615042-2-laurent.pinchart@ideasonboard.com>","date":"2026-02-19T14:40:37","name":"[v3,1/4] libcamera: Replace iterators with structured bindings","commit_ref":"be88125af147c13fce979a518d7c3e6a957204c3","pull_url":null,"state":"accepted","archived":false,"hash":"ee9baedd3641ff51f8317c3bbfee9762aa1508e0","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/1.1/people/2/?format=json","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"delegate":null,"mbox":"https://patchwork.libcamera.org/patch/26193/mbox/","series":[{"id":5801,"url":"https://patchwork.libcamera.org/api/1.1/series/5801/?format=json","web_url":"https://patchwork.libcamera.org/project/libcamera/list/?series=5801","date":"2026-02-19T14:40:36","name":"libcamera: Clean up iterators","version":3,"mbox":"https://patchwork.libcamera.org/series/5801/mbox/"}],"comments":"https://patchwork.libcamera.org/api/patches/26193/comments/","check":"pending","checks":"https://patchwork.libcamera.org/api/patches/26193/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 D91E5C31E9\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu, 19 Feb 2026 14:40:49 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 95ADF62255;\n\tThu, 19 Feb 2026 15:40:49 +0100 (CET)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id E94EC6224D\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 19 Feb 2026 15:40:47 +0100 (CET)","from killaraus.ideasonboard.com (unknown [83.245.237.175])\n\tby perceval.ideasonboard.com (Postfix) with UTF8SMTPSA id 6F94855C\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 19 Feb 2026 15:39:54 +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=\"cfdoqrMK\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1771511994;\n\tbh=Lk4SG+AEgpuk0U/jySEWMS0Fwj6+z2kAeyLeT3DFiSQ=;\n\th=From:To:Subject:Date:In-Reply-To:References:From;\n\tb=cfdoqrMKrxjXkMf+8kjN5/khBAj0H0NfYBjeiA3LQ/qs0oXaFJTmUrZ8L+z58xe4r\n\todk3v1kO4nYAG78L0iaa/FqlBBCvotBs4LQBGhYtsaXEfw3oEdQI6xd6UrnFERFTZ6\n\teqmiaSqcQTyEHkaDEaqLhKb4ZvUmdKpBlwcZX7Z0=","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"libcamera-devel@lists.libcamera.org","Subject":"[PATCH v3 1/4] libcamera: Replace iterators with structured bindings","Date":"Thu, 19 Feb 2026 15:40:37 +0100","Message-ID":"<20260219144040.1615042-2-laurent.pinchart@ideasonboard.com>","X-Mailer":"git-send-email 2.52.0","In-Reply-To":"<20260219144040.1615042-1-laurent.pinchart@ideasonboard.com>","References":"<20260219144040.1615042-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":"Use structured bindings when iterating over a map in range-based for\nloops. This improves readability.\n\nSigned-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\nReviewed-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>\n---\nChanges since v2:\n\n- Address Request::reuse()\n\nChanges since v1:\n\n- Standardize on 'const auto &'\n- Replace more iterators\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/request.cpp                           |  3 +--\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 15 files changed, 33 insertions(+), 54 deletions(-)","diff":"diff --git a/include/libcamera/internal/ipa_data_serializer.h b/include/libcamera/internal/ipa_data_serializer.h\nindex 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());\ndiff --git a/src/apps/common/options.cpp b/src/apps/common/options.cpp\nindex 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) {\ndiff --git a/src/gstreamer/gstlibcamera-controls.cpp.in b/src/gstreamer/gstlibcamera-controls.cpp.in\nindex 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 \ndiff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp\nindex 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;\ndiff --git a/src/libcamera/converter/converter_v4l2_m2m.cpp b/src/libcamera/converter/converter_v4l2_m2m.cpp\nindex 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 /**\ndiff --git a/src/libcamera/pipeline/ipu3/cio2.cpp b/src/libcamera/pipeline/ipu3/cio2.cpp\nindex 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 \ndiff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp\nindex 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}\ndiff --git a/src/libcamera/pipeline/rpi/common/pipeline_base.cpp b/src/libcamera/pipeline/rpi/common/pipeline_base.cpp\nindex 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 \ndiff --git a/src/libcamera/pipeline/vimc/vimc.cpp b/src/libcamera/pipeline/vimc/vimc.cpp\nindex 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}\ndiff --git a/src/libcamera/request.cpp b/src/libcamera/request.cpp\nindex 57f1f060d5b4..b50a64205283 100644\n--- a/src/libcamera/request.cpp\n+++ b/src/libcamera/request.cpp\n@@ -392,8 +392,7 @@ void Request::reuse(ReuseFlag flags)\n \t_d()->reset();\n \n \tif (flags & ReuseBuffers) {\n-\t\tfor (auto pair : bufferMap_) {\n-\t\t\tFrameBuffer *buffer = pair.second;\n+\t\tfor (const auto &[stream, buffer] : bufferMap_) {\n \t\t\tbuffer->_d()->setRequest(this);\n \t\t\t_d()->pending_.insert(buffer);\n \t\t}\ndiff --git a/src/libcamera/sensor/camera_sensor_legacy.cpp b/src/libcamera/sensor/camera_sensor_legacy.cpp\nindex 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>();\ndiff --git a/src/libcamera/sensor/camera_sensor_raw.cpp b/src/libcamera/sensor/camera_sensor_raw.cpp\nindex 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>();\ndiff --git a/src/libcamera/software_isp/software_isp.cpp b/src/libcamera/software_isp/software_isp.cpp\nindex c2baaf0bf276..562cdba225d5 100644\n--- a/src/libcamera/software_isp/software_isp.cpp\n+++ b/src/libcamera/software_isp/software_isp.cpp\n@@ -332,8 +332,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}\ndiff --git a/src/libcamera/stream.cpp b/src/libcamera/stream.cpp\nindex 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 }\ndiff --git a/src/libcamera/v4l2_videodevice.cpp b/src/libcamera/v4l2_videodevice.cpp\nindex 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}\n","prefixes":["v3","1/4"]}