{"id":22325,"url":"https://patchwork.libcamera.org/api/patches/22325/?format=json","web_url":"https://patchwork.libcamera.org/patch/22325/","project":{"id":1,"url":"https://patchwork.libcamera.org/api/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":"<20241215230206.11002-6-laurent.pinchart@ideasonboard.com>","date":"2024-12-15T23:02:03","name":"[RFC,5/8] libcamera: base: utils: Use std::string_view","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"7605e824314028d1b8242da8e2e2b3e6f1eee3a0","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/?format=json","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"delegate":null,"mbox":"https://patchwork.libcamera.org/patch/22325/mbox/","series":[{"id":4889,"url":"https://patchwork.libcamera.org/api/series/4889/?format=json","web_url":"https://patchwork.libcamera.org/project/libcamera/list/?series=4889","date":"2024-12-15T23:01:58","name":"libcamera: Use std::string_view","version":1,"mbox":"https://patchwork.libcamera.org/series/4889/mbox/"}],"comments":"https://patchwork.libcamera.org/api/patches/22325/comments/","check":"pending","checks":"https://patchwork.libcamera.org/api/patches/22325/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 753B1C32F6\n\tfor <parsemail@patchwork.libcamera.org>;\n\tSun, 15 Dec 2024 23:02:38 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id E621D67F45;\n\tMon, 16 Dec 2024 00:02:37 +0100 (CET)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 84F9967F1D\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 16 Dec 2024 00:02:29 +0100 (CET)","from pendragon.ideasonboard.com (81-175-209-231.bb.dnainternet.fi\n\t[81.175.209.231])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 5025B2C6;\n\tMon, 16 Dec 2024 00:01:53 +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=\"OY6LTa9b\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1734303713;\n\tbh=jicbLubGAelOBp5iooZvoFoBWq8tpZBmR9fVz8vVW0Y=;\n\th=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n\tb=OY6LTa9bGZ+zBaw3oEZNEXATBsFb+pXH1n+RW8EwCDP+mztEp1m4+59EXI6iz4Paa\n\tpgxVOefYaQ6DgFVQTYvUbYf25NPz1CRQbwWOvQeOEiJQcGu095CI0VZ2i10KNJ4T3/\n\tCKbu0kXW+ch0hnU3lKDxLySiBkR1pvS0GH3MAM4s=","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"libcamera-devel@lists.libcamera.org","Cc":"=?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= <barnabas.pocze@ideasonboard.com>","Subject":"[RFC PATCH 5/8] libcamera: base: utils: Use std::string_view","Date":"Mon, 16 Dec 2024 01:02:03 +0200","Message-ID":"<20241215230206.11002-6-laurent.pinchart@ideasonboard.com>","X-Mailer":"git-send-email 2.45.2","In-Reply-To":"<20241215230206.11002-1-laurent.pinchart@ideasonboard.com>","References":"<20241215230206.11002-1-laurent.pinchart@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":"Replace usage of const std::string references passed to class member\nfunctions with std::string_view. This allows using static C string\nliterals in the callers without the overhead of constructing a\nstd::string instance.\n\nAs std::string can't be implicitly constructed from std::string_view, an\nexplicit construction is added at the end of dirname().\n\nSigned-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n---\n include/libcamera/base/utils.h | 15 ++++++++-------\n src/libcamera/base/utils.cpp   | 14 +++++++-------\n 2 files changed, 15 insertions(+), 14 deletions(-)","diff":"diff --git a/include/libcamera/base/utils.h b/include/libcamera/base/utils.h\nindex dd012fd58501cd8d..3ef1c0e87383f8d2 100644\n--- a/include/libcamera/base/utils.h\n+++ b/include/libcamera/base/utils.h\n@@ -15,6 +15,7 @@\n #include <sstream>\n #include <string.h>\n #include <string>\n+#include <string_view>\n #include <sys/time.h>\n #include <type_traits>\n #include <utility>\n@@ -38,7 +39,7 @@ namespace utils {\n const char *basename(const char *path);\n \n char *secure_getenv(const char *name);\n-std::string dirname(const std::string &path);\n+std::string dirname(std::string_view path);\n \n template<typename T>\n std::vector<typename T::key_type> map_keys(const T &map)\n@@ -143,7 +144,7 @@ size_t strlcpy(char *dst, const char *src, size_t size);\n \n #ifndef __DOXYGEN__\n template<typename Container, typename UnaryOp>\n-std::string join(const Container &items, const std::string &sep, UnaryOp op)\n+std::string join(const Container &items, std::string_view sep, UnaryOp op)\n {\n \tstd::ostringstream ss;\n \tbool first = true;\n@@ -162,7 +163,7 @@ std::string join(const Container &items, const std::string &sep, UnaryOp op)\n }\n \n template<typename Container>\n-std::string join(const Container &items, const std::string &sep)\n+std::string join(const Container &items, std::string_view sep)\n {\n \tstd::ostringstream ss;\n \tbool first = true;\n@@ -181,7 +182,7 @@ std::string join(const Container &items, const std::string &sep)\n }\n #else\n template<typename Container, typename UnaryOp>\n-std::string join(const Container &items, const std::string &sep, UnaryOp op = nullptr);\n+std::string join(const Container &items, std::string_view sep, UnaryOp op = nullptr);\n #endif\n \n namespace details {\n@@ -189,7 +190,7 @@ namespace details {\n class StringSplitter\n {\n public:\n-\tStringSplitter(const std::string &str, const std::string &delim);\n+\tStringSplitter(std::string_view str, std::string_view delim);\n \n \tclass iterator\n \t{\n@@ -238,9 +239,9 @@ private:\n \n } /* namespace details */\n \n-details::StringSplitter split(const std::string &str, const std::string &delim);\n+details::StringSplitter split(std::string_view str, std::string_view delim);\n \n-std::string toAscii(const std::string &str);\n+std::string toAscii(std::string_view str);\n \n std::string libcameraBuildPath();\n std::string libcameraSourcePath();\ndiff --git a/src/libcamera/base/utils.cpp b/src/libcamera/base/utils.cpp\nindex bcfc1941a92a3d69..886aa9ecdc2bddfe 100644\n--- a/src/libcamera/base/utils.cpp\n+++ b/src/libcamera/base/utils.cpp\n@@ -80,7 +80,7 @@ char *secure_getenv(const char *name)\n  *\n  * \\return A string of the directory component of the path\n  */\n-std::string dirname(const std::string &path)\n+std::string dirname(std::string_view path)\n {\n \tif (path.empty())\n \t\treturn \".\";\n@@ -116,7 +116,7 @@ std::string dirname(const std::string &path)\n \t\tpos--;\n \t}\n \n-\treturn path.substr(0, pos + 1);\n+\treturn std::string(path.substr(0, pos + 1));\n }\n \n /**\n@@ -247,7 +247,7 @@ size_t strlcpy(char *dst, const char *src, size_t size)\n \treturn strlen(src);\n }\n \n-details::StringSplitter::StringSplitter(const std::string &str, const std::string &delim)\n+details::StringSplitter::StringSplitter(std::string_view str, std::string_view delim)\n \t: str_(str), delim_(delim)\n {\n }\n@@ -278,7 +278,7 @@ std::string details::StringSplitter::iterator::operator*() const\n \n /**\n  * \\fn template<typename Container, typename UnaryOp> \\\n- * std::string utils::join(const Container &items, const std::string &sep, UnaryOp op)\n+ * std::string utils::join(const Container &items, std::string_view sep, UnaryOp op)\n  * \\brief Join elements of a container in a string with a separator\n  * \\param[in] items The container\n  * \\param[in] sep The separator to add between elements\n@@ -293,7 +293,7 @@ std::string details::StringSplitter::iterator::operator*() const\n  */\n \n /**\n- * \\fn split(const std::string &str, const std::string &delim)\n+ * \\fn split(std::string_view str, std::string_view delim)\n  * \\brief Split a string based on a delimiter\n  * \\param[in] str The string to split\n  * \\param[in] delim The delimiter string\n@@ -305,7 +305,7 @@ std::string details::StringSplitter::iterator::operator*() const\n  * \\return An object that can be used in a range-based for loop to iterate over\n  * the substrings\n  */\n-details::StringSplitter split(const std::string &str, const std::string &delim)\n+details::StringSplitter split(std::string_view str, std::string_view delim)\n {\n \t/** \\todo Try to avoid copies of str and delim */\n \treturn details::StringSplitter(str, delim);\n@@ -319,7 +319,7 @@ details::StringSplitter split(const std::string &str, const std::string &delim)\n  *\n  * \\return A string equal to \\a str stripped out of all non-ASCII characters\n  */\n-std::string toAscii(const std::string &str)\n+std::string toAscii(std::string_view str)\n {\n \tstd::string ret;\n \tfor (const char &c : str)\n","prefixes":["RFC","5/8"]}