From patchwork Thu Feb 12 15:12:35 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 26137 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id 720CBBD78E for ; Thu, 12 Feb 2026 15:12:45 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 061D3621D7; Thu, 12 Feb 2026 16:12:43 +0100 (CET) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="SN1FIDfg"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 6A02062181 for ; Thu, 12 Feb 2026 16:12:41 +0100 (CET) Received: from killaraus.ideasonboard.com (2001-14ba-703d-e500--2a1.rev.dnainternet.fi [IPv6:2001:14ba:703d:e500::2a1]) by perceval.ideasonboard.com (Postfix) with UTF8SMTPSA id 5EEFD492 for ; Thu, 12 Feb 2026 16:11:53 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1770909113; bh=0YoYr555kLE2sbHXfYUIU5Iy3OLe/YpAr+bY/jGzJZc=; h=From:To:Subject:Date:In-Reply-To:References:From; b=SN1FIDfgAFaNnOI3gENkBd9BgpC+7lHsbLZiX8/vC4Motw3zl5fRbwsd+dHzvscD4 Jn91hHsXn7AQbe70AK53GDfVpWVA/Cp8BK6lS1R0+ybroVkaMu/OEjVpTD7WLUhKpX ZeERB4DqZq7+qTRZVXWEjz9MhRBcnbHx8cKl694s= From: Laurent Pinchart To: libcamera-devel@lists.libcamera.org Subject: [PATCH v2 1/4] libcamera: Replace iterators with structured bindings Date: Thu, 12 Feb 2026 17:12:35 +0200 Message-ID: <20260212151238.3736234-2-laurent.pinchart@ideasonboard.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260212151238.3736234-1-laurent.pinchart@ideasonboard.com> References: <20260212151238.3736234-1-laurent.pinchart@ideasonboard.com> MIME-Version: 1.0 X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" Use structured bindings when iterating over a map in range-based for loops. This improves readability. Signed-off-by: Laurent Pinchart --- Changes since v1: - Standardize on 'const auto &' - Replace more iterators --- include/libcamera/internal/ipa_data_serializer.h | 6 +++--- src/apps/common/options.cpp | 6 ++---- src/gstreamer/gstlibcamera-controls.cpp.in | 7 +------ src/libcamera/camera.cpp | 4 +--- src/libcamera/converter/converter_v4l2_m2m.cpp | 8 ++++---- src/libcamera/pipeline/ipu3/cio2.cpp | 6 +++--- src/libcamera/pipeline/ipu3/ipu3.cpp | 11 +++-------- src/libcamera/pipeline/rpi/common/pipeline_base.cpp | 5 ++--- src/libcamera/pipeline/vimc/vimc.cpp | 10 ++++------ src/libcamera/sensor/camera_sensor_legacy.cpp | 4 ++-- src/libcamera/sensor/camera_sensor_raw.cpp | 4 ++-- src/libcamera/software_isp/software_isp.cpp | 3 +-- src/libcamera/stream.cpp | 4 ++-- src/libcamera/v4l2_videodevice.cpp | 6 ++---- 14 files changed, 32 insertions(+), 52 deletions(-) diff --git a/include/libcamera/internal/ipa_data_serializer.h b/include/libcamera/internal/ipa_data_serializer.h index 927f5c4c7337..61bada52f691 100644 --- a/include/libcamera/internal/ipa_data_serializer.h +++ b/include/libcamera/internal/ipa_data_serializer.h @@ -211,12 +211,12 @@ public: appendPOD(dataVec, mapLen); /* Serialize the members. */ - for (auto const &it : data) { + for (const auto &[key, value] : data) { std::vector dvec; std::vector fvec; std::tie(dvec, fvec) = - IPADataSerializer::serialize(it.first, cs); + IPADataSerializer::serialize(key, cs); appendPOD(dataVec, dvec.size()); appendPOD(dataVec, fvec.size()); @@ -225,7 +225,7 @@ public: fdsVec.insert(fdsVec.end(), fvec.begin(), fvec.end()); std::tie(dvec, fvec) = - IPADataSerializer::serialize(it.second, cs); + IPADataSerializer::serialize(value, cs); appendPOD(dataVec, dvec.size()); appendPOD(dataVec, fvec.size()); diff --git a/src/apps/common/options.cpp b/src/apps/common/options.cpp index b4ea1afe2136..b95f95afadf3 100644 --- a/src/apps/common/options.cpp +++ b/src/apps/common/options.cpp @@ -423,8 +423,7 @@ unsigned int KeyValueParser::maxOptionLength() const { unsigned int maxLength = 0; - for (auto const &iter : optionsMap_) { - const Option &option = iter.second; + for (const auto &[name, option] : optionsMap_) { unsigned int length = 10 + strlen(option.name); if (option.argument != ArgumentNone) length += 1 + strlen(option.typeName()); @@ -440,8 +439,7 @@ unsigned int KeyValueParser::maxOptionLength() const void KeyValueParser::usage(int indent) { - for (auto const &iter : optionsMap_) { - const Option &option = iter.second; + for (const auto &[name, option] : optionsMap_) { std::string argument = std::string(" ") + option.name; if (option.argument != ArgumentNone) { diff --git a/src/gstreamer/gstlibcamera-controls.cpp.in b/src/gstreamer/gstlibcamera-controls.cpp.in index 6faf3ee7a6c3..c3f0695f9b90 100644 --- a/src/gstreamer/gstlibcamera-controls.cpp.in +++ b/src/gstreamer/gstlibcamera-controls.cpp.in @@ -252,12 +252,7 @@ void GstCameraControls::setCamera(const std::shared_ptr &cam) * the pipeline has started and thus before the camera was known. */ ControlList new_controls; - for (auto control = controls_acc_.begin(); - control != controls_acc_.end(); - ++control) { - unsigned int id = control->first; - ControlValue value = control->second; - + for (const auto &[id, value] : controls_acc_) { const ControlId *cid = capabilities_.idmap().at(id); auto info = capabilities_.find(cid); diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp index 7c0e93ff483f..f724a1be5e3d 100644 --- a/src/libcamera/camera.cpp +++ b/src/libcamera/camera.cpp @@ -1362,9 +1362,7 @@ int Camera::queueRequest(Request *request) return -EINVAL; } - for (auto const &it : request->buffers()) { - const Stream *stream = it.first; - + for (const auto &[stream, buffer] : request->buffers()) { if (d->activeStreams_.find(stream) == d->activeStreams_.end()) { LOG(Camera, Error) << "Invalid request"; return -EINVAL; diff --git a/src/libcamera/converter/converter_v4l2_m2m.cpp b/src/libcamera/converter/converter_v4l2_m2m.cpp index 37377ab24952..4427a37c6fc0 100644 --- a/src/libcamera/converter/converter_v4l2_m2m.cpp +++ b/src/libcamera/converter/converter_v4l2_m2m.cpp @@ -646,8 +646,8 @@ int V4L2M2MConverter::start() { int ret; - for (auto &iter : streams_) { - ret = iter.second->start(); + for (auto &[stream, m2mStream] : streams_) { + ret = m2mStream->start(); if (ret < 0) { stop(); return ret; @@ -662,8 +662,8 @@ int V4L2M2MConverter::start() */ void V4L2M2MConverter::stop() { - for (auto &iter : streams_) - iter.second->stop(); + for (auto &[stream, m2mStream] : streams_) + m2mStream->stop(); } /** diff --git a/src/libcamera/pipeline/ipu3/cio2.cpp b/src/libcamera/pipeline/ipu3/cio2.cpp index 6f9c055f4d12..b6fe84fe70cc 100644 --- a/src/libcamera/pipeline/ipu3/cio2.cpp +++ b/src/libcamera/pipeline/ipu3/cio2.cpp @@ -82,11 +82,11 @@ std::vector CIO2Device::sizes(const PixelFormat &format) const return {}; std::vector sizes; - for (const auto &iter : mbusCodesToPixelFormat) { - if (iter.second != format) + for (const auto &[code, pixelFormat] : mbusCodesToPixelFormat) { + if (pixelFormat != format) continue; - mbusCode = iter.first; + mbusCode = code; break; } diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp index 0190f677e679..bac6f1c2ef40 100644 --- a/src/libcamera/pipeline/ipu3/ipu3.cpp +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp @@ -791,8 +791,7 @@ void IPU3CameraData::cancelPendingRequests() while (!pendingRequests_.empty()) { Request *request = pendingRequests_.front(); - for (auto it : request->buffers()) { - FrameBuffer *buffer = it.second; + for (const auto &[stream, buffer] : request->buffers()) { buffer->_d()->cancel(); pipe()->completeBuffer(request, buffer); } @@ -1225,10 +1224,7 @@ void IPU3CameraData::paramsComputed(unsigned int id) return; /* Queue all buffers from the request aimed for the ImgU. */ - for (auto it : info->request->buffers()) { - const Stream *stream = it.first; - FrameBuffer *outbuffer = it.second; - + for (const auto &[stream, outbuffer] : info->request->buffers()) { if (stream == &outStream_) imgu_->output_->queueBuffer(outbuffer); else if (stream == &vfStream_) @@ -1304,8 +1300,7 @@ void IPU3CameraData::cio2BufferReady(FrameBuffer *buffer) /* If the buffer is cancelled force a complete of the whole request. */ if (buffer->metadata().status == FrameMetadata::FrameCancelled) { - for (auto it : request->buffers()) { - FrameBuffer *b = it.second; + for (const auto &[stream, b] : request->buffers()) { b->_d()->cancel(); pipe()->completeBuffer(request, b); } diff --git a/src/libcamera/pipeline/rpi/common/pipeline_base.cpp b/src/libcamera/pipeline/rpi/common/pipeline_base.cpp index fb8e466f6e3b..de43603ddf69 100644 --- a/src/libcamera/pipeline/rpi/common/pipeline_base.cpp +++ b/src/libcamera/pipeline/rpi/common/pipeline_base.cpp @@ -941,13 +941,12 @@ V4L2SubdeviceFormat CameraData::findBestFormat(const Size &req, unsigned int bit constexpr float penaltyBitDepth = 500.0; /* Calculate the closest/best mode from the user requested size. */ - for (const auto &iter : sensorFormats_) { - const unsigned int mbusCode = iter.first; + for (const auto &[mbusCode, sizes] : sensorFormats_) { const PixelFormat format = mbusCodeToPixelFormat(mbusCode, BayerFormat::Packing::None); const PixelFormatInfo &info = PixelFormatInfo::info(format); - for (const Size &size : iter.second) { + for (const Size &size : sizes) { double reqAr = static_cast(req.width) / req.height; double fmtAr = static_cast(size.width) / size.height; diff --git a/src/libcamera/pipeline/vimc/vimc.cpp b/src/libcamera/pipeline/vimc/vimc.cpp index 4a03c149a617..08b1007528f2 100644 --- a/src/libcamera/pipeline/vimc/vimc.cpp +++ b/src/libcamera/pipeline/vimc/vimc.cpp @@ -405,8 +405,7 @@ int PipelineHandlerVimc::processControls(VimcCameraData *data, Request *request) { ControlList controls(data->sensor_->controls()); - for (const auto &it : request->controls()) { - unsigned int id = it.first; + for (const auto &[id, value] : request->controls()) { unsigned int offset; uint32_t cid; @@ -423,8 +422,8 @@ int PipelineHandlerVimc::processControls(VimcCameraData *data, Request *request) continue; } - int32_t value = std::lround(it.second.get() * 128 + offset); - controls.set(cid, std::clamp(value, 0, 255)); + int32_t v4l2Value = std::lround(value.get() * 128 + offset); + controls.set(cid, std::clamp(v4l2Value, 0, 255)); } for (const auto &ctrl : controls) @@ -607,8 +606,7 @@ void VimcCameraData::imageBufferReady(FrameBuffer *buffer) /* If the buffer is cancelled force a complete of the whole request. */ if (buffer->metadata().status == FrameMetadata::FrameCancelled) { - for (auto it : request->buffers()) { - FrameBuffer *b = it.second; + for (const auto &[stream, b] : request->buffers()) { b->_d()->cancel(); pipe->completeBuffer(request, b); } diff --git a/src/libcamera/sensor/camera_sensor_legacy.cpp b/src/libcamera/sensor/camera_sensor_legacy.cpp index 39c34200b0ff..6a683821f219 100644 --- a/src/libcamera/sensor/camera_sensor_legacy.cpp +++ b/src/libcamera/sensor/camera_sensor_legacy.cpp @@ -536,8 +536,8 @@ void CameraSensorLegacy::initTestPatternModes() * list of supported test patterns. */ std::map indexToTestPatternMode; - for (const auto &it : testPatternModes) - indexToTestPatternMode[it.second] = it.first; + for (const auto &[mode, index] : testPatternModes) + indexToTestPatternMode[index] = mode; for (const ControlValue &value : v4l2TestPattern->second.values()) { const int32_t index = value.get(); diff --git a/src/libcamera/sensor/camera_sensor_raw.cpp b/src/libcamera/sensor/camera_sensor_raw.cpp index 81d8985ee134..10eba0331fe8 100644 --- a/src/libcamera/sensor/camera_sensor_raw.cpp +++ b/src/libcamera/sensor/camera_sensor_raw.cpp @@ -720,8 +720,8 @@ void CameraSensorRaw::initTestPatternModes() * list of supported test patterns. */ std::map indexToTestPatternMode; - for (const auto &it : testPatternModes) - indexToTestPatternMode[it.second] = it.first; + for (const auto &[mode, index] : testPatternModes) + indexToTestPatternMode[index] = mode; for (const ControlValue &value : v4l2TestPattern->second.values()) { const int32_t index = value.get(); diff --git a/src/libcamera/software_isp/software_isp.cpp b/src/libcamera/software_isp/software_isp.cpp index a83986b787b7..167aaa0441c9 100644 --- a/src/libcamera/software_isp/software_isp.cpp +++ b/src/libcamera/software_isp/software_isp.cpp @@ -330,8 +330,7 @@ int SoftwareIsp::queueBuffers(uint32_t frame, FrameBuffer *input, queuedInputBuffers_.push_back(input); - for (auto iter = outputs.begin(); iter != outputs.end(); iter++) { - FrameBuffer *const buffer = iter->second; + for (const auto &[stream, buffer] : outputs) { queuedOutputBuffers_.push_back(buffer); process(frame, input, buffer); } diff --git a/src/libcamera/stream.cpp b/src/libcamera/stream.cpp index f091487c9353..8df70dbfd10b 100644 --- a/src/libcamera/stream.cpp +++ b/src/libcamera/stream.cpp @@ -108,8 +108,8 @@ std::vector StreamFormats::pixelformats() const { std::vector formats; - for (auto const &it : formats_) - formats.push_back(it.first); + for (const auto &[format, sizes] : formats_) + formats.push_back(format); return formats; } diff --git a/src/libcamera/v4l2_videodevice.cpp b/src/libcamera/v4l2_videodevice.cpp index 25b61d049a0e..61a4551c63c5 100644 --- a/src/libcamera/v4l2_videodevice.cpp +++ b/src/libcamera/v4l2_videodevice.cpp @@ -2042,10 +2042,8 @@ int V4L2VideoDevice::streamOff() state_ = State::Stopping; /* Send back all queued buffers. */ - for (auto it : queuedBuffers_) { - FrameBuffer *buffer = it.second; - - cache_->put(it.first); + for (const auto &[id, buffer] : queuedBuffers_) { + cache_->put(id); buffer->_d()->cancel(); bufferReady.emit(buffer); }