Skip to content

Commit

Permalink
[ADT] Implicitly convert between StringRef and std::string_view when …
Browse files Browse the repository at this point in the history
…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.
  • Loading branch information
d0k committed Jan 28, 2020
1 parent d8de349 commit 2e49779
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 0 deletions.
15 changes: 15 additions & 0 deletions llvm/include/llvm/ADT/StringRef.h
Expand Up @@ -18,6 +18,9 @@
#include <cstring>
#include <limits>
#include <string>
#if __cplusplus > 201402L
#include <string_view>
#endif
#include <type_traits>
#include <utility>

Expand Down Expand Up @@ -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 : "");
}
Expand Down Expand Up @@ -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
/// @{
Expand Down
10 changes: 10 additions & 0 deletions llvm/unittests/ADT/StringRefTest.cpp
Expand Up @@ -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) {
Expand Down

0 comments on commit 2e49779

Please sign in to comment.