Commit 2e497796 authored by Benjamin Kramer's avatar Benjamin Kramer
Browse files

[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.
parent d8de3499
Loading
Loading
Loading
Loading
+15 −0
Original line number Diff line number Diff line
@@ -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
    /// @{
+10 −0
Original line number Diff line number Diff line
@@ -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) {