diff options
author | Chandler Carruth <chandlerc@gmail.com> | 2015-09-10 06:07:03 +0000 |
---|---|---|
committer | Chandler Carruth <chandlerc@gmail.com> | 2015-09-10 06:07:03 +0000 |
commit | 477121721bd8b103d2785f5fdf3f110e54dc0e54 (patch) | |
tree | e76a7e758f6b8bc8af9fb60afdea53e5a03f4d9b /llvm/lib/Support/StringRef.cpp | |
parent | 93d5d3b5dbf9c01b60c41136482668e38e5a3806 (diff) | |
download | bcm5719-llvm-477121721bd8b103d2785f5fdf3f110e54dc0e54.tar.gz bcm5719-llvm-477121721bd8b103d2785f5fdf3f110e54dc0e54.zip |
[ADT] Add a single-character version of the small vector split routine
on StringRef. Finding and splitting on a single character is
substantially faster than doing it on even a single character StringRef
-- we immediately get to a *very* tuned memchr call this way.
Even nicer, we get to this even in a debug build, shaving 18% off the
runtime of TripleTest.Normalization, helping PR23676 some more.
llvm-svn: 247244
Diffstat (limited to 'llvm/lib/Support/StringRef.cpp')
-rw-r--r-- | llvm/lib/Support/StringRef.cpp | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/llvm/lib/Support/StringRef.cpp b/llvm/lib/Support/StringRef.cpp index ddece087a9e..f2e587cb527 100644 --- a/llvm/lib/Support/StringRef.cpp +++ b/llvm/lib/Support/StringRef.cpp @@ -294,6 +294,26 @@ void StringRef::split(SmallVectorImpl<StringRef> &A, A.push_back(rest); } +void StringRef::split(SmallVectorImpl<StringRef> &A, char Separator, + int MaxSplit, bool KeepEmpty) const { + StringRef rest = *this; + + // rest.data() is used to distinguish cases like "a," that splits into + // "a" + "" and "a" that splits into "a" + 0. + for (int splits = 0; + rest.data() != nullptr && (MaxSplit < 0 || splits < MaxSplit); + ++splits) { + std::pair<StringRef, StringRef> p = rest.split(Separator); + + if (KeepEmpty || p.first.size() != 0) + A.push_back(p.first); + rest = p.second; + } + // If we have a tail left, add it. + if (rest.data() != nullptr && (rest.size() != 0 || KeepEmpty)) + A.push_back(rest); +} + //===----------------------------------------------------------------------===// // Helpful Algorithms //===----------------------------------------------------------------------===// |