]> git.ipfire.org Git - thirdparty/ccache.git/commitdiff
enhance: Add util::split_once(std::string&&, char)
authorJoel Rosdahl <joel@rosdahl.net>
Sat, 25 Feb 2023 13:27:32 +0000 (14:27 +0100)
committerJoel Rosdahl <joel@rosdahl.net>
Sat, 4 Mar 2023 09:10:20 +0000 (10:10 +0100)
src/util/string.cpp
src/util/string.hpp
unittest/test_util_string.cpp

index 4ad3decda0d1f5d038ac2b56e15f4e1715b6fd35..c33bd9f58a546183301ef9d565c1fe5fefaed563 100644 (file)
@@ -277,6 +277,23 @@ replace_first(const std::string_view string,
   return result;
 }
 
+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)
+{
+  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);
+  }
+}
+
 std::pair<std::string_view, std::optional<std::string_view>>
 split_once(const std::string_view string, const char split_char)
 {
index 7df40aada4f13d4b55768b32398511b0c964a5de..3b23fa4ed4df010c590a8018de83d8f91b92a521 100644 (file)
@@ -117,6 +117,10 @@ std::string replace_first(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);
 
 // Return true if `prefix` is a prefix of `string`.
index 12746d080768e42ad9eb47b41801955a21f0eb90..e2fb2334481e918d0c5577df356dd8d5886c15d1 100644 (file)
 #include <ostream> // https://github.com/doctest/doctest/issues/618
 #include <vector>
 
+static bool
+operator==(std::pair<std::string, std::optional<std::string>> left,
+           std::pair<std::string, std::optional<std::string>> right)
+{
+  return left.first == right.first && left.second == right.second;
+}
+
 static bool
 operator==(std::pair<std::string_view, std::optional<std::string_view>> left,
            std::pair<std::string_view, std::optional<std::string_view>> right)
@@ -314,15 +321,44 @@ TEST_CASE("util::split_once")
   using std::nullopt;
   using util::split_once;
 
-  CHECK(split_once("", '=') == make_pair("", nullopt));
-  CHECK(split_once("a", '=') == make_pair("a", nullopt));
-  CHECK(split_once("=a", '=') == make_pair("", "a"));
-  CHECK(split_once("a=", '=') == make_pair("a", ""));
-  CHECK(split_once("a==", '=') == make_pair("a", "="));
-  CHECK(split_once("a=b", '=') == make_pair("a", "b"));
-  CHECK(split_once("a=b=", '=') == make_pair("a", "b="));
-  CHECK(split_once("a=b=c", '=') == make_pair("a", "b=c"));
-  CHECK(split_once("x y", ' ') == make_pair("x", "y"));
+  SUBCASE("const char*")
+  {
+    CHECK(split_once("", '=') == make_pair("", nullopt));
+    CHECK(split_once("a", '=') == make_pair("a", nullopt));
+    CHECK(split_once("=a", '=') == make_pair("", "a"));
+    CHECK(split_once("a=", '=') == make_pair("a", ""));
+    CHECK(split_once("a==", '=') == make_pair("a", "="));
+    CHECK(split_once("a=b", '=') == make_pair("a", "b"));
+    CHECK(split_once("a=b=", '=') == make_pair("a", "b="));
+    CHECK(split_once("a=b=c", '=') == make_pair("a", "b=c"));
+    CHECK(split_once("x y", ' ') == make_pair("x", "y"));
+  }
+
+  SUBCASE("std::string&&")
+  {
+    CHECK(split_once(std::string(""), '=') == make_pair("", nullopt));
+    CHECK(split_once(std::string("a"), '=') == make_pair("a", nullopt));
+    CHECK(split_once(std::string("=a"), '=') == make_pair("", "a"));
+    CHECK(split_once(std::string("a="), '=') == make_pair("a", ""));
+    CHECK(split_once(std::string("a=="), '=') == make_pair("a", "="));
+    CHECK(split_once(std::string("a=b"), '=') == make_pair("a", "b"));
+    CHECK(split_once(std::string("a=b="), '=') == make_pair("a", "b="));
+    CHECK(split_once(std::string("a=b=c"), '=') == make_pair("a", "b=c"));
+    CHECK(split_once(std::string("x y"), ' ') == make_pair("x", "y"));
+  }
+
+  SUBCASE("std::string_view")
+  {
+    CHECK(split_once(std::string_view(""), '=') == make_pair("", nullopt));
+    CHECK(split_once(std::string_view("a"), '=') == make_pair("a", nullopt));
+    CHECK(split_once(std::string_view("=a"), '=') == make_pair("", "a"));
+    CHECK(split_once(std::string_view("a="), '=') == make_pair("a", ""));
+    CHECK(split_once(std::string_view("a=="), '=') == make_pair("a", "="));
+    CHECK(split_once(std::string_view("a=b"), '=') == make_pair("a", "b"));
+    CHECK(split_once(std::string_view("a=b="), '=') == make_pair("a", "b="));
+    CHECK(split_once(std::string_view("a=b=c"), '=') == make_pair("a", "b=c"));
+    CHECK(split_once(std::string_view("x y"), ' ') == make_pair("x", "y"));
+  }
 }
 
 TEST_CASE("util::starts_with")