Show a patch.

GET /api/patches/22986/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 22986,
    "url": "https://patchwork.libcamera.org/api/patches/22986/?format=api",
    "web_url": "https://patchwork.libcamera.org/patch/22986/",
    "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": "<20250319161152.63625-9-stefan.klug@ideasonboard.com>",
    "date": "2025-03-19T16:11:13",
    "name": "[v2,08/17] libcamera: vector: Extend matrix multiplication operator to heterogenous types",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "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/22986/mbox/",
    "series": [
        {
            "id": 5071,
            "url": "https://patchwork.libcamera.org/api/series/5071/?format=api",
            "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=5071",
            "date": "2025-03-19T16:11:05",
            "name": "Some rkisp1 awb improvements",
            "version": 2,
            "mbox": "https://patchwork.libcamera.org/series/5071/mbox/"
        }
    ],
    "comments": "https://patchwork.libcamera.org/api/patches/22986/comments/",
    "check": "pending",
    "checks": "https://patchwork.libcamera.org/api/patches/22986/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 E45ACC32FE\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 19 Mar 2025 16:12:21 +0000 (UTC)",
            "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 97A5568964;\n\tWed, 19 Mar 2025 17:12:21 +0100 (CET)",
            "from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 3DB9468962\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 19 Mar 2025 17:12:20 +0100 (CET)",
            "from ideasonboard.com (unknown\n\t[IPv6:2a00:6020:448c:6c00:760:e5ca:4814:99c7])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 569368FA;\n\tWed, 19 Mar 2025 17:10:37 +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=\"VjCBjuu2\"; dkim-atps=neutral",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1742400637;\n\tbh=br8rN+1GhOXoViyWSjCXtOrJsJ/Gofo1vO1Isf1ZNqQ=;\n\th=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n\tb=VjCBjuu2ESnSqR/W1VH5VB4waiZhrqCRDVXpnvp/zZXiRHer1m1nt1OXVyqsPt8hm\n\tpNwkBVfquzNgnrRM4HKtsM5G3xGCEvDhbaWjDeX66pnDrEMpJqIIMVUEPkYIpuGqTJ\n\tT2lGGodi4l2c1fX3gX+IX+Y7wvpPORDvV8NR0VBc=",
        "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>",
        "Subject": "[PATCH v2 08/17] libcamera: vector: Extend matrix multiplication\n\toperator to heterogenous types",
        "Date": "Wed, 19 Mar 2025 17:11:13 +0100",
        "Message-ID": "<20250319161152.63625-9-stefan.klug@ideasonboard.com>",
        "X-Mailer": "git-send-email 2.43.0",
        "In-Reply-To": "<20250319161152.63625-1-stefan.klug@ideasonboard.com>",
        "References": "<20250319161152.63625-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>\n\nChanges in v2:\n- Added this patch\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 66cc5ac988c2..d518de9689a3 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 435f2fc62f8b..c9419da8c663 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": [
        "v2",
        "08/17"
    ]
}