Show a patch.

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

{
    "id": 24232,
    "url": "https://patchwork.libcamera.org/api/1.1/patches/24232/?format=api",
    "web_url": "https://patchwork.libcamera.org/patch/24232/",
    "project": {
        "id": 1,
        "url": "https://patchwork.libcamera.org/api/1.1/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": "<20250825114642.576534-1-paul.elder@ideasonboard.com>",
    "date": "2025-08-25T11:46:42",
    "name": "utils: Add unary negation operation to Duration",
    "commit_ref": "6554b6264257af1c3c289d502032b2818d276f65",
    "pull_url": null,
    "state": "accepted",
    "archived": false,
    "hash": "cbe6f5d8a8036090e34d3cf7a73bb6cd8bced00e",
    "submitter": {
        "id": 17,
        "url": "https://patchwork.libcamera.org/api/1.1/people/17/?format=api",
        "name": "Paul Elder",
        "email": "paul.elder@ideasonboard.com"
    },
    "delegate": null,
    "mbox": "https://patchwork.libcamera.org/patch/24232/mbox/",
    "series": [
        {
            "id": 5404,
            "url": "https://patchwork.libcamera.org/api/1.1/series/5404/?format=api",
            "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=5404",
            "date": "2025-08-25T11:46:42",
            "name": "utils: Add unary negation operation to Duration",
            "version": 1,
            "mbox": "https://patchwork.libcamera.org/series/5404/mbox/"
        }
    ],
    "comments": "https://patchwork.libcamera.org/api/patches/24232/comments/",
    "check": "pending",
    "checks": "https://patchwork.libcamera.org/api/patches/24232/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 F2BBDBD87C\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 25 Aug 2025 11:46:53 +0000 (UTC)",
            "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 1BCFB692ED;\n\tMon, 25 Aug 2025 13:46:53 +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 7D77B692CA\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 25 Aug 2025 13:46:51 +0200 (CEST)",
            "from neptunite.infra.iob (unknown\n\t[IPv6:2404:7a81:160:2100:39d7:37aa:64a2:5533])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 2A1512285;\n\tMon, 25 Aug 2025 13:45:47 +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=\"H3QiD+L+\"; dkim-atps=neutral",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1756122349;\n\tbh=8IQKnmlwbepxqvD//dDB7EyFkYjR45Rji9TZ4F3EMOk=;\n\th=From:To:Cc:Subject:Date:From;\n\tb=H3QiD+L+HkgG2NNLLDPXF2/twHAPfVX7Vmk528nPLr9zi0PUEB7bDydX0UugZuLEd\n\tJdKRcrQk5n2VFjYNvVRbQU9RnIroyPY3SHt5QmNfRKDMElufUJUxmGEj8NWSjtntJZ\n\t142hPSF0Hh3mmXcYbHzOY4+gx6DNnbKfB8gDA1G4=",
        "From": "Paul Elder <paul.elder@ideasonboard.com>",
        "To": "libcamera-devel@lists.libcamera.org",
        "Cc": "Paul Elder <paul.elder@ideasonboard.com>",
        "Subject": "[PATCH] utils: Add unary negation operation to Duration",
        "Date": "Mon, 25 Aug 2025 20:46:42 +0900",
        "Message-ID": "<20250825114642.576534-1-paul.elder@ideasonboard.com>",
        "X-Mailer": "git-send-email 2.47.2",
        "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": "In the near future we will add a SyncAdjustment control for adjusting\nthe frame duration via the sync algorithm. This control needs to be able\nto take on a negative value, since the frame duration can be shortened\nin addition to being extended. While the control is an int, it would be\nconvenient to be able to clamp it to frame duration limits, which are\nusually handled as utils::Duration values internally. To allow this\nusing utils::Duration, add a unary negation operation to\nutils::Duration. Also add a test for the operator.\n\nSigned-off-by: Paul Elder <paul.elder@ideasonboard.com>\n---\n include/libcamera/base/utils.h | 5 +++++\n src/libcamera/base/utils.cpp   | 6 ++++++\n test/utils.cpp                 | 6 ++++++\n 3 files changed, 17 insertions(+)",
    "diff": "diff --git a/include/libcamera/base/utils.h b/include/libcamera/base/utils.h\nindex f21c6dc016ec..cb8caaa9bacc 100644\n--- a/include/libcamera/base/utils.h\n+++ b/include/libcamera/base/utils.h\n@@ -394,6 +394,11 @@ public:\n \t\treturn c.count();\n \t}\n \n+\tconstexpr Duration operator-() const\n+\t{\n+\t\treturn BaseDuration::operator-();\n+\t}\n+\n \texplicit constexpr operator bool() const\n \t{\n \t\treturn *this != BaseDuration::zero();\ndiff --git a/src/libcamera/base/utils.cpp b/src/libcamera/base/utils.cpp\nindex bcfc1941a92a..cb9fe0049c83 100644\n--- a/src/libcamera/base/utils.cpp\n+++ b/src/libcamera/base/utils.cpp\n@@ -425,6 +425,12 @@ std::string toAscii(const std::string &str)\n  * \\return The tick count of the Duration expressed in \\a Period\n  */\n \n+/**\n+ * \\fn Duration::operator-()\n+ * \\brief Negation operator to negate a \\a Duration\n+ * \\return The duration, with the number of ticks negated\n+ */\n+\n /**\n  * \\fn Duration::operator bool()\n  * \\brief Boolean operator to test if a \\a Duration holds a non-zero time value\ndiff --git a/test/utils.cpp b/test/utils.cpp\nindex d25475cb93b9..195fddc97d97 100644\n--- a/test/utils.cpp\n+++ b/test/utils.cpp\n@@ -167,6 +167,12 @@ protected:\n \t\t\treturn TestFail;\n \t\t}\n \n+\t\texposure = 100ms;\n+\t\tif ((-exposure).get<std::milli>() != -100) {\n+\t\t\tcerr << \"utils::Duration failed negation\" << endl;\n+\t\t\treturn TestFail;\n+\t\t}\n+\n \t\treturn TestPass;\n \t}\n \n",
    "prefixes": []
}