Skip to content

[ADT] Teach StringRef to take basic features from std::string_view (NFC) #113797

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 3 commits into
base: main
Choose a base branch
from

Conversation

kazutakahirata
Copy link
Contributor

This patch teaches StringRef to take basic features from
std::string_view, including:

  • npos
  • iterator types
  • empty, begin, end, rbegin, rend

I'm not replacing performance-sensitive functions like find and
operator== for now so that this patch will likely stick.

This patch teaches StringRef to take basic features from
std::string_view, including:

- npos
- iterator types
- empty, begin, end, rbegin, rend

I'm not replacing performance-sensitive functions like find and
operator== for now so that this patch will likely stick.
@llvmbot
Copy link
Member

llvmbot commented Oct 27, 2024

@llvm/pr-subscribers-llvm-adt

@llvm/pr-subscribers-llvm-support

Author: Kazu Hirata (kazutakahirata)

Changes

This patch teaches StringRef to take basic features from
std::string_view, including:

  • npos
  • iterator types
  • empty, begin, end, rbegin, rend

I'm not replacing performance-sensitive functions like find and
operator== for now so that this patch will likely stick.


Full diff: https://github.com/llvm/llvm-project/pull/113797.diff

2 Files Affected:

  • (modified) llvm/include/llvm/ADT/StringRef.h (+17-26)
  • (modified) llvm/lib/Support/StringRef.cpp (+2-4)
diff --git a/llvm/include/llvm/ADT/StringRef.h b/llvm/include/llvm/ADT/StringRef.h
index f879bbf7164fd6..e59a3f10ee76df 100644
--- a/llvm/include/llvm/ADT/StringRef.h
+++ b/llvm/include/llvm/ADT/StringRef.h
@@ -50,14 +50,14 @@ namespace llvm {
   /// general safe to store a StringRef.
   class LLVM_GSL_POINTER StringRef {
   public:
-    static constexpr size_t npos = ~size_t(0);
+    static constexpr size_t npos = std::string_view::npos;
 
-    using iterator = const char *;
-    using const_iterator = const char *;
-    using size_type = size_t;
-    using value_type = char;
-    using reverse_iterator = std::reverse_iterator<iterator>;
-    using const_reverse_iterator = std::reverse_iterator<const_iterator>;
+    using iterator = std::string_view::iterator;
+    using const_iterator = std::string_view::const_iterator;
+    using size_type = std::string_view::size_type;
+    using value_type = std::string_view::value_type;
+    using reverse_iterator = std::string_view::reverse_iterator;
+    using const_reverse_iterator = std::string_view::const_reverse_iterator;
 
   private:
     std::string_view View;
@@ -106,17 +106,10 @@ namespace llvm {
     /// @name Iterators
     /// @{
 
-    iterator begin() const { return data(); }
-
-    iterator end() const { return data() + size(); }
-
-    reverse_iterator rbegin() const {
-      return std::make_reverse_iterator(end());
-    }
-
-    reverse_iterator rend() const {
-      return std::make_reverse_iterator(begin());
-    }
+    iterator begin() const { return View.begin(); }
+    iterator end() const { return View.end(); }
+    reverse_iterator rbegin() const { return View.rbegin(); }
+    reverse_iterator rend() const { return View.rend(); }
 
     const unsigned char *bytes_begin() const {
       return reinterpret_cast<const unsigned char *>(begin());
@@ -137,7 +130,7 @@ namespace llvm {
     [[nodiscard]] constexpr const char *data() const { return View.data(); }
 
     /// empty - Check if the string is empty.
-    [[nodiscard]] constexpr bool empty() const { return size() == 0; }
+    [[nodiscard]] constexpr bool empty() const { return View.empty(); }
 
     /// size - Get the string size.
     [[nodiscard]] constexpr size_t size() const { return View.size(); }
@@ -145,13 +138,13 @@ namespace llvm {
     /// front - Get the first character in the string.
     [[nodiscard]] char front() const {
       assert(!empty());
-      return data()[0];
+      return View.front();
     }
 
     /// back - Get the last character in the string.
     [[nodiscard]] char back() const {
       assert(!empty());
-      return data()[size() - 1];
+      return View.back();
     }
 
     // copy - Allocate copy in Allocator and return StringRef to it.
@@ -222,7 +215,7 @@ namespace llvm {
     [[nodiscard]] std::string str() const {
       if (!data())
         return std::string();
-      return std::string(data(), size());
+      return std::string(View);
     }
 
     /// @}
@@ -246,9 +239,7 @@ namespace llvm {
     /// @name Type Conversions
     /// @{
 
-    constexpr operator std::string_view() const {
-      return std::string_view(data(), size());
-    }
+    constexpr operator std::string_view() const { return View; }
 
     /// @}
     /// @name String Predicates
@@ -288,7 +279,7 @@ namespace llvm {
     /// \returns The index of the first occurrence of \p C, or npos if not
     /// found.
     [[nodiscard]] size_t find(char C, size_t From = 0) const {
-      return std::string_view(*this).find(C, From);
+      return View.find(C, From);
     }
 
     /// Search for the first character \p C in the string, ignoring case.
diff --git a/llvm/lib/Support/StringRef.cpp b/llvm/lib/Support/StringRef.cpp
index 4f5fcb4857e805..ba45a625c0a8db 100644
--- a/llvm/lib/Support/StringRef.cpp
+++ b/llvm/lib/Support/StringRef.cpp
@@ -216,9 +216,7 @@ size_t StringRef::rfind_insensitive(char C, size_t From) const {
 ///
 /// \return - The index of the last occurrence of \arg Str, or npos if not
 /// found.
-size_t StringRef::rfind(StringRef Str) const {
-  return std::string_view(*this).rfind(Str);
-}
+size_t StringRef::rfind(StringRef Str) const { return View.rfind(Str); }
 
 size_t StringRef::rfind_insensitive(StringRef Str) const {
   size_t N = Str.size();
@@ -251,7 +249,7 @@ StringRef::size_type StringRef::find_first_of(StringRef Chars,
 /// find_first_not_of - Find the first character in the string that is not
 /// \arg C or npos if not found.
 StringRef::size_type StringRef::find_first_not_of(char C, size_t From) const {
-  return std::string_view(*this).find_first_not_of(C, From);
+  return View.find_first_not_of(C, From);
 }
 
 /// find_first_not_of - Find the first character in the string that is not

@MaskRay
Copy link
Member

MaskRay commented Dec 3, 2024

Seems that there is no conclusion on the approach. #113775 is reverted
https://discourse.llvm.org/t/migrating-llvm-stringref-to-std-string-view/82785

@dwblaikie
Copy link
Collaborator

Seems that there is no conclusion on the approach. #113775 is reverted https://discourse.llvm.org/t/migrating-llvm-stringref-to-std-string-view/82785

As mentioned in that thread, I think it's still good to converge the APIs, even if they never get deduplicated.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants