From 2e4977965b57c53db81e729e390dbda6807ef7fc Mon Sep 17 00:00:00 2001 From: Benjamin Kramer Date: Tue, 28 Jan 2020 13:51:38 +0100 Subject: [PATCH] [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. --- llvm/include/llvm/ADT/StringRef.h | 15 +++++++++++++++ llvm/unittests/ADT/StringRefTest.cpp | 10 ++++++++++ 2 files changed, 25 insertions(+) diff --git a/llvm/include/llvm/ADT/StringRef.h b/llvm/include/llvm/ADT/StringRef.h index 9bfaacc..4a5d1ae 100644 --- a/llvm/include/llvm/ADT/StringRef.h +++ b/llvm/include/llvm/ADT/StringRef.h @@ -18,6 +18,9 @@ #include #include #include +#if __cplusplus > 201402L +#include +#endif #include #include @@ -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 9cb24bf..fbf2d84 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) { -- 2.7.4