[ADT] Add a single-character version of the small vector split routine
[oota-llvm.git] / lib / Support / StringRef.cpp
index ddece087a9e7114a1ab8fdaa01eadef9096ebc84..f2e587cb527759b7e8fbbc27291f7f16228a24cd 100644 (file)
@@ -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
 //===----------------------------------------------------------------------===//