[{"id":38645,"web_url":"https://patchwork.libcamera.org/comment/38645/","msgid":"<aesoHcmXW2nuS6kx@zed>","date":"2026-04-24T08:22:02","subject":"Re: [PATCH v3 01/37] libcamera: utils: Add overloaded visitor\n\thelpers","submitter":{"id":143,"url":"https://patchwork.libcamera.org/api/people/143/","name":"Jacopo Mondi","email":"jacopo.mondi@ideasonboard.com"},"content":"Hi Laurent\n\nOn Fri, Apr 24, 2026 at 02:00:23AM +0300, Laurent Pinchart wrote:\n> From: Jacopo Mondi <jacopo.mondi@ideasonboard.com>\n>\n> std::visit() allows quite elegant type-matching implementation of the\n> visitor pattern.\n>\n> The 'overloaded' type helpers allow to define a hierarchy of overloaded\n> operator() implementations which can be used by std::visit().\n>\n> Currently only the Virtual pipeline handler uses this type-matching\n> implementation of std::visit(). To prepare to add another user in the\n> Mali C55 pipeline handler move the 'overloaded' helper type to\n> libcamera::utils for easier re-use.\n>\n> Signed-off-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>\n> Reviewed-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>\n> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> ---\n> Changes 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\nFine with me\nReviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>\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(-)\n>\n> diff --git a/include/libcamera/base/utils.h b/include/libcamera/base/utils.h\n> index 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);\n> diff --git a/src/libcamera/base/utils.cpp b/src/libcamera/base/utils.cpp\n> index 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\n> diff --git a/src/libcamera/pipeline/virtual/virtual.cpp b/src/libcamera/pipeline/virtual/virtual.cpp\n> index 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> --\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 490D3BDCB5\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 24 Apr 2026 08:22:08 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 5A40E62F79;\n\tFri, 24 Apr 2026 10:22:07 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 3785862CE6\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 24 Apr 2026 10:22:05 +0200 (CEST)","from ideasonboard.com (net-93-65-100-155.cust.vodafonedsl.it\n\t[93.65.100.155])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 78E21986;\n\tFri, 24 Apr 2026 10:20:25 +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=\"HM7aqB0N\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1777018825;\n\tbh=93N1QNOv9fYoAFBC/dMsIMK2PdfyHskSuszSKA1qwyE=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=HM7aqB0N27T8ZStBRrO99rNlqeVYIkL1Aa7Ov0/HD4pim/M0ACApPI2fCh6Oj6KLP\n\tR/6YG/SUaxsg4nFEBuk0de1pd7bNvAL+uSJoMqfalX3U1mq+lIIHSNmr0apdx2rETb\n\tGR1TIZfbd1ED947ZawhfATrQrriNbn0aUnXK5X5Y=","Date":"Fri, 24 Apr 2026 10:22:02 +0200","From":"Jacopo Mondi <jacopo.mondi@ideasonboard.com>","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org, \n\tJacopo Mondi <jacopo.mondi@ideasonboard.com>","Subject":"Re: [PATCH v3 01/37] libcamera: utils: Add overloaded visitor\n\thelpers","Message-ID":"<aesoHcmXW2nuS6kx@zed>","References":"<20260423230059.3180987-1-laurent.pinchart@ideasonboard.com>\n\t<20260423230059.3180987-2-laurent.pinchart@ideasonboard.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","Content-Transfer-Encoding":"8bit","In-Reply-To":"<20260423230059.3180987-2-laurent.pinchart@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>"}}]