{"id":23120,"url":"https://patchwork.libcamera.org/api/1.1/patches/23120/?format=json","web_url":"https://patchwork.libcamera.org/patch/23120/","project":{"id":1,"url":"https://patchwork.libcamera.org/api/1.1/projects/1/?format=json","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-5-stefan.klug@ideasonboard.com>","date":"2025-04-03T15:49:09","name":"[v3,04/16] libcamera: vector: Add a Span based constructor","commit_ref":null,"pull_url":null,"state":"accepted","archived":false,"hash":"8a9eeee72c7b00416a043f0e7bceaa780b8c1c8e","submitter":{"id":184,"url":"https://patchwork.libcamera.org/api/1.1/people/184/?format=json","name":"Stefan Klug","email":"stefan.klug@ideasonboard.com"},"delegate":null,"mbox":"https://patchwork.libcamera.org/patch/23120/mbox/","series":[{"id":5111,"url":"https://patchwork.libcamera.org/api/1.1/series/5111/?format=json","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/23120/comments/","check":"pending","checks":"https://patchwork.libcamera.org/api/patches/23120/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 1FCCFC327D\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu,  3 Apr 2025 15:49:49 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id D1299689B0;\n\tThu,  3 Apr 2025 17:49:48 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 2EFD4689AB\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu,  3 Apr 2025 17:49:47 +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 8614D11E9;\n\tThu,  3 Apr 2025 17:47:53 +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=\"OGQD3KOF\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1743695273;\n\tbh=fS1S7ccPPk7/gi+Who3oQC3Xq9n+HV5xUYPEfyPmlJg=;\n\th=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n\tb=OGQD3KOFsKFE339b8vAPsN1RJwLOVFSAopNBrYAYKXdEka0LZZ86TJux/E6scXccG\n\tqFAJvXEgfw+vOmEhFm57vuBHdeq1cfXQosawcWL79bRu4o4nwg3vD2Tg4lTLYCv2xY\n\tdzROQkZKG/tWFCK4YPiLsQXNoAziN52LxxzSruP8=","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 v3 04/16] libcamera: vector: Add a Span based constructor","Date":"Thu,  3 Apr 2025 17:49:09 +0200","Message-ID":"<20250403154925.382973-5-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":"When one wants to create a Vector from existing data, currently the only\nway is via std::array. Add a Span based constructor to allow creation\nfrom std::vectors and alike.\n\nWhile at it, replace the manual loop with std::copy.\n\nSigned-off-by: Stefan Klug <stefan.klug@ideasonboard.com>\nReviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n\n---\n\nChanges in v2:\n- Added this patch\n\nChanges in v3:\n- Improved commit message\n- Added constexpr to the contructor\n- Pass Span by value\n- Removed initializer of data_ member which was only needed for the\n  default constructor to be actually constexpr. But Vector is not used\nas constexpr anywhere, so we can leave that as is (This will fix itself\nwith C++20).\n---\n include/libcamera/internal/vector.h | 8 ++++++--\n src/libcamera/vector.cpp            | 8 ++++++++\n 2 files changed, 14 insertions(+), 2 deletions(-)","diff":"diff --git a/include/libcamera/internal/vector.h b/include/libcamera/internal/vector.h\nindex a67a09474204..4e9ef1ee6853 100644\n--- a/include/libcamera/internal/vector.h\n+++ b/include/libcamera/internal/vector.h\n@@ -42,8 +42,12 @@ public:\n \n \tconstexpr Vector(const std::array<T, Rows> &data)\n \t{\n-\t\tfor (unsigned int i = 0; i < Rows; i++)\n-\t\t\tdata_[i] = data[i];\n+\t\tstd::copy(data.begin(), data.end(), data_.begin());\n+\t}\n+\n+\tconstexpr Vector(const Span<const T, Rows> data)\n+\t{\n+\t\tstd::copy(data.begin(), data.end(), data_.begin());\n \t}\n \n \tconst T &operator[](size_t i) const\ndiff --git a/src/libcamera/vector.cpp b/src/libcamera/vector.cpp\nindex 85ca2208245a..5567d5b8defb 100644\n--- a/src/libcamera/vector.cpp\n+++ b/src/libcamera/vector.cpp\n@@ -44,6 +44,14 @@ LOG_DEFINE_CATEGORY(Vector)\n  * The size of \\a data must be equal to the dimension size Rows of the vector.\n  */\n \n+/**\n+ * \\fn Vector::Vector(const Span<const T, Rows> data)\n+ * \\brief Construct vector from supplied data\n+ * \\param data Data from which to construct a vector\n+ *\n+ * The size of \\a data must be equal to the dimension size Rows of the vector.\n+ */\n+\n /**\n  * \\fn T Vector::operator[](size_t i) const\n  * \\brief Index to an element in the vector\n","prefixes":["v3","04/16"]}