[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