[PATCH] D47406: [ADT] Add `StringRef::rsplit(StringRef Separator)`.
Henry Wong via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Thu Jun 7 08:18:15 PDT 2018
MTC updated this revision to Diff 150335.
MTC added a comment.
This update consists of two parts
- Make `rsplit(char)` reuse `rsplit(StringRef)`.
- Make `split(char)` reuse `split(StringRef)`.
Do I need to divide the patch into two parts? One is to add `rsplit(StringRef)`, the other is to refactor `rsplit(char)` and `split(char)`.
Repository:
rL LLVM
https://reviews.llvm.org/D47406
Files:
include/llvm/ADT/StringRef.h
unittests/ADT/StringRefTest.cpp
Index: unittests/ADT/StringRefTest.cpp
===================================================================
--- unittests/ADT/StringRefTest.cpp
+++ unittests/ADT/StringRefTest.cpp
@@ -181,6 +181,17 @@
Str.rsplit('l'));
EXPECT_EQ(std::make_pair(StringRef("hell"), StringRef("")),
Str.rsplit('o'));
+
+ EXPECT_EQ(std::make_pair(StringRef("he"), StringRef("o")),
+ Str.rsplit("ll"));
+ EXPECT_EQ(std::make_pair(StringRef(""), StringRef("ello")),
+ Str.rsplit("h"));
+ EXPECT_EQ(std::make_pair(StringRef("hell"), StringRef("")),
+ Str.rsplit("o"));
+ EXPECT_EQ(std::make_pair(StringRef("hello"), StringRef("")),
+ Str.rsplit("::"));
+ EXPECT_EQ(std::make_pair(StringRef("hel"), StringRef("o")),
+ Str.rsplit("l"));
}
TEST(StringRefTest, Split2) {
Index: include/llvm/ADT/StringRef.h
===================================================================
--- include/llvm/ADT/StringRef.h
+++ include/llvm/ADT/StringRef.h
@@ -725,10 +725,7 @@
/// \returns The split substrings.
LLVM_NODISCARD
std::pair<StringRef, StringRef> split(char Separator) const {
- size_t Idx = find(Separator);
- if (Idx == npos)
- return std::make_pair(*this, StringRef());
- return std::make_pair(slice(0, Idx), slice(Idx+1, npos));
+ return split(StringRef(&Separator, 1));
}
/// Split into two substrings around the first occurrence of a separator
@@ -749,6 +746,24 @@
return std::make_pair(slice(0, Idx), slice(Idx + Separator.size(), npos));
}
+ /// Split into two substrings around the last occurrence of a separator
+ /// string.
+ ///
+ /// If \p Separator is in the string, then the result is a pair (LHS, RHS)
+ /// such that (*this == LHS + Separator + RHS) is true and RHS is
+ /// minimal. If \p Separator is not in the string, then the result is a
+ /// pair (LHS, RHS) where (*this == LHS) and (RHS == "").
+ ///
+ /// \param Separator - The string to split on.
+ /// \return - The split substrings.
+ LLVM_NODISCARD
+ std::pair<StringRef, StringRef> rsplit(StringRef Separator) const {
+ size_t Idx = rfind(Separator);
+ if (Idx == npos)
+ return std::make_pair(*this, StringRef());
+ return std::make_pair(slice(0, Idx), slice(Idx + Separator.size(), npos));
+ }
+
/// Split into substrings around the occurrences of a separator string.
///
/// Each substring is stored in \p A. If \p MaxSplit is >= 0, at most
@@ -796,10 +811,7 @@
/// \return - The split substrings.
LLVM_NODISCARD
std::pair<StringRef, StringRef> rsplit(char Separator) const {
- size_t Idx = rfind(Separator);
- if (Idx == npos)
- return std::make_pair(*this, StringRef());
- return std::make_pair(slice(0, Idx), slice(Idx+1, npos));
+ return rsplit(StringRef(&Separator, 1));
}
/// Return string with consecutive \p Char characters starting from the
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D47406.150335.patch
Type: text/x-patch
Size: 2966 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180607/633cdaec/attachment.bin>
More information about the llvm-commits
mailing list