Skip to content

Commit

Permalink
Revert "[ADT] Teach StringRef to derive from std::string_view" (llvm#…
Browse files Browse the repository at this point in the history
…113767)

Reverts llvm#113752

Many build bot failures
  • Loading branch information
MaskRay authored Oct 26, 2024
1 parent a3181b1 commit ef886a2
Showing 1 changed file with 31 additions and 10 deletions.
41 changes: 31 additions & 10 deletions llvm/include/llvm/ADT/StringRef.h
Original file line number Diff line number Diff line change
Expand Up @@ -48,9 +48,7 @@ namespace llvm {
/// situations where the character data resides in some other buffer, whose
/// lifetime extends past that of the StringRef. For this reason, it is not in
/// general safe to store a StringRef.
class LLVM_GSL_POINTER StringRef : public std::string_view {
using Base = std::string_view;

class LLVM_GSL_POINTER StringRef {
public:
static constexpr size_t npos = ~size_t(0);

Expand All @@ -62,6 +60,12 @@ namespace llvm {
using const_reverse_iterator = std::reverse_iterator<const_iterator>;

private:
/// The start of the string, in an external buffer.
const char *Data = nullptr;

/// The length of the string.
size_t Length = 0;

// Workaround memcmp issue with null pointers (undefined behavior)
// by providing a specialized version
static int compareMemory(const char *Lhs, const char *Rhs, size_t Length) {
Expand All @@ -82,25 +86,27 @@ namespace llvm {

/// Construct a string ref from a cstring.
/*implicit*/ constexpr StringRef(const char *Str)
: Base(Str, Str ?
: Data(Str), Length(Str ?
// GCC 7 doesn't have constexpr char_traits. Fall back to __builtin_strlen.
#if defined(_GLIBCXX_RELEASE) && _GLIBCXX_RELEASE < 8
__builtin_strlen(Str)
__builtin_strlen(Str)
#else
std::char_traits<char>::length(Str)
std::char_traits<char>::length(Str)
#endif
: 0) {
: 0) {
}

/// Construct a string ref from a pointer and length.
/*implicit*/ constexpr StringRef(const char *data, size_t length)
: Base(data, length) {}
: Data(data), Length(length) {}

/// Construct a string ref from an std::string.
/*implicit*/ StringRef(const std::string &Str) : Base(Str) {}
/*implicit*/ StringRef(const std::string &Str)
: Data(Str.data()), Length(Str.length()) {}

/// Construct a string ref from an std::string_view.
/*implicit*/ constexpr StringRef(std::string_view Str) : Base(Str) {}
/*implicit*/ constexpr StringRef(std::string_view Str)
: Data(Str.data()), Length(Str.size()) {}

/// @}
/// @name Iterators
Expand Down Expand Up @@ -132,9 +138,16 @@ namespace llvm {
/// @name String Operations
/// @{

/// data - Get a pointer to the start of the string (which may not be null
/// terminated).
[[nodiscard]] constexpr const char *data() const { return Data; }

/// empty - Check if the string is empty.
[[nodiscard]] constexpr bool empty() const { return size() == 0; }

/// size - Get the string size.
[[nodiscard]] constexpr size_t size() const { return Length; }

/// front - Get the first character in the string.
[[nodiscard]] char front() const {
assert(!empty());
Expand Down Expand Up @@ -235,6 +248,14 @@ namespace llvm {
std::enable_if_t<std::is_same<T, std::string>::value, StringRef> &
operator=(T &&Str) = delete;

/// @}
/// @name Type Conversions
/// @{

constexpr operator std::string_view() const {
return std::string_view(data(), size());
}

/// @}
/// @name String Predicates
/// @{
Expand Down

0 comments on commit ef886a2

Please sign in to comment.