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
This commit is contained in:
Daniel Dunbar 2009-08-11 20:47:15 +00:00
parent 0a31d2f645
commit 0ad7f9bb2f
2 changed files with 54 additions and 15 deletions

View 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));
}
/// @}

View 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