StringRef: Add find(char) and find(StringRef).
authorDaniel Dunbar <daniel@zuster.org>
Tue, 11 Aug 2009 20:47:15 +0000 (20:47 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Tue, 11 Aug 2009 20:47:15 +0000 (20:47 +0000)
Also, regroup functions.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@78712 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/ADT/StringRef.h
unittests/ADT/StringRefTest.cpp

index e24fe05e7cd342ccf17662c1f1104afb04c8c86c..b239e3b886bf7126bfa128ca91bc966e0fca53d9 100644 (file)
@@ -123,7 +123,50 @@ namespace llvm {
     }
 
     /// @}
-    /// @name Utility Functions
+    /// @name String Predicates
+    /// @{
+
+    /// startswith - Check if this string starts with the given \arg Prefix.
+    bool startswith(const StringRef &Prefix) const { 
+      return substr(0, Prefix.Length).equals(Prefix);
+    }
+
+    /// endswith - Check if this string ends with the given \arg Suffix.
+    bool endswith(const StringRef &Suffix) const {
+      return slice(size() - Suffix.Length, size()).equals(Suffix);
+    }
+
+    /// @}
+    /// @name String Searching
+    /// @{
+
+    /// find - Search for the character \arg C in the string.
+    ///
+    /// \return - The index of the first occurence of \arg C, or npos if not
+    /// found.
+    size_t find(char C) const {
+      for (size_t i = 0, e = Length; i != e; ++i)
+        if (Data[i] == C)
+          return i;
+      return npos;
+    }
+
+    /// find - Search for the string \arg Str in the string.
+    ///
+    /// \return - The index of the first occurence of \arg Str, or npos if not
+    /// found.
+    size_t find(const StringRef &Str) const {
+      size_t N = Str.size();
+      if (N > Length)
+        return npos;
+      for (size_t i = 0, e = Length - N + 1; i != e; ++i)
+        if (substr(i, N).equals(Str))
+          return i;
+      return npos;
+    }
+
+    /// @}
+    /// @name Substring Operations
     /// @{
 
     /// substr - Return a reference to the substring from [Start, Start + N).
@@ -167,21 +210,10 @@ namespace llvm {
     /// \param Separator - The character to split on.
     /// \return - The split substrings.
     std::pair<StringRef, StringRef> split(char Separator) const {
-      iterator it = std::find(begin(), end(), Separator);
-      if (it == end())
+      size_t Idx = find(Separator);
+      if (Idx == npos)
         return std::make_pair(*this, StringRef());
-      return std::make_pair(StringRef(begin(), it - begin()),
-                            StringRef(it + 1, end() - (it + 1)));
-    }
-
-    /// startswith - Check if this string starts with the given \arg Prefix.
-    bool startswith(const StringRef &Prefix) const { 
-      return substr(0, Prefix.Length).equals(Prefix);
-    }
-
-    /// endswith - Check if this string ends with the given \arg Suffix.
-    bool endswith(const StringRef &Suffix) const {
-      return slice(size() - Suffix.Length, size()).equals(Suffix);
+      return std::make_pair(slice(0, Idx), slice(Idx+1, npos));
     }
 
     /// @}
index e7498cca1b0c53c587b6fd7b45531076db94f064..972201c1ff0751d829b277bd94681956ac2e9749 100644 (file)
@@ -87,6 +87,13 @@ TEST(StringRefTest, Utilities) {
   raw_string_ostream OS(Storage);
   OS << StringRef("hello");
   EXPECT_EQ("hello", OS.str());
+
+  EXPECT_TRUE(Str.find('l') == 2);
+  EXPECT_TRUE(Str.find('z') == StringRef::npos);
+  EXPECT_TRUE(Str.find("helloworld") == StringRef::npos);
+  EXPECT_TRUE(Str.find("hello") == 0);
+  EXPECT_TRUE(Str.find("ello") == 1);
+  EXPECT_TRUE(Str.find("zz") == StringRef::npos);
 }
 
 } // end anonymous namespace