8 #ifndef OUTPUT_FORMAT_HELPER_H
9 #define OUTPUT_FORMAT_HELPER_H
12 #include <string_view>
14 using namespace std::literals;
33 : mDefaultIndent{indent}
37 operator std::string_view() const& {
return {mOutput}; }
39 auto size()
const {
return mOutput.size(); }
45 void InsertAt(
const size_t atPos, std::string_view data) { mOutput.insert(atPos, data); }
52 void SetIndent(
const unsigned indent,
const SkipIndenting skipIndenting = SkipIndenting::No)
54 mDefaultIndent = indent;
56 if(SkipIndenting::No == skipIndenting) {
57 Indent(mDefaultIndent);
65 mDefaultIndent = rhs.mDefaultIndent;
67 if(SkipIndenting::No == skipIndenting) {
68 Indent(mDefaultIndent);
76 bool empty()
const {
return mOutput.empty() or (std::string::npos == mOutput.find_first_not_of(
' ', 0)); }
84 void Append(
const char c) { mOutput += c; }
86 void Append(
const std::string_view& arg) { mOutput += arg; }
111 if constexpr(0 <
sizeof...(args)) {
133 if constexpr(0 <
sizeof...(args)) {
134 AppendComment(
StrCat(args...));
146 void AppendParameterList(
const ArrayRef<ParmVarDecl*> parameters,
147 const NameOnly nameOnly = NameOnly::No,
148 const GenMissingParamName genMissingParamName = GenMissingParamName::No);
155 if(mDefaultIndent >= SCOPE_INDENT) {
156 mDefaultIndent -= SCOPE_INDENT;
172 void CloseScope(
const NoNewLineBefore newLineBefore = NoNewLineBefore::No);
177 CloseScope(newLineBefore);
193 template<
typename... Args>
196 if constexpr(0 <
sizeof...(args)) {
221 for(
OnceFalse needsComma{};
const auto& arg : arguments) {
222 if constexpr(std::is_same_v<
const TemplateArgument&, decltype(arg)>) {
223 if((TemplateArgument::Pack == arg.getKind()) and (0 == arg.pack_size())) {
228 AppendComma(needsComma);
238 static constexpr
unsigned SCOPE_INDENT{2};
239 unsigned mDefaultIndent{};
240 std::string mOutput{};
242 void Indent(
unsigned count);
246 Indent(mDefaultIndent);
void StrCat(std::string &ret, const auto &... args)