summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Dunbar <daniel@zuster.org>2009-08-11 20:47:15 +0000
committerDaniel Dunbar <daniel@zuster.org>2009-08-11 20:47:15 +0000
commit0ad7f9bb2f806387e53ffeaf6a564b9a80b962af (patch)
treee5e52a07f3fc5d958c9f0671e42c48c23fba87c9
parent0a31d2f6456069adba19b8aeca66c68b633c38b4 (diff)
downloadllvm-0ad7f9bb2f806387e53ffeaf6a564b9a80b962af.tar.gz
llvm-0ad7f9bb2f806387e53ffeaf6a564b9a80b962af.tar.bz2
llvm-0ad7f9bb2f806387e53ffeaf6a564b9a80b962af.tar.xz
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
-rw-r--r--include/llvm/ADT/StringRef.h62
-rw-r--r--unittests/ADT/StringRefTest.cpp7
2 files changed, 54 insertions, 15 deletions
diff --git a/include/llvm/ADT/StringRef.h b/include/llvm/ADT/StringRef.h
index e24fe05e7c..b239e3b886 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<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));
}
/// @}
diff --git a/unittests/ADT/StringRefTest.cpp b/unittests/ADT/StringRefTest.cpp
index e7498cca1b..972201c1ff 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