]> git.ipfire.org Git - thirdparty/ccache.git/commitdiff
chore: Split util::split_once into util::split_once{,_to_views}
authorJoel Rosdahl <joel@rosdahl.net>
Wed, 23 Apr 2025 17:16:24 +0000 (19:16 +0200)
committerJoel Rosdahl <joel@rosdahl.net>
Wed, 23 Apr 2025 17:37:59 +0000 (19:37 +0200)
The util::split_once(std::string&&, char) version is a bit overly smart
in that it returns std::string instead of std::string_view for a
temporary std::string input. To reduce the risk for surprises, introduce
a util::split_once_into_views so that input lifetime is indicated in the
method name instead.

src/ccache/storage/remote/httpstorage.cpp
src/ccache/storage/remote/redisstorage.cpp
src/ccache/storage/storage.cpp
src/ccache/util/string.cpp
src/ccache/util/string.hpp

index fe0aa4b8a0aa198c3cab5f0cf0bb1cfa9ac6c9e4..a1ae2cc5dcb4a1470d1b8c99a94786c2c963abbc 100644 (file)
@@ -111,7 +111,8 @@ HttpStorageBackend::HttpStorageBackend(
     m_http_client(get_url(url))
 {
   if (!url.user_info().empty()) {
-    const auto [user, password] = util::split_once(url.user_info(), ':');
+    const auto [user, password] =
+      util::split_once_into_views(url.user_info(), ':');
     if (!password) {
       throw core::Fatal(FMT("Expected username:password in URL but got \"{}\"",
                             url.user_info()));
@@ -147,7 +148,7 @@ HttpStorageBackend::HttpStorageBackend(
     } else if (attr.key == "operation-timeout") {
       operation_timeout = parse_timeout_attribute(attr.value);
     } else if (attr.key == "header") {
-      const auto [key, value] = util::split_once(attr.value, '=');
+      const auto [key, value] = util::split_once_into_views(attr.value, '=');
       if (value) {
         default_headers.emplace(std::string(key), std::string(*value));
       } else {
index f7be7e2472ca7077848ad7d3c10f0064968de5a5..a87395af7b8516d205d3f0205a7f40d3c3ecd43d 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2021-2024 Joel Rosdahl and other contributors
+// Copyright (C) 2021-2025 Joel Rosdahl and other contributors
 //
 // See doc/AUTHORS.adoc for a complete list of contributors.
 //
@@ -101,7 +101,7 @@ to_timeval(const uint32_t ms)
 std::pair<std::optional<std::string>, std::optional<std::string>>
 split_user_info(const std::string& user_info)
 {
-  const auto [left, right] = util::split_once(user_info, ':');
+  const auto [left, right] = util::split_once_into_views(user_info, ':');
   if (left.empty()) {
     // redis://HOST
     return {std::nullopt, std::nullopt};
index 63e03380db5dfc08af92567851153223778fe3f7..702d7126aa33b3af227fbfa2545e66e1663fa2d9 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2021-2024 Joel Rosdahl and other contributors
+// Copyright (C) 2021-2025 Joel Rosdahl and other contributors
 //
 // See doc/AUTHORS.adoc for a complete list of contributors.
 //
@@ -162,7 +162,8 @@ parse_storage_config(const std::string_view entry)
     if (parts[i].empty()) {
       continue;
     }
-    const auto [key, right_hand_side] = util::split_once(parts[i], '=');
+    const auto [key, right_hand_side] =
+      util::split_once_into_views(parts[i], '=');
     const auto& raw_value = right_hand_side.value_or("true");
     const auto value =
       util::value_or_throw<core::Error>(util::percent_decode(raw_value));
index 35453a6912714e0fd5efc4537265262e59658af4..1cefb126eb9167240cf6fc793201fd69c1604390 100644 (file)
@@ -468,25 +468,15 @@ split_into_views(std::string_view string,
     string, separators, mode, include_delimiter);
 }
 
-std::pair<std::string_view, std::optional<std::string_view>>
-split_once(const char* string, const char split_char)
-{
-  return split_once(std::string_view(string), split_char);
-}
-
 std::pair<std::string, std::optional<std::string>>
-split_once(std::string&& string, const char split_char)
+split_once(std::string_view string, char split_char)
 {
-  const auto [left, right] = split_once(std::string_view(string), split_char);
-  if (right) {
-    return std::make_pair(std::string(left), std::string(*right));
-  } else {
-    return std::make_pair(std::string(left), std::nullopt);
-  }
+  auto [left, right] = split_once_into_views(string, split_char);
+  return std::pair<std::string, std::optional<std::string>>{left, right};
 }
 
 std::pair<std::string_view, std::optional<std::string_view>>
-split_once(const std::string_view string, const char split_char)
+split_once_into_views(std::string_view string, char split_char)
 {
   const size_t sep_pos = string.find(split_char);
   if (sep_pos == std::string_view::npos) {
index 219b1c347a108520cca9809c6fc8ac0f81adffba..e59e5287b148b1421564d0e026873bb4b8007993 100644 (file)
@@ -178,13 +178,13 @@ split_into_views(std::string_view string,
 
 // Split `string` into two parts using `split_char` as the delimiter. The second
 // part will be `nullopt` if there is no `split_char` in `string.`
-std::pair<std::string_view, std::optional<std::string_view>>
-split_once(const char* string, char split_char);
 std::pair<std::string, std::optional<std::string>>
-split_once(std::string&& string, char split_char);
-std::pair<std::string_view, std::optional<std::string_view>>
 split_once(std::string_view string, char split_char);
 
+// Like `split_once` but splits into `std::string_view`.
+std::pair<std::string_view, std::optional<std::string_view>>
+split_once_into_views(std::string_view string, char split_char);
+
 // Split `string` into two parts where the split point is before a potential
 // absolute path. The second part will be `nullopt` if no absolute path
 // candidate was found.