return Result;
}
+/// A helper class to return the specified delimiter string after the first
+/// invocation of operator StringRef(). Used to generate a comma-separated
+/// list from a loop like so:
+///
+/// \code
+/// SubsequentDelim SD;
+/// for (auto &I : C)
+/// OS << SD << I.getName();
+/// \end
+class SubsequentDelim {
+ bool First = true;
+ StringRef Delim;
+
+ public:
+ SubsequentDelim(StringRef Delim = ", ") : Delim(Delim) {}
+ operator StringRef() {
+ if (First) {
+ First = false;
+ return {};
+ }
+ return Delim;
+ }
+};
+
} // end namespace llvm
#endif // LLVM_ADT_STRINGEXTRAS_H
if (Indexes) OS << '\t';
// Don't indent(2), align with previous line attributes.
OS << "; predecessors: ";
- for (auto I = pred_begin(), E = pred_end(); I != E; ++I) {
- if (I != pred_begin())
- OS << ", ";
- OS << printMBBReference(**I);
- }
+ SubsequentDelim SD;
+ for (auto *Pred : predecessors())
+ OS << SD << printMBBReference(*Pred);
OS << '\n';
HasLineAttributes = true;
}
if (Indexes) OS << '\t';
// Print the successors
OS.indent(2) << "successors: ";
+ SubsequentDelim SD;
for (auto I = succ_begin(), E = succ_end(); I != E; ++I) {
- if (I != succ_begin())
- OS << ", ";
- OS << printMBBReference(**I);
+ OS << SD << printMBBReference(**I);
if (!Probs.empty())
OS << '('
<< format("0x%08" PRIx32, getSuccProbability(I).getNumerator())
if (!Probs.empty() && IsStandalone) {
// Print human readable probabilities as comments.
OS << "; ";
+ SubsequentDelim SD;
for (auto I = succ_begin(), E = succ_end(); I != E; ++I) {
const BranchProbability &BP = getSuccProbability(I);
- if (I != succ_begin())
- OS << ", ";
- OS << printMBBReference(**I) << '('
+ OS << SD << printMBBReference(**I) << '('
<< format("%.2f%%",
rint(((double)BP.getNumerator() / BP.getDenominator()) *
100.0 * 100.0) /
if (Indexes) OS << '\t';
OS.indent(2) << "liveins: ";
- bool First = true;
+ SubsequentDelim SD;
for (const auto &LI : liveins()) {
- if (!First)
- OS << ", ";
- First = false;
- OS << printReg(LI.PhysReg, TRI);
+ OS << SD << printReg(LI.PhysReg, TRI);
if (!LI.LaneMask.all())
OS << ":0x" << PrintLaneMask(LI.LaneMask);
}
EXPECT_EQ(std::to_string(MinInt64), itostr(MinInt64));
EXPECT_EQ(std::to_string(MaxInt64), itostr(MaxInt64));
}
+
+TEST(StringExtras, SubsequentDelim) {
+ SubsequentDelim SD;
+ StringRef S = SD;
+ EXPECT_EQ(S, "");
+ S = SD;
+ EXPECT_EQ(S, ", ");
+
+ SubsequentDelim SD2(" ");
+ S = SD2;
+ EXPECT_EQ(S, "");
+ S = SD2;
+ EXPECT_EQ(S, " ");
+}