From 0ad7f9bb2f806387e53ffeaf6a564b9a80b962af Mon Sep 17 00:00:00 2001 From: Daniel Dunbar Date: Tue, 11 Aug 2009 20:47:15 +0000 Subject: [PATCH] StringRef: Add find(char) and find(StringRef). 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 | 62 +++++++++++++++++++++++++-------- unittests/ADT/StringRefTest.cpp | 7 ++++ 2 files changed, 54 insertions(+), 15 deletions(-) diff --git a/include/llvm/ADT/StringRef.h b/include/llvm/ADT/StringRef.h index e24fe05e7cd..b239e3b886b 100644 --- a/include/llvm/ADT/StringRef.h +++ b/include/llvm/ADT/StringRef.h @@ -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 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)); } /// @} diff --git a/unittests/ADT/StringRefTest.cpp b/unittests/ADT/StringRefTest.cpp index e7498cca1b0..972201c1ff0 100644 --- a/unittests/ADT/StringRefTest.cpp +++ b/unittests/ADT/StringRefTest.cpp @@ -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