From cad5b9a0689ff002a7585027950b7621bc275ab2 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. --- include/llvm/ADT/StringRef.h | 15 +++++++++++++++ unittests/ADT/StringRefTest.cpp | 10 ++++++++++ 2 files changed, 25 insertions(+) diff --git a/include/llvm/ADT/StringRef.h b/include/llvm/ADT/StringRef.h index 9bfaaccd953..4a5d1ae7c5a 100644 --- a/include/llvm/ADT/StringRef.h +++ b/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/unittests/ADT/StringRefTest.cpp b/unittests/ADT/StringRefTest.cpp index 9cb24bfdb4d..fbf2d8422a4 100644 --- a/unittests/ADT/StringRefTest.cpp +++ b/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) {