[llvm] 2e49779 - [ADT] Implicitly convert between StringRef and std::string_view when we have C++17
Benjamin Kramer via llvm-commits
llvm-commits at lists.llvm.org
Tue Jan 28 05:03:49 PST 2020
Author: Benjamin Kramer
Date: 2020-01-28T13:56:12+01:00
New Revision: 2e4977965b57c53db81e729e390dbda6807ef7fc
URL: https://github.com/llvm/llvm-project/commit/2e4977965b57c53db81e729e390dbda6807ef7fc
DIFF: https://github.com/llvm/llvm-project/commit/2e4977965b57c53db81e729e390dbda6807ef7fc.diff
LOG: [ADT] Implicitly convert between StringRef and std::string_view when we have C++17
This makes the types almost seamlessly interchangeable in C++17
codebases. Eventually we want to replace StringRef with the standard
type, but that requires C++17 being the default and a huge refactoring
job as StringRef has a lot more functionality.
Added:
Modified:
llvm/include/llvm/ADT/StringRef.h
llvm/unittests/ADT/StringRefTest.cpp
Removed:
################################################################################
diff --git a/llvm/include/llvm/ADT/StringRef.h b/llvm/include/llvm/ADT/StringRef.h
index 9bfaaccd953e..4a5d1ae7c5ab 100644
--- a/llvm/include/llvm/ADT/StringRef.h
+++ b/llvm/include/llvm/ADT/StringRef.h
@@ -18,6 +18,9 @@
#include <cstring>
#include <limits>
#include <string>
+#if __cplusplus > 201402L
+#include <string_view>
+#endif
#include <type_traits>
#include <utility>
@@ -110,6 +113,12 @@ namespace llvm {
/*implicit*/ StringRef(const std::string &Str)
: Data(Str.data()), Length(Str.length()) {}
+#if __cplusplus > 201402L
+ /// Construct a string ref from an std::string_view.
+ /*implicit*/ constexpr StringRef(std::string_view Str)
+ : Data(Str.data()), Length(Str.size()) {}
+#endif
+
static StringRef withNullAsEmpty(const char *data) {
return StringRef(data ? data : "");
}
@@ -267,6 +276,12 @@ namespace llvm {
return str();
}
+#if __cplusplus > 201402L
+ operator std::string_view() const {
+ return std::string_view(data(), size());
+ }
+#endif
+
/// @}
/// @name String Predicates
/// @{
diff --git a/llvm/unittests/ADT/StringRefTest.cpp b/llvm/unittests/ADT/StringRefTest.cpp
index 9cb24bfdb4db..fbf2d8422a44 100644
--- a/llvm/unittests/ADT/StringRefTest.cpp
+++ b/llvm/unittests/ADT/StringRefTest.cpp
@@ -59,6 +59,16 @@ TEST(StringRefTest, Construction) {
EXPECT_EQ("hello", StringRef("hello"));
EXPECT_EQ("hello", StringRef("hello world", 5));
EXPECT_EQ("hello", StringRef(std::string("hello")));
+#if __cplusplus > 201402L
+ EXPECT_EQ("hello", StringRef(std::string_view("hello")));
+#endif
+}
+
+TEST(StringRefTest, Conversion) {
+ EXPECT_EQ("hello", std::string(StringRef("hello")));
+#if __cplusplus > 201402L
+ EXPECT_EQ("hello", std::string_view(StringRef("hello")));
+#endif
}
TEST(StringRefTest, EmptyInitializerList) {
More information about the llvm-commits
mailing list