Patch Detail
Show a patch.
GET /api/patches/26523/?format=api
{ "id": 26523, "url": "https://patchwork.libcamera.org/api/patches/26523/?format=api", "web_url": "https://patchwork.libcamera.org/patch/26523/", "project": { "id": 1, "url": "https://patchwork.libcamera.org/api/projects/1/?format=api", "name": "libcamera", "link_name": "libcamera", "list_id": "libcamera_core", "list_email": "libcamera-devel@lists.libcamera.org", "web_url": "", "scm_url": "", "webscm_url": "" }, "msgid": "<20260423230059.3180987-2-laurent.pinchart@ideasonboard.com>", "date": "2026-04-23T23:00:23", "name": "[v3,01/37] libcamera: utils: Add overloaded visitor helpers", "commit_ref": null, "pull_url": null, "state": "superseded", "archived": false, "hash": "9acd6cabe59adea62c118575940a8321940365c2", "submitter": { "id": 2, "url": "https://patchwork.libcamera.org/api/people/2/?format=api", "name": "Laurent Pinchart", "email": "laurent.pinchart@ideasonboard.com" }, "delegate": null, "mbox": "https://patchwork.libcamera.org/patch/26523/mbox/", "series": [ { "id": 5883, "url": "https://patchwork.libcamera.org/api/series/5883/?format=api", "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=5883", "date": "2026-04-23T23:00:22", "name": "libcamera: Global configuration file improvements", "version": 3, "mbox": "https://patchwork.libcamera.org/series/5883/mbox/" } ], "comments": "https://patchwork.libcamera.org/api/patches/26523/comments/", "check": "pending", "checks": "https://patchwork.libcamera.org/api/patches/26523/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 6E6C1BDCB5\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu, 23 Apr 2026 23:01:05 +0000 (UTC)", "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 02DF262F5E;\n\tFri, 24 Apr 2026 01:01:05 +0200 (CEST)", "from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id AEF5C62EAA\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 24 Apr 2026 01:01:02 +0200 (CEST)", "from killaraus.ideasonboard.com\n\t(2001-14ba-703d-e500--2a1.rev.dnainternet.fi\n\t[IPv6:2001:14ba:703d:e500::2a1])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id B8D7134;\n\tFri, 24 Apr 2026 00:59:22 +0200 (CEST)" ], "Authentication-Results": "lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"bdTGOPZy\"; dkim-atps=neutral", "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1776985162;\n\tbh=sKNd9y42pqTvjlTDTe3/j20UzQr4dKfSyUqd6SGOC4g=;\n\th=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n\tb=bdTGOPZyqfQmBxxBjvbDPl/Wi7lRrCLC5asUFH+2uKFD1xca2SLZNWyGb85xq4o3o\n\tEMep/xrf607KBIrNMtX3c2FTK8EJ14Uu1Z02cbZkXdgl2Ao7/NpxxTjgtgmK2qTloM\n\tTzejCWDa1sOWfdeTUkY0uWZGBaxBO/NVr9M6yju0=", "From": "Laurent Pinchart <laurent.pinchart@ideasonboard.com>", "To": "libcamera-devel@lists.libcamera.org", "Cc": "Jacopo Mondi <jacopo.mondi@ideasonboard.com>", "Subject": "[PATCH v3 01/37] libcamera: utils: Add overloaded visitor helpers", "Date": "Fri, 24 Apr 2026 02:00:23 +0300", "Message-ID": "<20260423230059.3180987-2-laurent.pinchart@ideasonboard.com>", "X-Mailer": "git-send-email 2.53.0", "In-Reply-To": "<20260423230059.3180987-1-laurent.pinchart@ideasonboard.com>", "References": "<20260423230059.3180987-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": "From: Jacopo Mondi <jacopo.mondi@ideasonboard.com>\n\nstd::visit() allows quite elegant type-matching implementation of the\nvisitor pattern.\n\nThe 'overloaded' type helpers allow to define a hierarchy of overloaded\noperator() implementations which can be used by std::visit().\n\nCurrently only the Virtual pipeline handler uses this type-matching\nimplementation of std::visit(). To prepare to add another user in the\nMali C55 pipeline handler move the 'overloaded' helper type to\nlibcamera::utils for easier re-use.\n\nSigned-off-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>\nReviewed-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>\nReviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\nSigned-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n---\nChanges since v8 of \"[PATCH v8 0/8] libcamera: mali-c55: Add support for memory-to-memory\":\n\n- Small improvements to documentation\n- Drop documentation of deduction guide\n---\n include/libcamera/base/utils.h | 9 +++++++\n src/libcamera/base/utils.cpp | 30 ++++++++++++++++++++++\n src/libcamera/pipeline/virtual/virtual.cpp | 10 ++------\n 3 files changed, 41 insertions(+), 8 deletions(-)", "diff": "diff --git a/include/libcamera/base/utils.h b/include/libcamera/base/utils.h\nindex 7083b7ce9ce9..b33a4c644a87 100644\n--- a/include/libcamera/base/utils.h\n+++ b/include/libcamera/base/utils.h\n@@ -37,6 +37,15 @@ namespace libcamera {\n \n namespace utils {\n \n+template<class... Ts>\n+struct overloaded : Ts... {\n+\tusing Ts::operator()...;\n+};\n+#ifndef __DOXYGEN__\n+template<class... Ts>\n+overloaded(Ts...) -> overloaded<Ts...>;\n+#endif\n+\n const char *basename(const char *path);\n \n char *secure_getenv(const char *name);\ndiff --git a/src/libcamera/base/utils.cpp b/src/libcamera/base/utils.cpp\nindex 42a516097be2..4ab2bd863e11 100644\n--- a/src/libcamera/base/utils.cpp\n+++ b/src/libcamera/base/utils.cpp\n@@ -23,6 +23,36 @@ namespace libcamera {\n \n namespace utils {\n \n+/**\n+ * \\struct overloaded\n+ * \\brief Helper type for type-matching std::visit() implementations\n+ * \\tparam Ts... Template arguments pack of visitors\n+ *\n+ * Expand the template argument pack \\a Ts... to provide overloaded \\a\n+ * operator() to support type-matching implementations of the visitor design\n+ * pattern using std::visit().\n+ *\n+ * An example is provided by the C++ standard library documentation in the form\n+ * of:\n+ *\n+ * \\code{.cpp}\n+ * template<class... Ts> struct overloaded : Ts... { using Ts::operator()...; };\n+ * template<class... Ts> overloaded(Ts...) -> overloaded<Ts...>;\n+ *\n+ * using var_t = std::variant<int, long, double, std::string>;\n+ * std::vector<var_t> vec = {10, 15l, 1.5, \"hello\"};\n+ *\n+ * for (auto& v: vec) {\n+ * \tstd::visit(overloaded {\n+ * \t\t[](auto arg) { std::cout << arg << ' '; },\n+ * \t\t[](double arg) { std::cout << std::fixed << arg << ' '; },\n+ * \t\t[](const std::string& arg) { std::cout << std::quoted(arg) << ' '; },\n+ * \t}, v);\n+ * \\endcode\n+ *\n+ * Use this helper to implement type-matching visitors using std::visit().\n+ */\n+\n /**\n * \\brief Strip the directory prefix from the path\n * \\param[in] path The path to process\ndiff --git a/src/libcamera/pipeline/virtual/virtual.cpp b/src/libcamera/pipeline/virtual/virtual.cpp\nindex efd800ebe3d6..e8ef7e524ccf 100644\n--- a/src/libcamera/pipeline/virtual/virtual.cpp\n+++ b/src/libcamera/pipeline/virtual/virtual.cpp\n@@ -23,6 +23,7 @@\n \n #include <libcamera/base/flags.h>\n #include <libcamera/base/log.h>\n+#include <libcamera/base/utils.h>\n \n #include <libcamera/control_ids.h>\n #include <libcamera/controls.h>\n@@ -57,13 +58,6 @@ uint64_t currentTimestamp()\n \n } /* namespace */\n \n-template<class... Ts>\n-struct overloaded : Ts... {\n-\tusing Ts::operator()...;\n-};\n-template<class... Ts>\n-overloaded(Ts...) -> overloaded<Ts...>;\n-\n class VirtualCameraConfiguration : public CameraConfiguration\n {\n public:\n@@ -428,7 +422,7 @@ bool PipelineHandlerVirtual::initFrameGenerator(Camera *camera)\n {\n \tauto data = cameraData(camera);\n \tauto &frame = data->config_.frame;\n-\tstd::visit(overloaded{\n+\tstd::visit(utils::overloaded{\n \t\t\t [&](TestPattern &testPattern) {\n \t\t\t\t for (auto &streamConfig : data->streamConfigs_) {\n \t\t\t\t\t if (testPattern == TestPattern::DiagonalLines)\n", "prefixes": [ "v3", "01/37" ] }