Patch Detail
Show a patch.
GET /api/patches/23124/?format=api
{ "id": 23124, "url": "https://patchwork.libcamera.org/api/patches/23124/?format=api", "web_url": "https://patchwork.libcamera.org/patch/23124/", "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": "<20250403154925.382973-9-stefan.klug@ideasonboard.com>", "date": "2025-04-03T15:49:13", "name": "[v3,08/16] libcamera: vector: Extend matrix multiplication operator to heterogenous types", "commit_ref": null, "pull_url": null, "state": "accepted", "archived": false, "hash": "b61eda29bf0c95ebc7b08ef1751be3c8a87201b9", "submitter": { "id": 184, "url": "https://patchwork.libcamera.org/api/people/184/?format=api", "name": "Stefan Klug", "email": "stefan.klug@ideasonboard.com" }, "delegate": null, "mbox": "https://patchwork.libcamera.org/patch/23124/mbox/", "series": [ { "id": 5111, "url": "https://patchwork.libcamera.org/api/series/5111/?format=api", "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=5111", "date": "2025-04-03T15:49:05", "name": "Some rkisp1 awb improvements", "version": 3, "mbox": "https://patchwork.libcamera.org/series/5111/mbox/" } ], "comments": "https://patchwork.libcamera.org/api/patches/23124/comments/", "check": "pending", "checks": "https://patchwork.libcamera.org/api/patches/23124/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 B222FC327D\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu, 3 Apr 2025 15:50:00 +0000 (UTC)", "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 5F23A68A8E;\n\tThu, 3 Apr 2025 17:50:00 +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 21F5468A4C\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 3 Apr 2025 17:49:59 +0200 (CEST)", "from ideasonboard.com (unknown\n\t[IPv6:2a00:6020:448c:6c00:6d9d:9854:3fc1:4bb2])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 6DE7D11E9;\n\tThu, 3 Apr 2025 17:48:05 +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=\"SslfHmvS\"; dkim-atps=neutral", "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1743695285;\n\tbh=/2ARLNaOLEkA/VETV+UoeUvmFPf2wikIcAnv73CnN5Y=;\n\th=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n\tb=SslfHmvSOfuLwaopzUN1qOHfVRu7o34XAJbLI+5RpKdazbJ60Vja+L6iJLdDRn24J\n\tFI7YxvxOypWOwL4tfvaSwhQJSDuz7Qk+3Z7kDLRU+IhzU9pfKKWSmNuI6GZRkGqxv4\n\tRCdGe0d5wnGBGTyXiVYyWVxXCxy9EAMeYzZ5cieY=", "From": "Stefan Klug <stefan.klug@ideasonboard.com>", "To": "libcamera-devel@lists.libcamera.org", "Cc": "Stefan Klug <stefan.klug@ideasonboard.com>,\n\tLaurent Pinchart <laurent.pinchart@ideasonboard.com>,\n\tKieran Bingham <kieran.bingham@ideasonboard.com>", "Subject": "[PATCH v3 08/16] libcamera: vector: Extend matrix multiplication\n\toperator to heterogenous types", "Date": "Thu, 3 Apr 2025 17:49:13 +0200", "Message-ID": "<20250403154925.382973-9-stefan.klug@ideasonboard.com>", "X-Mailer": "git-send-email 2.43.0", "In-Reply-To": "<20250403154925.382973-1-stefan.klug@ideasonboard.com>", "References": "<20250403154925.382973-1-stefan.klug@ideasonboard.com>", "MIME-Version": "1.0", "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: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n\nIt is useful to multiply matrices and vectors of heterogeneous types, for\ninstance float and double. Extend the multiplication operator to support\nthis, avoiding the need to convert one of the operations. The type of the\nreturned vector is selected automatically to avoid loosing precision.\n\nSigned-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\nSigned-off-by: Stefan Klug <stefan.klug@ideasonboard.com>\nAcked-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n\n---\n\nChanges in v2:\n- Added this patch\n\nChanges in v3:\n- Collected tag\n---\n include/libcamera/internal/vector.h | 9 +++++----\n src/libcamera/vector.cpp | 5 +++--\n 2 files changed, 8 insertions(+), 6 deletions(-)", "diff": "diff --git a/include/libcamera/internal/vector.h b/include/libcamera/internal/vector.h\nindex 4e9ef1ee6853..16b6aef0b38f 100644\n--- a/include/libcamera/internal/vector.h\n+++ b/include/libcamera/internal/vector.h\n@@ -13,6 +13,7 @@\n #include <numeric>\n #include <optional>\n #include <ostream>\n+#include <type_traits>\n \n #include <libcamera/base/log.h>\n #include <libcamera/base/span.h>\n@@ -295,13 +296,13 @@ private:\n template<typename T>\n using RGB = Vector<T, 3>;\n \n-template<typename T, unsigned int Rows, unsigned int Cols>\n-Vector<T, Rows> operator*(const Matrix<T, Rows, Cols> &m, const Vector<T, Cols> &v)\n+template<typename T, typename U, unsigned int Rows, unsigned int Cols>\n+Vector<std::common_type_t<T, U>, Rows> operator*(const Matrix<T, Rows, Cols> &m, const Vector<U, Cols> &v)\n {\n-\tVector<T, Rows> result;\n+\tVector<std::common_type_t<T, U>, Rows> result;\n \n \tfor (unsigned int i = 0; i < Rows; i++) {\n-\t\tT sum = 0;\n+\t\tstd::common_type_t<T, U> sum = 0;\n \t\tfor (unsigned int j = 0; j < Cols; j++)\n \t\t\tsum += m[i][j] * v[j];\n \t\tresult[i] = sum;\ndiff --git a/src/libcamera/vector.cpp b/src/libcamera/vector.cpp\nindex 5567d5b8defb..4dad1b9001c5 100644\n--- a/src/libcamera/vector.cpp\n+++ b/src/libcamera/vector.cpp\n@@ -308,9 +308,10 @@ LOG_DEFINE_CATEGORY(Vector)\n */\n \n /**\n- * \\fn Vector<T, Rows> operator*(const Matrix<T, Rows, Cols> &m, const Vector<T, Cols> &v)\n+ * \\fn operator*(const Matrix<T, Rows, Cols> &m, const Vector<U, Cols> &v)\n * \\brief Multiply a matrix by a vector\n- * \\tparam T Numerical type of the contents of the matrix and vector\n+ * \\tparam T Numerical type of the contents of the matrix\n+ * \\tparam U Numerical type of the contents of the vector\n * \\tparam Rows The number of rows in the matrix\n * \\tparam Cols The number of columns in the matrix (= rows in the vector)\n * \\param m The matrix\n", "prefixes": [ "v3", "08/16" ] }