From 6d23ac67f9e4bdaf4528c66464258bd1b3040456 Mon Sep 17 00:00:00 2001
From: Max Kellermann <max.kellermann@gmail.com>
Date: Fri, 1 Jul 2022 11:08:20 +0200
Subject: [PATCH] util/UriQueryParser: use std::string_view

---
 src/input/IcyInputStream.cxx          |  6 ++----
 src/input/plugins/CurlInputPlugin.cxx |  5 ++---
 src/util/UriQueryParser.cxx           | 24 ++++++++++++------------
 src/util/UriQueryParser.hxx           | 13 +++++--------
 test/util/TestUriQueryParser.cxx      | 12 +-----------
 5 files changed, 22 insertions(+), 38 deletions(-)

diff --git a/src/input/IcyInputStream.cxx b/src/input/IcyInputStream.cxx
index 8e21ed69e..26aa3bf20 100644
--- a/src/input/IcyInputStream.cxx
+++ b/src/input/IcyInputStream.cxx
@@ -35,10 +35,8 @@ IcyInputStream::IcyInputStream(InputStreamPtr _input,
 	if (fragment != nullptr) {
 		const auto charset = UriFindRawQueryParameter(fragment,
 							      "charset");
-		if (charset != nullptr) {
-			const std::string copy(charset.data, charset.size);
-			parser->SetCharset(copy.c_str());
-		}
+		if (charset.data() != nullptr)
+			parser->SetCharset(std::string{charset}.c_str());
 	}
 #endif
 }
diff --git a/src/input/plugins/CurlInputPlugin.cxx b/src/input/plugins/CurlInputPlugin.cxx
index 938e243dd..8319d7944 100644
--- a/src/input/plugins/CurlInputPlugin.cxx
+++ b/src/input/plugins/CurlInputPlugin.cxx
@@ -195,11 +195,10 @@ CreateIcuConverterForUri(const char *uri)
 		return nullptr;
 
 	const auto charset = UriFindRawQueryParameter(fragment, "charset");
-	if (charset == nullptr)
+	if (charset.data() == nullptr)
 		return nullptr;
 
-	const std::string copy(charset.data, charset.size);
-	return IcuConverter::Create(copy.c_str());
+	return IcuConverter::Create(std::string{charset}.c_str());
 }
 
 #endif
diff --git a/src/util/UriQueryParser.cxx b/src/util/UriQueryParser.cxx
index f75fec733..879cb55c2 100644
--- a/src/util/UriQueryParser.cxx
+++ b/src/util/UriQueryParser.cxx
@@ -30,20 +30,20 @@
 #include "UriQueryParser.hxx"
 #include "IterableSplitString.hxx"
 
-StringView
-UriFindRawQueryParameter(StringView query_string, StringView name) noexcept
-{
-	for (StringView i : IterableSplitString(query_string, '&')) {
-		if (i.StartsWith(name)) {
-			if (i.size == name.size)
-				return "";
+using std::string_view_literals::operator""sv;
 
-			if (i[name.size] == '=') {
-				i.skip_front(name.size + 1);
-				return i;
-			}
+std::string_view
+UriFindRawQueryParameter(std::string_view query_string, std::string_view name) noexcept
+{
+	for (const std::string_view i : IterableSplitString(query_string, '&')) {
+		if (i.starts_with(name)) {
+			if (i.size() == name.size())
+				return ""sv;
+
+			if (i[name.size()] == '=')
+				return i.substr(name.size() + 1);
 		}
 	}
 
-	return nullptr;
+	return {};
 }
diff --git a/src/util/UriQueryParser.hxx b/src/util/UriQueryParser.hxx
index c9b52d4a8..1d5f2bd4b 100644
--- a/src/util/UriQueryParser.hxx
+++ b/src/util/UriQueryParser.hxx
@@ -1,5 +1,5 @@
 /*
- * Copyright 2008-2019 Max Kellermann <max.kellermann@gmail.com>
+ * Copyright 2008-2022 Max Kellermann <max.kellermann@gmail.com>
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -27,10 +27,9 @@
  * OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-#ifndef URI_QUERY_PARSER_HXX
-#define URI_QUERY_PARSER_HXX
+#pragma once
 
-struct StringView;
+#include <string_view>
 
 /**
  * Find the first query parameter with the given name and return its
@@ -40,7 +39,5 @@ struct StringView;
  * or nullptr if the parameter does not exist
  */
 [[gnu::pure]]
-StringView
-UriFindRawQueryParameter(StringView query_string, StringView name) noexcept;
-
-#endif
+std::string_view
+UriFindRawQueryParameter(std::string_view query_string, std::string_view name) noexcept;
diff --git a/test/util/TestUriQueryParser.cxx b/test/util/TestUriQueryParser.cxx
index 9455f0664..5a9b236ab 100644
--- a/test/util/TestUriQueryParser.cxx
+++ b/test/util/TestUriQueryParser.cxx
@@ -3,23 +3,13 @@
  */
 
 #include "util/UriQueryParser.hxx"
-#include "util/StringView.hxx"
 
 #include <gtest/gtest.h>
 
-static bool
-operator==(StringView a, StringView b)
-{
-	if (a.IsNull() || b.IsNull())
-		return a.IsNull() == b.IsNull();
-
-	return a.Equals(b);
-}
-
 TEST(UriQueryParser, UriFindRawQueryParameter)
 {
 	const char *q = "foo=1&bar=2&quoted=%20%00+%%&empty1&empty2=";
-	EXPECT_EQ(UriFindRawQueryParameter(q, "doesntexist"),
+	EXPECT_EQ(UriFindRawQueryParameter(q, "doesntexist").data(),
 		  (const char *)nullptr);
 	EXPECT_EQ(UriFindRawQueryParameter(q, "foo"),
 		  "1");